星期一, 8月 14, 2006

Some Practices about x86 Linux Assembly Programming

x86 Linux 上的 Assembly Programming。
語法 - 由assembler決定,如果是用最普通的,binutil附的gas,那就要follow AT&T 語法 (我們以前常用的MASM用的是intel語法)。

AT&T語法和intel語法差異蠻大的。
寫寫AT&T語法的注意事項:
  1. register 要加 % 作prefix。
  2. literature要加 $ 作prefix。
  3. 操作的順序是 : operation source destination。
  4. operation的size由加在instruction後的(b, w, l)決定。
  5. 位址計算語法是: section:disp(base, index, scale) -- target = disp+base+index*scale。
    linux是linear mode沒有(section)。
範例:

helloas.s
.data
msg : .string "Hello, world!\n"
len = . - msg
.text
.global _start

_start:
movl $len, %edx
movl $msg, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80

movl $0, %ebx
movl $1, %eax
int $0x80
先用gas (as) assembly to .o
$as -o helloas.o helloas.s
再用linker (ld) linker成 executable file
$ld -o helloas helloas.o
OK!
可以執行helloas試試。

以上範例可以看到 Linux 的 Kernel Service是由 INT 80h 提供的。
eax作service name,
ebx, ecx,....依序存放service argument。

沒有留言:

網誌存檔