2

16 進数を 10 進数に変換するアセンブリ コード (linux 80x86 nasm) があります。

    my_func:
    push    ebp
    mov ebp, esp    ; Entry code - set up ebp and esp
    pusha           ; Save registers
    mov dword[LC1],0
    mov ecx,dword[ebp+8]    ; Get argument (pointer to string)

start_loop:
    mov ebx,0       ;zero ebx register
    mov eax,16
    mov edx,0
    mov bl, byte[ecx]   ;bl is the curr number
    jmp bl_to_num   ;change it to be a number

continue:
    add dword[LC1], ebx ;dword[LC1] = dword[LC1]+ebx
    inc ecx
    cmp byte[ecx],0
    je  end_func

    mul dword[LC1]  ;dword[LC1]*eax = edx:eax
    mov     dword[LC1],eax

    jmp start_loop

dword[LC1] は C 関数に返す引数で、ecx は受け取った文字列へのポインタです。関数: bl_to_num bl バイトを数値 (a=10、b=11..) に変換するだけです。このコードを入力 1 で実行すると、出力 234 が返されます。入力 2 でこのコードを実行すると、出力 250. など .. エラーはどこにありますか? ありがとう!

編集: これは bl_to_num です:

bl_to_num:
    cmp bl,'A'
    je  con_a
    cmp bl,'a'
    je  con_a

    cmp bl,'B'
    je  con_b
    cmp bl,'b'
    je  con_b

    cmp bl,'C'
    je  con_c
    cmp bl,'c'
    je  con_c

    cmp bl,'D'
    je  con_d
    cmp bl,'d'
    je  con_d

    cmp bl,'E'
    je  con_e
    cmp bl,'e'
    je  con_e

    cmp bl,'F'
    je  con_f
    cmp bl,'f'
    je  con_f

    sub bl,48
    jmp continue
con_a:
      mov   bl,10
      jmp   continue
con_b:
      mov   bl,11
      jmp   continue
con_c:
      mov   bl,12
      jmp   continue
con_d:
      mov   bl,13
      jmp   continue
con_e:
      mov   bl,14
      jmp   continue
con_f:
      mov   bl,15
      jmp   continue
4

1 に答える 1