0

整数を 10 進数の 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

何時間もそれを見つめていない人が、私が間違っていることを教えてくれますか?

4

1 に答える 1

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
于 2013-08-24T12:27:15.727 に答える