Linux程序集x86 |试图获取堆栈值,语法错误

时间:2015-08-14 05:52:29

标签: linux assembly x86

我一直在使用x86机器上的linux程序集, 基本上我的问题是:我已经将几个值推入堆栈,将堆栈指针移动到基指针中,并将值8移动到寄存器中以获得推送值,最后我想获取值并将其放入% ebx系统调用所以我会得到值,但似乎得到一个错误。不知道为什么。 错误是:注册后的垃圾 njev: 3 x: array([ 0., 0., 0.]) nit: 3 status: 0 message: 'Optimization terminated successfully.' jac: array([ 1.5, 50. , 30. , 0. ]) success: True fun: 0.0 nfev: 15 例如:

(%ebp)

2 个答案:

答案 0 :(得分:0)

我认为问题的一部分可能是x86堆栈实际上向下,而不是向上。你正在添加基础指针,这是一个垃圾,你必须从中减去它。我没有x86机器,所以我无法对此进行测试,但您是否尝试了类似movl -%edx(%ebp),%ebx的内容?

哎呀,我扭转了脑海中操作数的方向。在这种情况下,您的堆栈如下所示:

1952 - ???
1948 - 20
1944 - 50                  <- ebp  <- esp

因此,当你选择ebp+8时,你不会得到20,你得到地址1952,而你却不知道它包含的内容。

答案 1 :(得分:0)

查看https://stackoverflow.com/tags/x86/info中的链接。我最近更新了它们,并添加了有关使用gdb到单步asm。

的信息

你是什么意思“得到错误”?分段故障?语法错误? (正常语法是(%ebp, %edx)。只有数字常量位移超出了parens,例如-4(%ebp, %edx)

另外,如果您要使用堆栈帧指针,请在mov %esp, %ebp push之后执行您要保留的任何寄存器,但在将args推送到任何函数之前打电话。但是,根本不需要那样使用%ebp。我认为,自4.4以来,gcc默认为-fomit-frame-pointer。如果您正在推送/弹出内容,它可以更容易地跟踪您的局部变量。

你可能只想从64位asm开始,而不是搞乱过时的x86 args-on-the-stack ABI。

这让我想到你的代码可能出了什么问题。你可能会遇到一个段错误。 (但你没有说它是不是,语法错误,还是别的什么。)因为你可能在64位模式下构建代码。 Build a 32bit binary,或更改您的代码以使用%rsp

你可能只想从64位asm开始,而不是搞乱过时的x86 args-on-the-stack ABI。

这让我想到你的代码可能出了什么问题。你可能会遇到一个段错误。 (但你没有说它是不是,语法错误,还是别的什么。)因为你可能在64位模式下构建代码。 Build a 32bit binary,或更改您的代码以使用%rsp