生成代表给定二进制数的十进制值的字符串

时间:2019-03-26 00:49:16

标签: assembly x86 nasm

我正在尝试将c和nasm链接起来。 C程序向我发送了一个代表32位数字的字符串(例如“ 000 ... 0011”)。我需要使用C的printf%s将其值打印为字符串(上面的示例为字符串“ 3”)。

注意:为了让生活更轻松,我现在将忽略负数的情况。

我是nasm的新手,所以我几乎不知道哪里出了问题。我尝试将给定的字符串转换为数字,将其存储在某个地方,然后打印出来,但这只是打印二进制表示形式。

这是我的代码:

.rodata section
    format_string: db "%s", 10, 0   ; format string

.bss section
    an: resb 12     ; enough to store integer in [-2,147,483,648 (-2^31) : 2,147,483,647 (2^31-1)]
convertor:
    push ebp
    mov ebp, esp    
    pushad          

    mov ecx, dword [ebp+8]  ; get function argument (pointer to string)

    mov eax, 1                  ; initialize eax with 1 - this will serve as a multiplier
    mov dword [an], 0           ; initialize an with 0
ecx_To_an:
        cmp eax, 0                  ; while eax != 0
        jz done                     ; do :
        shr dword [ecx], 1          ;
        jnc carry_flag_not_set      ; if carry isn't set, lsb was 0
        add [an], eax               ; else - lsb was 1 - an += eax 
carry_flag_not_set:
        shl eax, 1                  ; eax = eax*2
        jmp ecx_To_an               ; go to the loop
done:
    push an         ; call printf with 2 arguments -  
    push format_string  ; pointer to str and pointer to format string
    call printf

鉴于我无法更改为%s赋予的printf参数,我看不到如何打印int值。

我们将不胜感激。

0 个答案:

没有答案