AT&T彙編之32位與64位系統呼叫
檢視系統呼叫號
locate unistd_64
less /usr/include/x86_64-linux-gnu/asm/unistd_64.h
Linux 32位系統呼叫和64位系統呼叫的區別
- 系統呼叫號不同。如
sys_write
在32位下是4,在64位下是1。 - 呼叫方法不同。我們在32位下用
int 80H
中斷進行系統呼叫,而64位下需要用syscall
指令進行系統呼叫。 - 傳參方式不同。32位程式,我們將系統呼叫號傳入
eax
,呼叫引數按照ebx
,ecx
,edx
的順序寫入暫存器,系統呼叫返回值寫入eax
暫存器。而64位程式,系統呼叫號傳入rax
,而各個引數按照rdi
,rsi
,rdx
的順序寫入暫存器,系統呼叫返回值寫入rax
。
HelloWorld程式
我們的目的是在螢幕上輸出HelloWorld,在標準輸出上寫入該字串即可。
使用sys_write
系統呼叫,我們可以man 2 write
,檢視write
的傳參。
也可以直接檢視核心syscall標頭檔案:
root@wilcohuang:/usr/src# cat linux-headers-4.4.0-91/include/linux/syscalls.h | grep -C 1 'sys_write'
unsigned long vlen);
asmlinkage long sys_write(unsigned int fd, const char __user *buf,
size_t count);
第一個引數是檔案描述符,第二個引數數字符串地址,第三個引數是字串長度。
有了這些,下面通過兩個例子來展示32位和64位系統呼叫
32位
在64位環境下執行32位彙編,需要搞一些事情:
使用如下命令才能彙編:
root@wilcohuang:/data/home/wilcohuang/test-asm# as -32 -gstabs -o syscall_32.o syscall_32.asm
root@wilcohuang:/data/home/wilcohuang/test-asm# ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -lc -o syscall_32 syscall_32.o
如果你使用了上面了命令彙編完成後,執行程式報:-bash: ./syscall: cannot execute binary file: Exec format error
呵呵,我猜你肯定用了坑爹的WSL:)
root@wilcohuang:/data/home/wilcohuang/test-asm# c
;.code32 (這句可加可不加)
.section .data
message:
.ascii "Hello, World!\n"
length = . - message
.section .text
.global _start
_start:
mov $4, %eax
mov $1, %ebx
mov $message, %ecx
mov $length, %edx
int $0x80
mov $1, %eax
xor %ebx, %ebx
int $0x80
64位
.section .data
message:•
.ascii "Hello, World!\n"
length = . - message
.section .text
.global _start
_start:
nop
mov $0x1, %rax
mov $0x1, %rdi
mov $message, %rsi
movq $length, %rdx
syscall
mov $0x3c, %rax
xor %rdi, %rdi
syscall
擴充套件 rip相對定址
在x86-64模式下,新增了rip相對定址的功能,這是為了更方便的產生地址無關的程式碼。
所以,取message的地址也可以像下面這樣:
.section .data
message:•
.ascii "Hello, World!\n"
length = . - message
.section .text
.global _start
_start:
nop
mov $0x1, %rax
mov $0x1, %rdi
lea message(%rip), %rsi
movq $length, %rdx
syscall
mov $0x3c, %rax
xor %rdi, %rdi
syscall
ok,今天到此位置,回家睡覺。
相關文章
- AT&T彙編之使用C庫函式函式
- x86彙編之棧與子程式呼叫
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- 植物大戰殭屍,用QT注入程式碼,AT&T彙編語法QT
- 深入iOS系統底層之程式中的彙編程式碼iOS
- Linux之系統故障彙總Linux
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- 系統呼叫篇——總結與提升
- 逆向之彙編筆記筆記
- C與彙編(NASM) (1)ASM
- 學習筆記分享之彙編---2.彙編指令/語法筆記
- xenomai核心解析之雙核系統呼叫(一)AI
- C++ 反彙編:關於函式呼叫約定C++函式
- 系統呼叫,上下文切換及中斷概念的彙總
- 彙編眼中的函式呼叫引數傳遞以及全域性與區域性變數與“基址”函式變數
- iOS彙編入門教程(三)彙編中的 Section 與資料存取iOS
- Windows 系統呼叫Windows
- C程式函式呼叫&系統呼叫C程式函式
- 彙編
- linux之系統命令command和系統呼叫system calls及函式function之間的關係Linux函式Function
- 計算機系統6-> 計組與體系結構3 | MIPS指令集(中)| MIPS彙編指令與機器表示計算機
- Lec 04 系統呼叫
- 系統呼叫篇——SSDT
- Linux系統呼叫原理Linux
- 【作業系統2】作業系統啟動過程與異常/中斷,系統呼叫作業系統
- 從彙編視角解析函式呼叫中的堆疊運作函式
- 彙編學習筆記之轉移指令筆記
- nasm彙編ASM
- 彙編命令A
- 彙編初識與計算機組成計算機
- Linux漏洞挖掘:08---系統呼叫劫持之(通過IDT中斷向量表獲取sys_call_table系統呼叫表)Linux
- 容器編排系統之Kubernetes基礎入門
- 一個作業系統的設計與實現——第23章 快速系統呼叫作業系統
- C語言轉寫成MIPS指令集彙編以及MIPS指令集彙編中函式呼叫時棧的變化C語言函式
- 容器編排系統K8s之Prometheus監控系統+Grafana部署K8SPrometheusGrafana
- 系統呼叫篇——3環層面呼叫過程
- xenomai核心解析--雙核系統呼叫(三)--如何為xenomai新增一個系統呼叫AI
- java安全編碼指南之:Thread API呼叫規則JavathreadAPI