您的位置:首页 > 其它

AT&&T汇编格式

2011-01-10 12:06 309 查看
寄存器引用

引用寄存器要在寄存器前面加%如 mov %eax %eb

操作数顺序

操作数的排列是从源(左)到目的(右),如mov %eax(源), %ebx(目的)

常熟/立即数的格式

使用立即数,要在数前面加上$,如mov $4, %ebx

符号常数直接引用 如 mov value, %ebx

引用符号地址在符号前加$, 如 mov $value, %ebx

操作数长度

操作数的长度用加在指令后面的符号表示:

b(byte), w(word), l(long) 如 movw %ax,%bx

在AT&T汇编格式中,绝对转移和调用指令(jmp/call)的操作数前要加上*作为前缀



远转移指令和远调指令的操作码,在AT&T汇编格式中为"ljmp"和"lcall",而在intel格式中则为"jmp far" 和 "call far"

AT&T格式

ljmp $section, $offset

lcall $section, $offset

Intel格式

jmp far section:offset

call far section:offset

远程回指令

lret $stack_adjust

ret far stack_adjust

寻址方式

section:disp(base, index, scale)表示,计算方法是

base + index*scale + disp

section:[base + index*scale +disp]

movl -4(%ebp), %eax mov eax, [ebp - 4]

movl array(, %eax, 4), %eax mov eax, [eax*4 + array]

movw array(%ebx, %eax, 4), %cx mov cx, [ebx + 4*eax + array]

movb $4, %fs:(%eax) mov fs:eax, 4

C嵌入汇编

_asm_("asm statements" : outputs: inputs : registers-modified);


_asm_("pushl %%eax /n/t"
"movl $0, %%eax /n/t"
"popl %eax"
{register char _res;/
asm("push %%fs/n/t"
"movw %%ax,%%fs/n/t"
"movb %%fs:%2,%%al/n/t"
"pop %%fs"
:"=a(_res) :"0"(seg),"m"(*(addr));/
_res;}


int main() {
int a1 = 10, b1 = 0;
_asm_("movl %1, %%eax;//n//r"
"movl %%eax, %%ecx;"
:"=a"(b1)
:"b"(a1)
:"%eax");
printf("Result:%d, %d//n",a1,b1);}


"a","b","c","d" 分别表示寄存器eax,ebx,ecx和edx

"S"和"D" 寄存器esi,edi

"r" 任何寄存器

"0" 与上一条语相同的寄存器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: