使用 div 和 mod 后打印编号 - MASM 不工作

Print Number After using div and mod -not working MASM

我正在尝试编写一个程序来获取包含数字的字符串,并将函数获取的数字的数字总和放入 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

我真的不明白为什么它不起作用以及如何让它起作用。 有人可以解释我吗? 对不起,我的英语不好。 感谢您的帮助。

消除崩溃:

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.

专注于 SomeFunc

  • 在使用此函数之前,您应该清除 Sum2。不这样做只能希望幸运1次
  • 您想除以 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 个字符的字符串的指针。