2013-08-24 190 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