assembly - 在 NASM 中的 scanf 之前推入堆栈时发生分段错误
问题描述
下面的代码是使用 scanf 和 printf 读写单个浮点数的汇编代码。
extern scanf
extern printf
section .data
x dq 0.0
fmts db "%lf", 0
fmtp db "%lf", 0xA, 0
section .bss
section .text
global main
main:
push rbp
;push rax
;push rax
mov rdi, fmts ;scanf format
mov rsi, x ;The address of the variable
call scanf
mov rdi, fmtp ;printf format
movq xmm0, qword[x] ;The value of the variable
mov rax, 1
call printf
Exit:
pop rbp
mov rax, 1
mov rbx, 0
int 0x80
(要编译和运行这段代码,它是最容易使用的gcc
:)
nasm -f elf64 ./a.asm && gcc -o ./a a.o -no-pie && ./a
此代码工作正常;但是当我们取消注释其中push rax
一行时,就会发生分段错误。但是,如果我们取消注释这两push rax
行,它将再次正常工作。看来我们要么不应该将任何东西压入堆栈,要么至少 128 位。值得一提的是,压入堆栈的变量的值(在本例中为rax
,)将保持不变。
有人可以解释这种行为吗?提前致谢。
解决方案
推荐阅读
- c - 为什么我生成的 .a 静态库包含对我个人计算机的路径/引用?
- python - Python 循环代码不会与求解器代码一起打印,可能还有其他问题吗?
- java - 如何使用嵌套 for 循环的输出值作为同一个 for 循环的新输入值?
- c++ - 使用glfw,opengl时ImGui的问题
- javascript - 如果触发条件,我如何隐藏元素?
- javascript - 如何以编程方式格式化开始和结束标签之间的文本,然后删除标签
- python - 如何从 JSON 数据框中仅读取特定列?
- java - 如何从 java.net.HttpClient 请求的响应中获取 http 状态消息
- image-processing - Otsu 算法、Canny 边缘和 HOG 用于文件夹中的多个图像
- django - Django Country State City Chained Dropdown