Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么';len equ$-aa';不';是否在汇编(emu8086)中的源地址中工作?_Assembly_Emu8086 - Fatal编程技术网

Assembly 为什么';len equ$-aa';不';是否在汇编(emu8086)中的源地址中工作?

Assembly 为什么';len equ$-aa';不';是否在汇编(emu8086)中的源地址中工作?,assembly,emu8086,Assembly,Emu8086,它的工作原理如下: data segment aa db 22h, 22h, 22h len = $-aa ends stack segment dw 128 dup(0) ends code segment start: mov ax, data mov ds, ax mov es, ax mov si, offset aa mov [si+len],al mov al,[si+len]

它的工作原理如下:

data segment
    aa db 22h, 22h, 22h
    len = $-aa    
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov es, ax

    mov si, offset aa

    mov [si+len],al
    mov al,[si+len]   


    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

当源地址中出现
len
时,源地址将编译为
len
的值(3)

但当我更改数据段中的
len
时:

MOV [SI]+03H, AL 
MOV AL, 03H (This is wrong)
它将正常工作:

len = 3

为什么?

看起来像是一个汇编程序错误——你在用什么汇编程序?嗯,让我们考虑一下。aa只有3个元素,所以aa+3不是aa的元素之一,它是aa之后的第一个值,即
len
,即3。@DavidWohlferd:是的,代码有缺陷,即使它没有正确组装,但EMU8086显然也有缺陷。
mov-al,[si+len]
不可能装配到
mov-al,03H
。如果您一直在使用emu8086而不是更好的汇编程序,那么您可能可以使用
字节ptr[si+len]
或其他方法来解决汇编程序错误。@Chris Dodd:我使用的是“emu8086-汇编程序和微处理器模拟器v4.05”。这只是一个猜测。将寄存器作为寻址模式的一部分应该已经排除了直接源。如果可能的话,使用更好的、无缺陷的、汇编程序,比如MASM。(我更喜欢NASM语法,但MASM和TASM的语法与emu8086兼容。)
MOV [SI]+03H, AL
MOV AL, [SI]+03H