64位linux 彙編

c源碼:testg.c

1 #include<stdio.h>
2
3 #define sum(a, b) a + b
4
5 int main(int argc,char **argv)
6 {
7 int num = sum(1,2);
8 printf("num =%d\n", num);
9
10 return0;
11 }
使用命令:gcc -S testg.c
寄存器:8位:al,ah

16位:ax

32位:eax

64位:rax 新增(r8-r15寄存器,低32位r8d-r15d,低16位r8w-r15w,低8位r8b-r15b)

操作符標示:8位:b

16位:w

32位:l

64位:q

1 .file "testg.c"
2 .section .rodata
3 .LC0:
4 .string "num = %d\n"
5 .text
6 .globl main
7 .type main, @function
8 main:
9 .LFB0:
10 .cfi_startproc
11 pushq %rbp
12 .cfi_def_cfa_offset16
13 .cfi_offset6, -16
14 movq %rsp, %rbp
15 .cfi_def_cfa_register6
16 subq $32, %rsp
17 movl %edi, -20(%rbp)
18 movq %rsi, -32(%rbp)
19 movl $3, -4(%rbp)
20 movl -4(%rbp), %eax
21 movl %eax, %esi
22 movl $.LC0, %edi
23 movl $0, %eax
24 call printf
25 movl $0, %eax
26 leave
27 .cfi_def_cfa7, 8
28 ret
29 .cfi_endproc
30 .LFE0:
31 .size main, .-main
32 .ident "GCC: (GNU)5.1.0"
33 .section .note.GNU-stack,"",@progbits
linux系統中64位彙編和32位彙編的系統調用主要有以下不同:

(1)系統調用號不同.比如x86中sys_write是4,sys_exit是1;而x86_64中sys_write是1, sys_exit是60。linux系統調用號實際上定義在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。
(2)系統調用所使用的寄存器不同,x86_64中使用與eax對應的rax傳遞系統調用號,但是 x86_64中分別使用rdi/rsi/rdx傳遞前三個參數,而不是x86中的ebx/ecx/edx。
(3)系統調用使用“syscall”而不是“int 80”。
人就像是被蒙着眼推磨的驢子,生活就像一條鞭子;當鞭子抽到你背上時,你就只能一直往前走,雖然連你也不知道要走到什麼時候爲止,便一直這麼堅持着。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章