首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从程序集中调用C函数(printf)时出现段错误

从程序集中调用C函数(printf)时出现段错误
EN

Stack Overflow用户
提问于 2013-03-23 00:43:56
回答 2查看 1.3K关注 0票数 0

我正在linux上使用NASM编写一个基本的汇编程序,该程序调用C库中的函数(printf)。不幸的是,我在这样做的时候遇到了一个分段错误。注释掉对printf的调用允许程序运行时没有错误。

代码语言:javascript
复制
; Build using these commands:
;   nasm -f elf64 -g -F stabs <filename>.asm 
;   gcc <filename>.o -o <filename>
;

SECTION .bss    ; Section containing uninitialized data

SECTION .data   ; Section containing initialized data

  text db "hello world",10 ; 

SECTION .text   ; Section containing code


global main

extern printf

;-------------
;MAIN PROGRAM BEGINS HERE
;-------------

main:



      push rbp

      mov rbp,rsp

      push rbx

      push rsi

      push rdi ;preserve registers

      ****************


      ;code i wish to execute

      push text ;pushing address of text on to the stack
      ;x86-64 uses registers for first 6 args, thus should have been:
      ;mov rdi,text (place address of text in rdi)
      ;mov rax,0 (place a terminating byte at end of rdi)

      call printf ;calling printf from c-libraries

      add rsp,8 ;reseting the stack to pre "push text"

      **************  

      pop rdi ;preserve registers

      pop rsi

      pop rbx

      mov rsp,rbp

      pop rbp

      ret
EN

回答 2

Stack Overflow用户

发布于 2013-03-23 00:57:23

对于前6个参数,x86_64不使用堆栈。您需要将它们加载到适当的寄存器中。它们是:

代码语言:javascript
复制
rdi, rsi, rdx, rcx, r8, r9

我用来记住前两个的诀窍是把函数想象成实现为rep movsbmemcpy

票数 3
EN

Stack Overflow用户

发布于 2013-03-23 00:48:21

您正在调用一个varargs函数-- printf需要一个可变数量的参数,并且您必须在参数堆栈中考虑到这一点。查看此处:http://www.csee.umbc.edu/portal/help/nasm/sample.shtml#printf1

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

https://stackoverflow.com/questions/15575647

复制
相关文章

相似问题

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