absCallAndPrintAbsAsLd.s
里边的内容如下:
bash
.section .data
stringToShow:
.ascii "The abs of number is %d\n\0"
.global _start
.section .text
_start:
pushq %rbp
movq %rsp,%rbp
movq $-5,%rdi
call abs
movq $stringToShow,%rdi
movq %rax,%rsi
call printf
popq %rbp
movq %rax,%rdi
movq $0x3c,%rax
syscall
as -g absCallAndPrintAbsAsLd.s -o absCallAndPrintAbsAsLd.o
进行汇编。
ld -g absCallAndPrintAbsAsLd.o -o absCallAndPrintAbsAsLd -lc -I /usr/lib64/ld-linux-x86-64.so.2
进行链接。
./absCallAndPrintAbsAsLd
执行报错Segmentation fault
。
我把rsp
中的地址加上8之后,就不报错了,因为这属于平栈了。
bash
.section .data
stringToShow:
.ascii "The abs of number is %d\n\0"
.global _start
.section .text
_start:
pushq %rbp
movq %rsp,%rbp
movq $-5,%rdi
call abs
subq $8,%rsp
movq $stringToShow,%rdi
movq %rax,%rsi
call printf
addq $8,%rsp
popq %rbp
movq %rax,%rdi
movq $0x3c,%rax
syscall
as -g absCallAndPrintAbsAsLd.s -o absCallAndPrintAbsAsLd.o
进行汇编。
ld -g absCallAndPrintAbsAsLd.o -o absCallAndPrintAbsAsLd -lc -I /usr/lib64/ld-linux-x86-64.so.2
进行链接。
./absCallAndPrintAbsAsLd
执行