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