您的位置:首页 > 运维架构 > Linux

Linux 内核学习—AT&T汇编语法格式

2019-07-29 11:42 78 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Antonio_Salieri/article/details/97631195

AT&T汇编语法格式

  1. 寄存器引用
    引用寄存器要在寄存器号前加%,如:
    mov % eax, % ebx

  2. 操作数顺序
    操作数排列是从左到右,如:
    mov % eat(源), % ebx(目的)

  3. 常数/立即数格式
    使用立即数,要在数前面加$,如:
    Mov 4,引用符号地址在符号前加4, % ebb 引用符号地址在符号前加4,引用符号地址在符号前加,如:
    mov $value, % ebb

  4. 跳转
    绝对转移和调用指令(jmp/call)的操作数前要加上“*”做前缀
    远转移和远调用指令写作:‘ljmp’, ‘lcall’
    ljmp $section, $offset == jmp far section:offset
    lcall $section, $offset == call far section:offset
    lret $stack_adjust == ret far stack_adjust

  5. 寻址方式
    section:[base + index * scale +disp]
    section:disp(base, index, scale)
    exm:
    movl array(, %eax, 4), %eax == mov eax, [eax * 4 + array]

嵌入式格式
Intel —— asm(“asm statements”: outputs : inputs :registers-modified);
Outputs表示在这段代码结束后,输出的寄存器哪个
Inputs 是在本段代码执行之前,这段汇编代码用到的参数
Registers-modified 在本段代码中,会被修改的寄存器

a, b, c, d分别表示寄存器eax, ebx, ecx, edx
Int main()
{
Int a1 = 10, b1 = 0;
asm(“movl %1, %%eax;\n\r” //把ebx中的内容,赋给eax
“movl %%eax, %ecx;”
:”=a”(b1) //把输出寄存器中的内容,赋给b1
:”b”(a1) //把a1当中的内容,付给ebx寄存器
:”%eax”); //会改变的寄存器
printf(“Result: %d, %d\n”, a1, b1);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: