我一直在使用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)
答案 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
。