Protože tu uvádím příklady assembleru rozhodl jsem se něco málo
napsat o AT&T syntaxi. To je syntax assembleru, která se používala
jako standard dlouho před tím, než si intel vymyslel, že to udělá
jinak. Gcc a všechny ostatní GNU programy používají klasickou
syntaxi, protože má hodně výhod - je jednodušší na zpracování,
stejná na všech procesorech atd. Samozdřejmě že existuje převaděč z
intelí syntaxe, nebo NASM, což je assembler podobny TASMovi.
Základní rozdíly jsou:
1) pořadí operandů je obráceně. Tedy zdroj, cíl
2) před každým registrem se píše %. Před číslama .
3) za kazdým opcode následuje znak udávující velikost operandu -
b,w nebo l
4) Skoro všechny opcody jsou stejné mimo movsx a movzx, které se
píšou jako movsSD a movzSD kde S a D udávají velikost zdroje
nebi cílu. Například movswl %ax, %ecx
5) Adresace paměti se píše místo SECTION:[BASE + INDEX*SCALE + DISP]
SECTION:DISP(BASE,INDEX,SCALE). To je snad skoro všechno.
Příklady:
movw %bx, %ax (mov ax, bx)
xorl %eax, %eax (xor eax, eax)
movw 1, %ax (mov ax,1)
movb X, %ah (mov ah, byte ptr X)
movw X, %ax (mov ax, word ptr X)
movl X, %eax (mov eax, X)
cbtw (cbw)
cwtl (cwde)
cwtd (cwd)
cltd (cdq)
lcall S,O (call far S:O)
ljmp S,O (jump far S:O)
lret V (ret far V)
movl 4(%ebp), %eax (mov eax, [ebp+4])
addl (%eax,%eax,4), %ecx (add ecx, [eax + eax*4])
movb 4, %fs:(%eax) (mov fs:eax, 4)
movl _array(,%eax,4), %eax (mov eax, [4*eax + array])
movw _array(%ebx,%eax,4), %cx (mov cx, [ebx + 4*eax + array])
Je to věc zvyku. Ja už nejsem schopnej psát normálně.. tady
ještě pár odkazů na další věci v asemblíku: 1 2
výheň