0

文字列を整数 (数値) に変換する際に問題があります。文字列の値が 255 以下の場合にのみ正しい変換が行われます (例: port db "255",0x0)。整数値が 255 より大きい場合 (例: port db "256",0x0)、結果はオーバーフローします。コード例は次のとおりです。

section .bss
    PORT resw 1

section .data
    port db "256",0x0

section .text
    global _start
_start:
    pusha
    ;reset eax,ebx,edx to 0
    xor eax, eax
    xor ebx, ebx
    xor edx, edx
    .loop:
        ;compare *port+edx against 0x0; pointer arithmetic?
        cmp BYTE [port + edx], 0x0
        je .exit
        ;copy port[edx] to bl
        mov bl, BYTE [port + edx]
        ;substract '0' (48) to get 'real' integer
        sub bl, '0'
        ;each cycle multiply by 10
        imul eax, 10
        ;add ebx (not bl as eax is 32bit) to eax
        add eax, ebx
        inc edx
        jmp .loop
    .exit:
        ;convert port value to big-endian value
        shl eax, 8 
        mov [PORT], eax
    popa
    mov eax, 1
    int 0x80

前述したように、[PORT] に格納される値は切り捨てられます。[PORT] の値が 0 になりました... シフト命令 (shl eax, 8) を適用しないと、値は 1 になります。

ばかげたことを見落としたり、知識が不足している可能性があります。誰かがこのコードの何が問題なのか説明できますか?

ありがとう

4

0 に答える 0