2015-06-14 49 views
0

假设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 

回答

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都不是地址。

+0

谢谢Ross,那很有帮助。有没有办法打印符号常量? – user1232138

+1

不在你的程序中,没有。符号只存在于您的源代码中,而不是程序中。 –

+0

如何使用_textstr TEXTEQU%60 * 60 * 60_或_textstr TEXTEQU%SecondsInDay_ – user1232138