intel式とgas式のひじょう~に簡単な対応表です. gasの場合, ソースの名前は***.sではなく***.Sにしてください. 後者ではC言語の強力なプリプロセッサが介在するためいろいろな機能が使えます. gasの場合も参照して下さい.
| intel形式 | gas形式 |
|---|---|
| 主な疑似命令 | |
| code segment ... code ends | .text |
| data segment ... data ends | .data |
| align 4 | .align 4 |
| WX equ 5 | WX=5 |
| if ... else ... endif | .if ... .else ... . endif |
| public function | .globl function |
| ニーモニック一般 | |
| mov eax, ecx | movl %ecx, %eax |
| mov ax, 5 | movw $5, %ax |
| mov eax, WX | movl $WX, %eax |
| mov ch, -24 | movb $-24, %ch |
| mov eax, [esp+4] | movl 4(%esp), %eax |
| [mem+eax+ecx*4] | mem(%eax, %ecx, 4) |
| [mem+ecx*2] | mem(,%ecx, 2) |
| push ds | pushl %ds |
| cbw | cbtw |
| cwde | cwtl |
| cwd | cwtd |
| cdq | cltd |
| データーの指定方法 | |
| mem1: db 5 | mem1: .byte 5 |
| mem2: dw 12 | mem2: .word 12 |
| mem3: dd 13 | mem3: .long 13 |
| mem4: dq 20 | mem4: .quad 20 |
| mes: db 'Hello' | mes: .ascii "Hello" |
| vmem: db 512 dup(255) | vmem: .fill 512,1,255 |
| buf: dd 100 dup(10) | buf: .fill 100,4,10 |
その他 gasに移植することを予定しているのなら, MASM形式で有効なfadd (=faddp st,st(1) )やfmulは 使わない方がいいです. 混乱する原因となります(経験者は語る).
;for MASM
CLIP macro reg, X
local L1
cmp reg, X
jb L1
mov reg, X-1
L1:
endm
localというのはこの命令内でのみ有効と言う意味です.
//for gas
#define CLIP(reg, X) \
cmpl $X, %reg;\
jb 1f;\
movl $X-1, %reg;\
1:
1fというのはすぐ次のラベルへの前方参照という意味です. すぐ前のラベルへの参照は1bと書きます. 細かい分岐がたくさんあるときにラベル名を考えなくてすむので便利です. 残念ながらNASMにはありません. tasmだと使えるのに...
[追記:2010/6/29] gasのmacro命令を使う方法を教えていただきました. ありがとうございました.
.macro CLIP REG, X
cmpl \X, %\REG
jp 1f
movl $\X-1, %\REG
1:
.endm
func:
CLIP eax, 5