如何在程序集中将31位设置为1的无符号双字加数,这样它就不会被视为负数?

时间:2011-01-17 15:41:02

标签: assembly masm32

我想在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

谢谢大家!

1 个答案:

答案 0 :(得分:1)

在这个级别,有符号和无符号实际上是相同的,除了乘法和除法指令,所以这里的加法没有错。

我能想到的可能问题:

  1. ebx中真正添加的结果吗?关于哪个操作数是目标寄存器存在很大的混淆,因为广泛使用有两种不同的约定? (即使这是问题的一部分,但它并没有真正解释结果,因为这会给出5,而不是负数,但仍然......)

  2. this forum post讨论了udw2str中的实施问题。

  3. 您使用pbuf作为输出缓冲区,但这还不够大。您依靠汇编程序在buffer之前将其放在内存中。

  4. print或许是clobber ebx?

  5. 此时我会拔出我可信赖的调试器并单步完成代码。