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 在宏中传递偏移量差或常量_Assembly_Emu8086 - Fatal编程技术网

Assembly 在宏中传递偏移量差或常量

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指令的地址替换

这是大学作业,所以必须使用emu8086。没有emu8086.inc

假设我有

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=equale
testvar
被传递,并且ax仍然等于0。如果我在任何宏之外执行
mov ax,testvar
,它将获得co更正值噢!差点忘了。只有在常量定义中使用$时,该值才会丢失。如果在使用位置对$求值,它是否会等于$以外的值。不幸的是=对我也不起作用。我希望以null结尾的字符串对赋值有效。令人惊讶的是,它也不起作用。当传递给宏。我会回到家中再次检查它。可能是宏定义本身有问题吗?如果我是你,我会尝试的第一件事是不要使用阴影全局符号名称的宏参数名称(例如,您有一个名为
msglen1
eq
和一个名为
msglen1
的宏参数-如果您在宏中写入
mov ax,msglen1
,那么汇编器应该使用哪些
msglen1
呢?).正如我所说,这只是为了举例。我在实际代码中没有阴影。最短的代码是一个带有
var
参数和
mov ax,var
的单行宏。an=equale
testvar
被传递,并且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