2012-02-02 2 views
2

int에서 &t 구문을 사용하여 어셈블리 프로그램에서 작업하고 있습니다.아스키에 대한 어셈블리 번호

내가 잃어버린 이유는, 레지스터의 정수를 ASCII 숫자로 어떻게 변환합니까?

숫자 10을 변환하고 숫자 10을 % eax 레지스터에 넣을 것입니다. 숫자 48을 % eax에 추가하면 아스키 기호는 다음과 같이 표시됩니다.

1에 48을 추가하고 48에 10을 추가합니다. 어떻게 할 수 있습니까?

샘플 코드 :

mov $10, %eax 
#Cut the number in some way. 
add $48, %eax 
+0

관련 : http://stackoverflow.com/questions/4953506/why-does-my-code-display-rubbish/4954659#4954659 –

+0

다른 : http://stackoverflow.com/questions/9113060/print-decimal-in-8086-emulator –

답변

5

숫자를 ASCII로 변환하려면 숫자를 10으로 나눠서 나머지를 결과로 사용해야합니다. 그런 다음 ASCII '0'을 추가하고 결과 숫자를 저장하십시오. 그런 다음 몫이 0에 도달 할 때까지 몫과 동일하게 반복하십시오.

그러나 이것은 최하위 숫자부터 역순으로 숫자를 제공합니다. 예를 들어 스택을 사용하여 순서를 바꿀 수 있습니다. 각 숫자를 스택으로 밀어 넣은 다음 팝업하여 문자열 버퍼에 저장합니다. (테스트하지)이 같은

뭔가 :

.DATA 
    strResult db 16 dup (0) ; string buffer to store results 

.CODE 
    mov eax, number  ; number to be converted 
    mov ecx, 10   ; divisor 
    xor bx, bx   ; count digits 

divide: 
    xor edx, edx  ; high part = 0 
    div ecx    ; eax = edx:eax/ecx, edx = remainder 
    push dx    ; DL is a digit in range [0..9] 
    inc bx    ; count digits 
    test eax, eax  ; EAX is 0? 
    jnz divide   ; no, continue 

    ; POP digits from stack in reverse order 
    mov cx, bx   ; number of digits 
    lea si, strResult ; DS:SI points to string buffer 
next_digit: 
    pop ax 
    add al, '0'   ; convert to ASCII 
    mov [si], al  ; write it to the buffer 
    inc si 
    loop next_digit 
+0

At line 'push dx', 실제로 edx를 누르는 것을 의미합니까? 인텔 문법에 익숙하지 않아서 혼란 스럽습니다. 나머지 edx를 스택에 푸시하는 것이 논리적 일 것입니다. – Creator13

4

는 일반적으로 당신이이 방법을 수행 할 수 있습니다

repeat 
    d = x MOD 10 
    x = x DIV 10 
    stringd = d + 48; 
    store character somewhere 
until x == 0 
print characters in reverse order 

하지만 자리가 처음 ... 어셈블리에이를 변환하는 마지막에서 것입니다 ...

+1

의사 코드 솔루션 –

+0

에 대한 +1이 의사 코드의 C 구현 : http://stackoverflow.com/a/9113669/1155000 –

관련 문제