debugging - x86 程序集中函数调用后的分段错误
问题描述
我目前正在编写一个编译器,并且我创建了一些测试,但其中只有一个失败并Segmentation fault (core dumped)
显示错误消息。
这是被编译的代码
function main(): int {
var f: int = 10;
return func(f) - func(f / 2);
}
function func(a: int): int {
return a;
}
这是生成的汇编代码(如您所见,它并没有真正优化)
section .text
global _start
_start:
call function_main
mov rdi, rax
mov rax, 60
syscall
global function_main
function_main:
push rbp
mov rbp, rsp
sub rsp, 4
mov rax, 10
mov DWORD[rbp-0], eax
mov eax, DWORD[rbp-0]
mov rdi, rax
call function_func
push rax
mov eax, DWORD[rbp-0]
mov rbx, 2
idiv rbx
mov rdi, rax
call function_func
mov rbx, rax
pop rax
sub rax, rbx
mov rsp, rbp
pop rbp
ret
global function_func
function_func:
push rbp
mov rbp, rsp
sub rsp, 4
mov DWORD[rbp-0], edi
mov eax, DWORD[rbp-0]
mov rsp, rbp
pop rbp
ret
汇编文件是用nasm -f elf64 ./test9.lv.asm -o ./test9.lv.asm.o
和编译的ld -g ./test9.lv.asm.o a.out
我曾经gdb
调试过二进制文件,似乎程序func(f)
在第一次返回后立即收到 SIGSEGV 信号。
但现在我不知道为什么会在这种情况下发生这种情况。
解决方案
推荐阅读
- wechat - 需要明确定价在 Smooch 沙盒上的运作方式
- laravel - 如何在 Laravel 中返回 gziped API 响应?
- normal-distribution - 在伽马分布中应用 3 sigma 公式?
- django-viewflow - 一个视图流任务可以有多个下一个状态转换吗?
- google-cloud-platform - 如何使用 Airflow DataprocOperator 在 Google DataProc 集群上运行 shell 脚本
- c++ - 以有效的方式在一组边中查找现有圆
- sql - 关于 SQL 语句的语法,我错过了什么?
- r - 将数据框作为参数传递给函数
- ios - 使用 ReplayKit 录制屏幕上的任何应用程序
- jquery - 如何将工具提示放置在列表的正确项目上?