汇编源代码
demo.asm
.globl fun
fun:
movl $0, %eax
jmp .L2
.L3:
addq (%rdi), %rax
movq 8(%rdi),%rdi
.L2:
testq %rdi, %rdi
jne .L3
rep; ret
main.asm
.LC0:
.string "%ld\n"
.globl main
main:
.LFB0:
pushq %rbp
movq %rsp, %rbp
subq $80, %rsp
movq %fs:40, %rax ;stack_guard,此域可被用于作检测栈是否被破坏
movq %rax, -8(%rbp)
xorl %eax, %eax
movq $10, -64(%rbp)
leaq -64(%rbp), %rax
addq $16, %rax
movq %rax, -56(%rbp)
movq $20, -48(%rbp)
leaq -64(%rbp), %rax
addq $32, %rax
movq %rax, -40(%rbp)
movq $42, -32(%rbp)
movq $0, -24(%rbp)
leaq -64(%rbp), %rax
movq %rax, %rdi
call fun@PLT
movq %rax, %rsi
leaq .LC0(%rip), %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
movq -8(%rbp), %rdx
xorq %fs:40, %rdx ;stack_guard,此域可被用于作检测栈是否被破坏
je .L10
call __stack_chk_fail@PLT
.L10:
leave
ret
编译成.o目标文件
#as 是 gcc 的自带的汇编器
as demo.s main.s -o main.o
链接成可执行文件
ld main.o -lc -I/lib64/ld-linux-x86-64.so.2 -e main
-lc 链接 C 库 printf 那些
–I/lib64/ld-linux-x86-64.so.2 指定装载二进制代码的解释器
-e main 指定入口函数
三个参数一定要写对,否则无法链接成功