我想在MASM32中添加5到3234567890。 以下是完整的示例代码:
;--------------------------------------------------------------------------
include \masm32\include\masm32rt.inc
.data
;--------------------------------------------------------------------------
.code
start:
call main ; branch to the "main" procedure
exit
main proc
local pbuf: DWORD
local buffer[32]: BYTE
mov pbuf, ptr$(buffer)
mov ecx, uval("5") ; converting string to unsigned dword and storing in ecx
mov ebx, uval("3234567890") ; converting string to unsigned dword and storing in ebx
invoke udw2str, ebx, pbuf ; converting unsigned value to string and storing results in pbuf
print pbuf, 13,10 ; everything is fine so far - 3234567890
add ecx, ebx
invoke udw2str, ebx, pbuf ; once again coverting
print pbuf, 13,10 ; negative number
ret
main endp
end start ; Tell MASM where the program ends
向unsigned dword添加内容的正确方法是什么? 现在我得到负数,预期结果是3234567895。
更新 问题确实存在于MACRO使用的某个地方。我已经将样本编辑到最低限度并且它正常工作。这里没有神秘感。 :)
;--------------------------------------------------------------------------
include \masm32\include\masm32rt.inc
.data
;--------------------------------------------------------------------------
.code
start:
call main ; branch to the "main" procedure
exit
main proc
local pbuf: DWORD
local buffer[40]: BYTE
local nNumber: DWORD
mov pbuf, ptr$(buffer)
mov ecx, 5 ; no need to convert anything at this point
mov ebx, 3234567890 ; no need to convert anything at this point
add ebx, ecx
invoke udw2str, ebx, pbuf ; now converting result in ebx to the string (pointed by pbuf)
print pbuf, 13, 10 ; printing pbuf, success
ret
main endp
end start ; Tell MASM where the program ends
谢谢大家!
答案 0 :(得分:1)
在这个级别,有符号和无符号实际上是相同的,除了乘法和除法指令,所以这里的加法没有错。
我能想到的可能问题:
是ebx
中真正添加的结果吗?关于哪个操作数是目标寄存器存在很大的混淆,因为广泛使用有两种不同的约定? (即使这是问题的一部分,但它并没有真正解释结果,因为这会给出5,而不是负数,但仍然......)
this forum post讨论了udw2str中的实施问题。
您使用pbuf
作为输出缓冲区,但这还不够大。您依靠汇编程序在buffer
之前将其放在内存中。
print
或许是clobber ebx?
此时我会拔出我可信赖的调试器并单步完成代码。