Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么我不能成功地将可变内容推送到堆栈上?_Linux_Assembly_X86_Nasm - Fatal编程技术网

Linux 为什么我不能成功地将可变内容推送到堆栈上?

Linux 为什么我不能成功地将可变内容推送到堆栈上?,linux,assembly,x86,nasm,Linux,Assembly,X86,Nasm,这只会推送一个字,而且堆栈上需要有一个dword。 你可以这样做: push word[val] 您的分段错误是因为您总共推送了6个字节,但通过add esp 8删除了8个字节 这只会推送一个字,而且堆栈上需要有一个dword。 你可以这样做: push word[val] 您的分段错误是因为您总共推送了6个字节,但通过add esp 8删除了8个字节。请编辑您的问题。选择代码并单击{}按钮将其格式化为代码。然后添加一个详细的解释,说明你试图做什么以及问题是什么。虽然你的标题中有一个问题,但

这只会推送一个字,而且堆栈上需要有一个dword。 你可以这样做:

push word[val]
您的分段错误是因为您总共推送了6个字节,但通过add esp 8删除了8个字节

这只会推送一个字,而且堆栈上需要有一个dword。 你可以这样做:

push word[val]

您的分段错误是因为您总共推送了6个字节,但通过add esp 8删除了8个字节。

请编辑您的问题。选择代码并单击{}按钮将其格式化为代码。然后添加一个详细的解释,说明你试图做什么以及问题是什么。虽然你的标题中有一个问题,但是你的代码完全没有解释。是什么让你认为你不能把东西推到堆栈上?您的代码在某种程度上失败了吗?你的预期结果是什么?有汇编程序错误吗?它们是什么?投票结束因为不清楚。调用约定要求使用32位的倍数推送参数。如果您确实需要,可以在推送之前将esp调整2,这将起作用,但不建议这样做。上述代码只需打印输入的值即可。相反,我得到了分割错误核心转储。但若我先将值移到寄存器中,然后进行堆栈,那个么它的打印就可以了。为什么?如何直接从内存推送?请编辑您的问题。选择代码并单击{}按钮将其格式化为代码。然后添加一个详细的解释,说明你试图做什么以及问题是什么。虽然你的标题中有一个问题,但是你的代码完全没有解释。是什么让你认为你不能把东西推到堆栈上?您的代码在某种程度上失败了吗?你的预期结果是什么?有汇编程序错误吗?它们是什么?投票结束因为不清楚。调用约定要求使用32位的倍数推送参数。如果您确实需要,可以在推送之前将esp调整2,这将起作用,但不建议这样做。上述代码只需打印输入的值即可。相反,我得到了分割错误核心转储。但若我先将值移到寄存器中,然后进行堆栈,那个么它的打印就可以了。为什么?如何直接从内存中推送?我只将AddESP,8更改为AddESP,6。我得到了正确的输出。我应该使用上述xor ax方法吗?@matheromqq在函数调用之前将堆栈与不可被4平均整除的边界不对齐,这在32位代码中不是一个好的做法。在本文档中,WORD指的是4字节32位值。它说参数字按相反的顺序推送到堆栈上,也就是说,C调用语法中最右边的参数具有最高的地址,保持堆栈的字对齐。所有传入参数都显示在堆栈上,位于调用方的堆栈帧中。@matheromqq:您还可以推送字0以生成66 6a 00,一个16位推送imm。或者在不归零的情况下按下ax,因为ABI不要求填充为零,IIRC。但我建议使用movzx/push,因为push[mem]已经是一条2-uop指令了。您将要调用一个函数,该函数将关闭所有已关闭的调用寄存器,因此不会出现寄存器压力。我只将add esp,8更改为add esp,6。我得到了正确的输出。我应该使用上述xor ax方法吗?@matheromqq在函数调用之前将堆栈与不可被4平均整除的边界不对齐,这在32位代码中不是一个好的做法。在本文档中,WORD指的是4字节32位值。它说参数字按相反的顺序推送到堆栈上,也就是说,C调用语法中最右边的参数具有最高的地址,保持堆栈的字对齐。所有传入参数都显示在堆栈上,位于调用方的堆栈帧中。@matheromqq:您还可以推送字0以生成66 6a 00,一个16位推送imm。或者在不归零的情况下按下ax,因为ABI不要求填充为零,IIRC。但我建议使用movzx/push,因为push[mem]已经是一条2-uop指令了。您将要调用一个函数,该函数将关闭所有被关闭的寄存器,因此不会有寄存器压力。
xor ax,ax
push ax           ;Gives a high word of zero, much like your MOVZX did.
push word[val]