Linux X86-64下編寫彙編程式
阿新 • • 發佈:2018-12-17
最近對底層比較感興趣,重新學習了組合語言。主要從彙編的角度能夠更好的理解程式的執行機制,便於以後對上面封裝,抽象出的高階語言有個追本溯源的認識。下面是一個範例程式。
寫程式之前我們需要先看看對應系統下的系統呼叫對應的立即數
[[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