打印编号使用div和mod-not working MASM后

时间:2015-10-02 15:37:59

标签: assembly sum division masm32

我正在尝试编写一个程序,该程序获取包含数字的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

我真的不明白为什么它不起作用,我该如何使它工作。 有人可以解释一下吗? 对不起,我的英语不好。 谢谢你的帮助。

2 个答案:

答案 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

  • 在使用此功能之前,您应该清除 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个字符的字符串。