1. 程式人生 > >Linux X86-64下編寫彙編程式

Linux X86-64下編寫彙編程式

最近對底層比較感興趣,重新學習了組合語言。主要從彙編的角度能夠更好的理解程式的執行機制,便於以後對上面封裝,抽象出的高階語言有個追本溯源的認識。下面是一個範例程式。

寫程式之前我們需要先看看對應系統下的系統呼叫對應的立即數

[[email protected] asmwork]$    cat /usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9
#define __NR_mprotect 10
#define __NR_munmap 11
#define __NR_brk 12
#define __NR_rt_sigaction 13
#define __NR_rt_sigprocmask 14
#define __NR_rt_sigreturn 15
#define __NR_ioctl 16
....
#define __NR_fork 57
#define __NR_vfork 58
#define __NR_execve 59
#define __NR_exit 60
...

global main

section .data
        query_string : db "Enter a character: "
        query_string_len : equ $ - query_string
        out_string : db "You hava input: "
        out_string_len : equ $ - out_string

section .bss
        in_char :    resw 4

section .text

main:
        mov rax, 1   ;syscall need this parameter, diaplay write
        mov rdi, 1           ; stdout
        mov rsi, query_string  ; syscall invoke return rsi to get string
        mov rdx, query_string_len ; get the string length from rdx
        syscall

        mov rax, 0   ;read 
        mov rdi, 0   ;stdin
        mov rsi, in_char
        mov rdx, 2
        syscall

        mov rax, 1
        mov rdi, 1
        mov rsi, out_string
        mov rdx, out_string_len
        syscall

        mov rax, 1
        mov rdi, 1
        mov rsi, in_char
        mov rdx, 2
        syscall
        mov rax, 1
        mov rdi, 1
        mov rsi, out_string
        mov rdx, out_string_len
        syscall

        mov rax, 1
        mov rdi, 1
        mov rsi, in_char
        mov rdx, 2
        syscall

        mov rax, 60
        mov rdi, 0
        syscall


          

下面編譯執行

[[email protected] asmwork]$ nasm -f elf64 test.asm
[[email protected] asmwork]$  gcc -o test test.o


[[email protected] asmwork]$ ./test
Enter a character: 4
You hava input: 4