Assembly 在宏中传递偏移量差或常量
这是大学作业,所以必须使用emu8086。没有emu8086.inc 假设我有Assembly 在宏中传递偏移量差或常量,assembly,emu8086,Assembly,Emu8086,这是大学作业,所以必须使用emu8086。没有emu8086.inc 假设我有 msg db "Hello" msgend: msglen1 equ $ - msg msglen2 db $ - msg 然后: 所以。我不能以任何方式在宏中传递字符串的长度,除非传递在单词中分配的长度。 但是我很感兴趣,如果我能用eq常量来定义的话。使用=来定义你的equale,而不是eq eqequale的值在使用点计算,在您的情况下,这意味着msglen1中的$被mov ax,msglen1指令的地址替换
msg db "Hello"
msgend:
msglen1 equ $ - msg
msglen2 db $ - msg
然后:
所以。我不能以任何方式在宏中传递字符串的长度,除非传递在单词中分配的长度。
但是我很感兴趣,如果我能用eq常量来定义的话。使用
=
来定义你的equale,而不是eq
eq
equale的值在使用点计算,在您的情况下,这意味着msglen1
中的$
被mov ax,msglen1
指令的地址替换
=
等价物的值在定义点进行求值,在这种情况下,该值应为您提供所需的值。使用=
来定义您的等价物,而不是等价物
eq
equale的值在使用点计算,在您的情况下,这意味着msglen1
中的$
被mov ax,msglen1
指令的地址替换
=
equale的值在定义点处被求值,在这种情况下,它应该会给出您想要的值。令人惊讶的是,它也不起作用。在传递给宏时,仍为零。我回家再检查一下。可能是宏定义本身出了问题吗?如果我是你,我会尝试的第一件事是不要使用隐藏全局符号名称的宏参数名称(例如,您有一个名为msglen1
的eq
和一个名为msglen1
的宏参数-如果您在宏中写入mov ax,msglen1
,那么汇编器应该使用哪些msglen1
呢?).正如我所说,这只是为了举例。我在实际代码中没有阴影。最短的代码是一个带有var
参数和mov ax,var
的单行宏。an=equaletestvar
被传递,并且ax仍然等于0。如果我在任何宏之外执行mov ax,testvar
,它将获得co更正值噢!差点忘了。只有在常量定义中使用$时,该值才会丢失。如果在使用位置对$求值,它是否会等于$以外的值。不幸的是=对我也不起作用。我希望以null结尾的字符串对赋值有效。令人惊讶的是,它也不起作用。当传递给宏。我会回到家中再次检查它。可能是宏定义本身有问题吗?如果我是你,我会尝试的第一件事是不要使用阴影全局符号名称的宏参数名称(例如,您有一个名为msglen1
的eq
和一个名为msglen1
的宏参数-如果您在宏中写入mov ax,msglen1
,那么汇编器应该使用哪些msglen1
呢?).正如我所说,这只是为了举例。我在实际代码中没有阴影。最短的代码是一个带有var
参数和mov ax,var
的单行宏。an=equaletestvar
被传递,并且ax仍然等于0。如果我在任何宏之外执行mov ax,testvar
,它将获得co更正值噢!差点忘了。只有在常量定义中使用$时,该值才会丢失。如果在使用位置对$进行求值,它不是等于$以外的值吗。不幸的是=对我也不起作用。我希望以null结尾的字符串可以用于赋值。mov ax,msglen2
从db
加载一个字。它只有当后面的字节恰好为零时才起作用。正确的说法是错误的,您应该将长度设置为立即常数,而不是存储在内存中并加载。mov ax,msglen2
从db
加载一个字。它只会因为后面的字节恰好为零而起作用。正确的说法是错误的,并且您可以将长度设置为立即常数,而不是存储在内存中并加载。
mov ax, msgend - offset msg ; ax gets the correct length
mov ax, msglen1 ; correct length
mov ax, msglen2 ; correct length
; same names as offsets to make it clear,
; how which parameters would be passed.
; But not the same in real code.
TESTMACRO macro msg msgend msglen1 msglen2
mov ax, msg ; correct offset
mov ax, msgend ; correct offset
mov ax, msgend - offset msg ; zero length
mov ax, msglen1 ; again zero length
mov ax, msglen2 ; correct length, but it used up a word
endm