2013-08-24 239 views
0

我意識到有很多關於如何輸出十進制ASCII形式的整數的問題。我已經採取了一些代碼並根據自己的需要對其進行了修改,但不是僅僅打印數字,而是繼續打印亂碼字符,並且窗口告訴我程序停止工作。我認爲問題在於它會保持棧的彈出值,即使它應該跳出循環。下面是完整的代碼:x86彙編打印寄存器ascii

.386 
.model flat, stdcall 
option casemap :none 

include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\masm32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib 

.data 
base dd 10 
ans dd ? 

.code 
start: 
MOV ECX,3 ;I'm writing a compiler using 
PUSH ECX  ;Jack Crenshaw's "Let's Build A Compiler!" 
MOV ECX,9 ;This is just some sample output that I put in 
ADD ECX,[ESP];The answer that prints out should be 42 
PUSH ECX 
MOV ECX,2 
XOR EDX,EDX 
POP EAX 
IDIV ECX 
MOV ECX,EAX 
PUSH ECX 
MOV ECX,7 
IMUL ECX,[ESP] 

mov eax,ecx 
xor ecx,ecx 
separateDigit: 
xor edx,edx 
idiv base 
push edx 
inc ecx 
cmp eax,0 
jne separateDigit 

printDigit: 
mov ans,0 
pop ans 
dec ecx 
add ans,'0' 
invoke StdOut,addr ans 
cmp ecx,0 
jne printDigit 

invoke ExitProcess, 0 
end start 

人誰沒有被盯着它幾個小時可以插話,告訴我什麼,我做錯了什麼?

+1

你知道是否'調用StdOut'觸動你關心的任何寄存器,比如'ecx'?也許是'push ecx'之前,'invoke'之後的'pop ecx'會修復它嗎? – lurker

+0

@mbratch是的工作,謝謝。我只是在閱讀關於如何(大部分)寄存器對任何通話都是公平的遊戲,但它只是沒有點擊。 – rpatel3001

回答

0

invoke通話可能不是「註冊安全」,所以你需要保持你的ecx值:

printDigit: 
    mov ans,0 
    pop ans 
    dec ecx 
    add ans,'0' 
    push ecx  ; save ecx 
    invoke StdOut,addr ans 
    pop ecx  ; restore ecx 
    cmp ecx,0 
    jne printDigit