2013-08-24 2 views
0

Я понимаю, что есть много вопросов/ответов о том, как выводить целое число в его десятичной форме ASCII. Я взял какой-то код и модифицировал его для своих собственных нужд, но вместо того, чтобы просто печатать номер, он продолжает печатать лирические символы, а окна говорят мне, что программа перестала работать. Я думаю, проблема заключается в том, что он сохраняет значения стека, даже если он должен выйти из цикла. Вот полный код:x86 assembly print register 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' раньше, а' pop ecx' после 'invoke' исправит это? – 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