我想写一个程序,得到一个字符串,其中包含数字,并把在Sum2变量的数字,该函数得到的总和。这是我写的,但它不工作,我不知道为什么:
.386
.MODEL Flat, STDCALL
option casemap:none
SomeFunc proto :DWORD
include masm32includewindows.inc
include masm32includemsvcrt.inc
includelib masm32libmsvcrt.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
我真的不明白为什么它不起作用以及我如何使它起作用。有人能解释一下吗?对不起,我的英语不好。谢谢你的帮助。
专心于SomeFunc
- 使用此功能前,请清除Sum2。如果不这样做,你只能指望幸运一次。
- 你想除以10而不是字符串'10'
- 只要EAX不为零,就需要继续循环。
应用所有这些得到:
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个字符字符串的指针。
消除崩溃:
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