2017-05-13 14 views
1

例えば、文字列を1234を文字列に入力すると、整数1234に変換されます。 しかし、何が問題なのか分かりません。アセンブリ内の整数への文字列

%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

実行せずに解析するだけで、ロジックが間違っているように見えます。 2番目のループの反復では、eaxが1になるので、10ebx)を掛けた後に、Enter-0x0a(10dec)というアスキー値に等しい結果が得られます。

charを読んだ直後に入力値のチェックを移動する必要があります。だから私は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を分析するだけです。あなたはプログラムとデバッガを持っています。それをデバッグ!マイケル・ペッチが示唆したように、コードをステップしてレジスタを分析し、何が起きているかを確認します。

関連する問題