Я понимаю, что есть много вопросов/ответов о том, как выводить целое число в его десятичной форме 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
Может кто-то, кто не смотрел на нее в течение нескольких часов куранты и сказать мне, что я делаю неправильно?
Вы знаете ли 'вызывать StdOut' затрагивает любые регистры, вы заботитесь о, как' ecx'? Может быть, 'push ecx' раньше, а' pop ecx' после 'invoke' исправит это? – lurker
@mbratch да, что сработало, спасибо. Я просто читал о том, как (большинство из них) регистры являются честной игрой для любых вызовов, но она просто не нажала. – rpatel3001