64位AT&T汇编语言调用自己编写的两个数相加函数,使用printf输出,发现报错Segmentation fault

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810uname -r看到内核版本是3.10.0-957.el7.x86_64gcc --version可以看到gcc版本是12.2.0gdb --version可以看到gdb版本是12.1
64位AT&T汇编语言调用自己编写的两个数相加函数,使用printf输出,发现报错Segmentation fault_第1张图片

twoNumberPlus.s里边的内容如下:

.type twoNumberPlus, @function
.section .data
      intFormatShow:
          .ascii "%d\n\0"
 .global main
 .section .text
    main:
         pushq %rbp
         movq %rsp,%rbp
         movq $2,%rdi
         movq $3,%rsi
         call twoNumberPlus

         movq %rax,%rsi
         movq $intFormatShow,%rdi
         movq $0,%rax
         call printf

         movq $60,%rax
         movq $0,%rdi
         movq %rbp,%rsp
         popq %rbp
         syscall
    twoNumberPlus:
         pushq %rbp
         movq %rsp,%rbp
         addq %rdi,%rsi
         movq %rsi,%rax
         movq %rbp,%rsp
         popq %rbp

gcc twoNumberPlus.s -static -o twoNumberPlus进行编译。
./twoNumberPlus执行,发现报错Segmentation fault
64位AT&T汇编语言调用自己编写的两个数相加函数,使用printf输出,发现报错Segmentation fault_第2张图片
gcc -g twoNumberPlus.s -static -o twoNumberPlus带有调试信息编译,然后使用gdb -q twoNumberPlus进行调试。
在这里插入图片描述
gdb命令行里边输入run运行程序,却发现应该显示函数名的地方,却显示?? (),看了https://stackoverflow.com/questions/40475306/why-doesnt-gdb-show-line-numbers-or-function-names才发现自己的代码把一些栈给破坏了,这部分破坏的栈正好包括gdb知道程序所在位置的信息。
在这里插入图片描述

自己看了《x64汇编语言》这本书105页,才发现,原来是忘记在twoNumberPlus函数最后写上ret这条指令了,正确的代码如下:

.type twoNumberPlus, @function
.section .data
      intFormatShow:
          .ascii "%d\n\0"
 .global main
 .section .text
    main:
         pushq %rbp
         movq %rsp,%rbp
         movq $2,%rdi
         movq $3,%rsi
         call twoNumberPlus

         movq %rax,%rsi
         movq $intFormatShow,%rdi
         movq $0,%rax
         call printf

         movq $60,%rax
         movq $0,%rdi
         movq %rbp,%rsp
         popq %rbp
         syscall
    twoNumberPlus:
         pushq %rbp
         movq %rsp,%rbp
         addq %rdi,%rsi
         movq %rsi,%rax
         movq %rbp,%rsp
         popq %rbp
         ret

gcc twoNumberPlus.s -static -o twoNumberPlus进行编译。
./twoNumberPlus执行,得出正确的结果5
64位AT&T汇编语言调用自己编写的两个数相加函数,使用printf输出,发现报错Segmentation fault_第3张图片

你可能感兴趣的:(汇编语言,linux,汇编)