2017-05-13 2 views
1

예를 들어, 문자열을 1234를 정수 1234로 입력하면 정수 1234로 변환됩니다. 그러나 1234를 입력하면 결과로 12가 나옵니다. 무슨 문제인지 모르겠다.어셈블리에서 정수로의 문자열

%include "asm_io.inc" 

segment .bss 
string resb 32 


segment .text 
global main 

main: 

    enter 0,0  ; setup stack frame 
    pusha 

    mov edx, 0 
    mov ecx, 0 
    mov ebx, 0 

repeat: call read_char 

    sub eax, 48 
    mov esi, eax 
    mov eax, ecx 
    mov ebx, 10 
    mul ebx 
    mov ecx, eax 
    add ecx, esi 
    mov byte [string+edx], al 

    cmp al, 0x0a 
    jne repeat 
    mov byte [string+edx-1], 0 

    mov eax, ecx 
    call print_int 
    call print_nl 

    popa 
    mov eax, 0 ; return value 
    leave   ; leave stack frame 
    ret 
+1

GDB는 훌륭한 디버거입니다. 유용한 기술은 디버거를 사용하여 코드를 단계별로 실행할 때 메모리와 레지스터를 볼 수 있도록하는 것입니다. –

+0

두 가지 문제가 있다고 생각합니다. 당신은'cmp al, 0x0a'을합니다. 줄 바꿈 문자를 테스트하려고 시도했지만 효과적으로 48을 빼서 _AL_을 겹쳐 썼습니다. 그래서 당신은 더 이상'read_char'에 의해 반환 된 원래 값을 비교하지 않습니다. –

답변

2

실행하지 않고 분석하면 논리가 잘못된 것처럼 보입니다. 두 번째 루프 반복에서는 eax이 1이므로 10 (ebx)을 곱한 후 Enter-0x0a (10dec)의 ascii 값과 동일한 결과를 생성합니다.

문자를 읽은 직후에 입력 값 확인을 이동해야합니다. 그래서 edx 증가 얻을 것이다 어디를 참조하지 않는 다른 문제가있을 수 있습니다 생각이

repeat: 
    call read_char 
    cmp al, 0x0a 
    je exit_loop // exit the loop if enter 
    //code as before 
    jmp repeat //jump unconditionally to the beginning of the loop 
exit_loop: 
    mov byte [string+edx-1], 0 

처럼 루프를하려고합니다.

하지만 필자가 작성한 것처럼 실제로는 실행중인 w/o를 분석하면됩니다. 당신은 프로그램과 디버거를 가지고 있습니다. 그것을 디버그하십시오! 코드를 단계별로 실행하고 레지스터를 분석하고 Michael Petch이 제안한 내용을 확인하십시오.

관련 문제