汇编读取二进制数到十进制8086(NASM)

时间:2013-04-10 21:53:43

标签: assembly x86 nasm x86-16

我不明白我做错了什么。我需要二进制计算器哪个输入格式类似于“00000001b + 00000010b ......输出也需要二进制... 运算符可以是+, - ,*,/。

我想读取第一个数字并将其转换为十进制...我的代码是这样的

%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)时程序正常工作但是当输入从零开始时它不能正常工作......

我的问题我做错了什么或我怎样才能做得更好?


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

1 个答案:

答案 0 :(得分:0)

在我看来,read_int只是返回eax读取的整数值(scanf})。我不确定为什么你期望该整数的最低有效字节为'b'(?)。

虽然我不知道您正在使用哪个scanf实现,但我还没有看到任何直接读取二进制数的内容。尽管如此,实现这些功能还是相当容易的 以下是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;
}