在汇编语言中显示符号常量

Displaying symbolic constants in Assembly Language

假设 PrintString 是一个用户定义的函数,它打印一个以 null 结尾的字符串,为什么下面的代码不打印符号常量 SecondsInDay 的值?也非常欢迎代码中的任何其他更正。

.data
SecondsInDay = 60*60*24
textstr TEXTEQU <SecondsInDay>

.code
main PROC
    call Clrscr

    mov  edx,offset SecondsInDay     ; or mov  edx,offset textstr
    call PrintString

    exit
main ENDP

END main

您的 PrintString 函数可能希望 EDX 包含一个地址,该地址指向内存中存储组成要打印的字符串的字符的位置。由于您已为 SecondsInDay 分配了一个数字,因此指令 mov edx,offset SecondsInDay 会使用该数字加载 EDX 寄存器。不是该数字的地址,也不是包含该数字的十进制表示的字符串的地址。由于 86400 可能不是有效地址,因此 PrintString 可能会崩溃。类似地,因为 textstr 是一个文本等式,它包含一个字符序列,这也不是一个有效的地址。

如果您想使用 PrintString 打印出当天的秒数,您首先必须为组成字符串的字符分配存储空间:

    .data
SecondsInDayStr DB '86400', 0 ; Zero-terminated C-style string

这既为字符串提供了内存中的位置,又为 SecondInDaysStr 分配了该位置的地址。然后您可以使用 PrintString:

将其打印出来
     mov  edx, OFFSET SecondsInDayStr
     call PrintString

请注意,符号是只有汇编器(可能还有链接器和调试器)知道的东西。当你的程序运行时,代码中指令使用的所有符号都将被它们的实际值替换。通常符号是地址(例如,程序中的符号 main)但 SecondsInDay 和 textstr 都不是地址。