【问题标题】:Calling C printf from assembly从程序集中调用 C printf
【发布时间】:2014-03-26 10:27:39
【问题描述】:

我想用两个整数从 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 函数错了?

编辑: 我加了LC1db "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 字符串,给 LC1 字符串,最后给出了分段错误。 有什么线索吗?

【问题讨论】:

  • 这不是问题,但是你应该先推eb,然后ob,因为你想从右到左推参数。
  • 我修复了反转的结果,它是原始代码,但我只是忘记重新链接(对不起......)但是段错误仍然存​​在。

标签: c nasm


【解决方案1】:

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

在您的原始代码中,您推送了 12 个字节,但仅“弹出”了 8 个字节。

在您更新的代码中,您两次推送 8 个字节,即总共 16 个字节,但只“弹出”一次 8 个字节。


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

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

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

【讨论】:

  • 请查看对新结果的编辑。这是因为我是 c-assmelby 交互的新手。我该如何纠正这个问题?
  • 您的编辑就是我所说的“您的更新代码”。我在这里谈论的是段错误,而不是你得到的值的顺序。
  • 有效!没有意识到 add esp, 8 实际上是 popping 以便组装可以继续并自行完成。我只重新输入了 1 个格式字符串,然后反向推,弹出 12 个(eb、ob 和 lc0)。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多