Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
Assembly 推堆栈时的分段错误(NASM)_Assembly_X86_Stack_Nasm_Fault - Fatal编程技术网

Assembly 推堆栈时的分段错误(NASM)

Assembly 推堆栈时的分段错误(NASM),assembly,x86,stack,nasm,fault,Assembly,X86,Stack,Nasm,Fault,我正在尝试运行nasm程序。 以下代码: segment .data contAir: dt 1.11330e-10 constOil: dt 2.33656e-10 segment .text global calc calc: mov edx, 0 push ebp ;mov ebp, esp ;mov eax, [ebp + 8] ret 在堆栈上推ebp时,我得到一个分段错误(核心转储)。为什么呢? 我正在Ubuntu虚拟机上运行这段代码。 有趣的是,有时我会出

我正在尝试运行nasm程序。 以下代码:

segment .data

contAir:    dt 1.11330e-10
constOil:   dt 2.33656e-10

segment .text

global calc

calc:

mov edx, 0
push ebp
;mov ebp, esp

;mov eax, [ebp + 8]

ret
在堆栈上推ebp时,我得到一个分段错误(核心转储)。为什么呢? 我正在Ubuntu虚拟机上运行这段代码。 有趣的是,有时我会出现“非法指令”错误

在堆栈上推ebp时,我得到一个分段错误(核心转储)。为什么呢?我正在Ubuntu虚拟机上运行这段代码。有趣的是,有时我会出现“非法指令”错误

我敢打赌,您不会在
推送
时遇到分段错误,而是在
ret
时遇到分段错误。
ret
指令所做的是从堆栈中弹出返回地址(通常由
调用
指令推送到堆栈中)并跳转到它

所以当你这样做的时候:

push ebp
ret
您实际上是跳转到存储在
ebp
中的任何地址
返回前需要平衡堆栈-即每个推类型指令都应该有一个对应的pop类型指令:

push ebp
; ... other code goes here ...
pop ebp
ret

你也在机器上编译吗?是的。这是一个使用汇编代码的C程序。但C代码在我的输出中运行良好。请您将所有源代码添加到您的问题中好吗?从技术上讲,
ret
不是退出程序并返回操作系统的正确方法。您需要使用
exit
int80
,但是既然您说的是C程序,那么您是在调用它吗?如果是这样,您需要在
ret