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與彙編程式的約定呼叫
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- 深入iOS系統底層之程式中的彙編程式碼iOS
- 植物大戰殭屍,用QT注入程式碼,AT&T彙編語法QT
- X86 定址方式、AT&T 組合語言相關知識、AT&T 與 Intel 組合語言的比較、gcc 嵌入式彙編組合語言IntelGC
- Linux之系統故障彙總Linux
- Linux系統程式設計(2)——檔案與IO之系統呼叫與檔案IO操作Linux程式設計
- 系統呼叫篇——總結與提升
- 逆向之彙編筆記筆記
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- linux系統程式設計之檔案與IO(二):系統呼叫read和writeLinux程式設計
- iOS呼叫系統功能與跳轉到系統設定iOS
- 學習筆記分享之彙編---2.彙編指令/語法筆記
- xenomai核心解析之雙核系統呼叫(一)AI
- C與彙編(NASM) (1)ASM
- 系統呼叫,上下文切換及中斷概念的彙總
- linux系統程式設計之檔案與IO(五):stat()系統呼叫獲取檔案資訊Linux程式設計
- C++ 反彙編:關於函式呼叫約定C++函式
- 從彙編角度分析C語言的過程呼叫C語言
- 彙編作業系統MenuetOS準備釋出1.0版作業系統
- 使用DbgHelp獲取函式呼叫堆疊之inline assembly(內聯彙編)法函式inline
- dup()系統呼叫
- Windows 系統呼叫Windows
- iOS彙編入門教程(三)彙編中的 Section 與資料存取iOS
- 彙編眼中的函式呼叫引數傳遞以及全域性與區域性變數與“基址”函式變數
- Linux系統命令彙總之系統備份常用命令(轉)Linux
- Android呼叫系統分享的坑與救贖Android
- 編輯推薦之《推薦系統》
- C程式函式呼叫&系統呼叫C程式函式
- 系統呼叫篇——SSDT
- Lec 04 系統呼叫
- 【作業系統2】作業系統啟動過程與異常/中斷,系統呼叫作業系統
- linux系統程式設計之檔案與IO(四):目錄訪問相關係統呼叫Linux程式設計
- Linux系統與Windows系統的不同之處LinuxWindows
- 彙編學習筆記之轉移指令筆記