0

私は何が間違っているのかわかりません。入力形式が「00000001b + 00000010b ...出力もバイナリである必要がある...演算子は+、-、*、/.

最初の数字を読み取って10進数に変換したい...私のコードは次のようなものです

%include "asm_io.inc"

segment .text
    global _asm_main
_asm_main:
    enter 0,0
    pusha


    call read_int
    cmp al,'b'
    je vypis

vypis:
    call print_int


koniec:
    popa                 ; terminate program
    mov EAX, 0
    leave
    ret

たとえば(10101010b)のように入力が1で始まる場合、プログラムは正常に動作しますが、入力が0で始まる場合は正しく動作しません...

私の質問は何を間違っているのですか、どうすればもっとうまくできますか?


print_int と read_int は既に提供されている関数で、100% で動作します ... 使用できるその他の関数は read_char、print_char、および print_string ...

read_int:
    enter   4,0
    pusha
    pushf

    lea eax, [ebp-4]
    push    eax
    push    dword int_format
    call    _scanf
    pop ecx
    pop ecx

    popf
    popa
    mov eax, [ebp-4]
    leave
    ret

print_int:
    enter   0,0
    pusha
    pushf

    push    eax
    push    dword int_format
    call    _printf
    pop ecx
    pop ecx

    popf
    popa
    leave
    ret
4

1 に答える 1

0

によって読み取られread_intた整数値 (in) を単に返すように思えます。その整数の最下位バイトが(?) であると予想する理由がわかりません。eaxscanf'b'

どの実装を使用しているかはわかりませんがscanf、2 進数を直接読み取るものは見たことがありません。ただし、その機能を自分で実装するのはかなり簡単です。
原理を示す C のサンプル コードを次に示します。

char bin[32];
unsigned int i, value;

scanf("%[01b]", bin);  // Stop reading if anything but these characters
                       // are entered.

value = 0;
for (i = 0; i < strlen(bin); i++) {
    if (bin[i] == 'b')
        break;
    value = (value << 1) + bin[i] - '0';
}
// This last check is optional depending on the behavior you want. It sets
// the value to zero if no ending 'b' was found in the input string.
if (i == strlen(bin)) {
    value = 0;
}
于 2013-04-11T05:49:05.750 に答える