在使用div和mod后-不工作的MASM



我想写一个程序,得到一个字符串,其中包含数字,并把在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

最新更新