2015-10-02 39 views
2

我正在嘗試編寫一個程序,該程序獲取包含數字的字符串,並將Sum2變量放在該函數獲得的數字的數字之和中。這是我寫的,但它不工作,我不知道爲什麼:打印數字使用div和mod後不工作MASM

.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

確切地定義什麼_「它不工作」_的意思。 – Michael

+0

@Michael - 它沒有輸出正確的數字,並在一秒鐘後崩潰。 –

回答

3

集中SomeFunc

  • 使用此功能前,應清除SUM2。如果不這樣做,你只能希望1次幸運。
  • 您想在,而不是由一個字符串「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個字符的字符串。

+0

請爲'invoke SomeFunc','123'' ;-) – rkhb

+0

添加一點,謝謝,但我已經通過使用ollydbg來修復它。 但無論如何,我會接受這個答案:) –

+0

'調用SomeFunc,'123'將變換'123'爲整數:0x00313233(十進制:3224115)並傳遞該整數。 – rkhb

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