假设PrintString是一个用户定义的函数,它打印一个空终止的字符串,为什么以下代码不会打印符号常量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
答案 0 :(得分:2)
据推测,您的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都不是地址。