我正在尝试编写一个程序,该程序获取包含数字的String,并将Sum2变量放入函数所获得的数字的位数之和。这是我写的,但它不起作用,我不知道为什么:
.386
.MODEL Flat, STDCALL
option casemap:none
SomeFunc proto :DWORD
include \masm32\include\windows.inc
include \masm32\include\msvcrt.inc
includelib \masm32\lib\msvcrt.lib
.data
Sum2 dd ?
stop db 0
fmt db '%s',0
.code
SomeFunc proc Number:DWORD
Lop:
mov eax,Number
mov ebx,'10'
xor edx,edx
div ebx
add Sum2,edx
mov Number,eax
cmp Number,0
jna Lop
ret
SomeFunc endp
start:
invoke SomeFunc,'123'
invoke crt_printf,offset Sum2,offset fmt
end start
我真的不明白为什么它不起作用,我该如何使它工作。 有人可以解释一下吗? 对不起,我的英语不好。 谢谢你的帮助。
答案 0 :(得分:3)
消除崩溃:
1)推测您要打印数字而不是字符串。所以改变
fmt db '%s',0
到
fmt db '%d',0
2)在
中更改错误的顺序和错误的偏移invoke crt_printf,offset Sum2,offset fmt ; this would be in C: printf (&Sum2,&fmt);
到
invoke crt_printf, offset fmt, Sum2
3)在最后添加一个出口:
invoke crt_exit, 0
顺便说一句:我猜SomeFunc
不会做你想做的事。但是简短答案有太多错误。使用调试器查看发生了什么。我推荐OllyDbg。
答案 1 :(得分:3)
专注于 SomeFunc
应用所有这些给出:
SomeFunc proc Number:DWORD
mov Sum2, 0
mov eax, Number
mov ebx, 10
Lop:
xor edx, edx
div ebx
add Sum2, edx
mov Number, eax
cmp eax, 0
jne Lop
ret
SomeFunc endp
请注意 SomeFunc 需要一个数字,而invoke SomeFunc,'123'
会将指针传递给一个3个字符的字符串。