Assembly 推堆栈时的分段错误(NASM)
我正在尝试运行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虚拟机上运行这段代码。 有趣的是,有时我会出
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