天天看點

Hello World——Linux彙編

采用AT&T文法。

32位: 

 1 .section .text

 2 .global _start

 3

 4 msg:

 5     .ascii "Hello World!/n"

 6 msg_end:

 7     .equ len, msg_end - msg

 8     .equ SYS_write, 4

 9     .equ SYS_exit, 1

10

11 _start:

12

13     mov $SYS_write, %eax    # system call number

14     mov $1, %ebx            # file descriptor (stdout)

15     mov $msg, %ecx          # message to write

16     mov $len, %edx          # message length.

17     int $0x80               # system call

18

19     mov $SYS_exit, %eax     # system call number

20     mov $0, %ebx            # exit (0)

21     int $0x80               # system call

64位:

 1 .section .text

 2 .global _start

 3

 4 msg:

 5     .ascii "Hello World!/n"

 6 msg_end:

 7     .equ len, msg_end - msg

 8     .equ SYS_write, 1

 9     .equ SYS_exit, 60

10

11 _start:

12

13     mov $SYS_write, %rax    # system call number

14     mov $1, %rdi            # file descriptor (stdout)

15     mov $msg, %rsi          # message to write

16     mov $len, %rdx          # message length.

17     syscall                 # previous 'int $0x80' in i386

18

19     mov $SYS_exit, %rax     # system call number

20     mov $0, %rdi            # exit (0)

21     syscall                 # previous 'int $0x80' in i386

編譯指令一樣:(假設彙編源檔案名為:hello.s)

$ as hello.s -o hello.o

$ ld hello.o -o hello

主要差別:

(1)系統調用号不同了,比如sys_write在i368中是4,x86-64中是1;sys_exit在i386中是1,而x86_64中是60;

(2)系統調用所使用的6個參數寄存器也變了,i386中分别是ebx/ecx/edx/esi/edi/ebp,x86_64中則使用rdi/rsi/rdx/r10/r8/r9,顯然不隻是“e”改成“r”那麼簡單;

(3)執行系統調用的指令,i386中使用“int 80”,而x86-64中使用“syscall”。

繼續閱讀