我对汇编语言编程很陌生,在这里我试图从我的汇编代码中调用C标准库函数库,但是我不断地出现分段错误。请帮助;操作系统:Linux16.04汇编程序: nasm : intel x86 -64位
;comiple and build:
; nasm -f elf64 -F stabs helloc.asm
; gcc -o helloC helloC.o
[SECTION .data]
msg: db "Hello C",0
[SECTION .bss]
[SECTION .text]
extern puts
global main
main:
push rsp
push dword msg
call puts
add rsp,4
pop rsp
ret发布于 2018-01-03 02:50:35
要进一步解释评论,请从x86调用约定和代码开始。
x86呼叫公约
在x86中,参数位于堆栈中。因此,基本上您的函数调用是x86方式。例如,如果您为x86构建代码,
[SECTION .data]
msg: db "Hello C",0
[SECTION .bss]
[SECTION .text]
extern puts
global main
main:
push ebp
mov ebp, esp
and esp, 0xfffffff0
sub esp, 0x10
mov DWORD PTR [esp], msg
call puts
mov esp, ebp
pop ebp
ret可能会很好。
x86-64呼叫公约
主要的区别是两件事。
因此,首先,您应该将push dword msg更改为mov rdi, msg,并且不要在调用之后清理堆栈(因为您没有将任何东西推到堆栈中)
变更后:
[SECTION .data]
msg: db "Hello C",0
[SECTION .bss]
[SECTION .text]
extern puts
global main
main:
push rbp
mov rbp, rsp
and rsp, 0xfffffffffffffff0
mov rdi, msg
call puts
mov rsp, rbp
pop rbp
ret编辑:从系统V ABI开始,调用指令堆栈应该对齐16字节.因此,push rbp对对齐有影响,但使用目的不正确。要改变这一点,请为x86和x86-64创建堆栈保存逻辑。
https://stackoverflow.com/questions/47944073
复制相似问题