从程序集中调用C printf

时间:2014-03-26 10:27:40

标签: c nasm

我想用C调用两个整数的printf函数。 我的格式字符串是:

LC0:
    db "odd bits: %d, even bits: %d", 10, 0

我有整数ob和eb:

ob: DD 0
eb: DD 0

然后我最后做了:

push dword [ob]
push dword [eb]
push LC0
call printf
add esp,8

然而,这给了我结果Odd bits: [ob], Even bits: [ob, repeated]然后给我一个分段错误。 我是否将printf函数称为错误?

编辑: 我将LC1添加为db "even bits: %d", 10 0,然后重新添加:

push dword [ob]
push LC0
call printf
push dword [eb]
push LC1
call printf
add esp, 8

这给了我一个REVERSED结果,给eb到LC0字符串,ob给LC1字符串,并且它在结尾处给出了分段错误。 任何线索?

1 个答案:

答案 0 :(得分:2)

您没有正确调整堆栈指针。

在您的原始代码中,您推送的是12个字节,但只有"弹出" 8。

在您更新的代码中,您需要两次按8个字节,即总共16个字节,但只有"弹出"一次8个字节。


关于打印值的顺序;在您的原始代码中:

push dword [ob]  
push dword [eb]
push LC0

您已将LC0声明为db "odd bits: %d, even bits: %d", 10, 0,所以很明显您打算先ob打印。参数从右向左推,因此您应该在eb之前推送ob