我正在尝试将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值。
我们将不胜感激。