首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序集实现中的分段错误

问程序集实现中的分段错误
EN

Stack Overflow用户
提问于 2017-12-22 15:45:25
回答 1查看 956关注 0票数 1

我对汇编语言编程很陌生,在这里我试图从我的汇编代码中调用C标准库函数库,但是我不断地出现分段错误。请帮助;操作系统:Linux16.04汇编程序: nasm : intel x86 -64位

代码语言:javascript
复制
;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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-03 02:50:35

要进一步解释评论,请从x86调用约定和代码开始。

x86呼叫公约

在x86中,参数位于堆栈中。因此,基本上您的函数调用是x86方式。例如,如果您为x86构建代码,

代码语言:javascript
复制
[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呼叫公约

主要的区别是两件事。

  • 当然,使用8个字节来表示地址。
  • 使用6个寄存器(rdi、rsi、rdx、rcx、r8、r9)表示前6个参数(rest位于堆栈中)

因此,首先,您应该将push dword msg更改为mov rdi, msg,并且不要在调用之后清理堆栈(因为您没有将任何东西推到堆栈中)

变更后:

代码语言:javascript
复制
[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创建堆栈保存逻辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47944073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档