6 个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;

3 个控制寄存器:%cr0,%cr2,%cr3;

6 个 debug 寄存器:%db0,%db1,%db2,%db3,%db6,%db7;

2 个测试寄存器:%tr6,%tr7;

8 个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),

%st(7).

4. 操作数顺序

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

5, 符号常数

符号常数直接引用 如

value: .long 0x12a3f2de

movl value , %ebx

指令执行的结果是将常数 0x12a3f2de 装入寄存器 ebx。

引用符号地址在符号前加符号$, 如“movl $value, % ebx”则是将符号 value 的地址装入

寄存器 ebx。

6. 内存引用

Intel 语法的间接内存引用的格式为:

section:[base+index*scale+displacement]

而在 AT&T 语法中对应的形式为:

section:displacement(base,index,scale)

其 中 , base 和 index 是 任 意 的 32-bit base 和 index 寄 存 器 。 scale 可 以 取 值

1,2,4,8。如果不指定 scale 值,则默认值为 1。section 可以指定任意的段寄存器作

为段前 缀,默认的段寄存器在不同的情况下不一样。如果你在指令中指定了默认的段前缀

则编译器在目标代码中不会产生此段前缀代码。

下面是一些例子:

-4(%ebp) : base=%ebp , displacement=-4 , section 没 有 指 定 , 由 于 base

=%ebp,所以默认的 section=%ss,index,scale 没有指定,则 index 为 0。

foo(,%eax,4):index=%eax,scale=4,displacement=foo。其它域没有指定。这

里默认的 section=%ds。

foo(,1):这个表达式引用的是指针 foo 指向的地址所存放的值。注意这个表达式中没有

base 和 index,并且只有一个逗号,这是一种异常语法,但却合法。

%gs:foo:这个表达式引用的是放置于%gs 段里变量 foo 的值。

如果 call 和 jump 操作在操作数前指定前缀“ *”,则表示是一个绝对地址调用/跳转,也就

是说 jmp/call 指令指定的是一个绝对地址。如果没有指定"*",则操作数是一个相对地址。

任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸

(byte,word,long),也就是说必须带有指令后缀(b,w,l)。

1,内联汇编。

两种内联汇编的格式。

一、基本内联汇编的格式是

__asm__ __volatile__("Instruction List");

二、带有 C/C++表达式的内联汇编格式为:

__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);

规则:

1,这 4 个部分都不是必须的,任何一个部分都可以为空。

2,如 果 Clobber/Modify 为 空 , 则 其 前 面 的 冒 号 (:) 必 须 省 略 。 比 如 __asm__("mov %

%eax, %%ebx" : "=b"(foo) : "a"(inp) : ) 就 是 非 法 的 写 法 ; 而 __asm__("mov %

%eax, %%ebx" : "=b"(foo) : "a"(inp) )则是正确的。

3,"Instruction List"中的寄存器写法要遵守相关规定,比如寄存器前必须使用两个百分号(%%),

而不是像基本汇编格式一样在寄存器前只使用一个百分号(%)。比如 __asm__( " mov %%eax, %%ebx" : : );

__asm__( " mov %%eax, %%ebx" : ) 和 __asm__( " mov %eax, %ebx" ) 都 是 正 确 的 写 法 , 而

__asm__( " mov %eax, %ebx" : : );__asm__( " mov %eax, %ebx" : )和__asm__(

" mov %%eax, %%ebx" )都是错误的写法。

4,区分一个内联汇编是基本格式的还是带有 C/C++表达式格式的,其规则在于在"Instruction List"后

是否有冒号(:)的存在,如果没有则是基本格式的,否则,则是带有 C/C++表达式格式的。

5,ouput:

例子:

int func(void)

{

int b = -1;

__asm__ __volatile__(

"movl $2,%%eax"

:"=a"(b)

);

printf("--------------->%d\n",b);

return 0;

}

我们可以很清楚得看到这个输出操作由两部分组成:括号括住 的部分 (b)和引号引

住的部分"=a"。这两部分都是每一个输出操作必不可少的。其中括号里面的是c/c++

表达式,而且只能是左值表达式。而右值来自于引用部分。引号中的内容,被称作

“操作约束”(Operation Constraint),在这个例子中操作约束为"=a",它包含两个约束:

等号(=)和字母 a,其中等号(=)说明括号中左值表达式b是一个 Write-Only 的,只能够

被作为当前内联汇编的输入,而不能作为输入。而字母 a 是寄存器 EAX / AX / AL 的

简写,说明 cr0 的值要从 eax 寄存器中获取,也就是说b = eax。

6,input.

理解了output,再来理解input很容易。

__asm__("movl %0, %%db7" : : "a" (cpu->db7));

括号里面的是c/c++表达式,可以是左值,也可以是右值。

引号里面的是寄存器。寄存器作为左值。

att汇编教程 linux,ATT 汇编语法相关推荐

  1. att汇编教程 linux,att 汇编 helloworld

    博主在 archlinux x86_64 下测试, gcc版本 Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/g ...

  2. lajp linux教程,linux IMX6 汇编点亮一个LED灯

    驱动Linux引脚与驱动STM32其实是一样的,都是在操作寄存器,在相应的寄存器上附上相应的值即可驱动. IMX6U手册上有各个管脚的命名,跟STM32不同,IOMUXC_SW_MUC_CTL_PAD ...

  3. linux 汇编 教程,Linux下实现 MASM汇编

    sudo apt-get install dosbox 步骤二:打开DOSbox,模拟C盘,在DOSbox输入 mount c /home/bao/ms-dos c 后面为自己指定的Linux下的目录 ...

  4. linux 编译汇编,linux下的汇编教程

    linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...

  5. Linux下ARM汇编教程

    转载:http://blog.csdn.net/denlee/article/details/2501182 第一部分 Linux下ARM汇编语法 尽管在Linux下使用C或C++编写程序很方便,但汇 ...

  6. Linux汇编教程04:寻址方式

    Linux汇编教程04:寻址方式 这一节,我们主要来讨论寻址方式,这一点十分重要. 我们上一节有稍微提了一下,内存地址引用的通用格式: 地址或偏移(%基址寄存器, %索引寄存器, 比例因子 ) 结果地 ...

  7. 性能比拼!超详细的Tengine GEMM矩阵乘法汇编教程

    点击我爱计算机视觉标星,更快获取CVML新技术 Tengine 是OPEN AI LAB 针对前端智能设备开发的软件开发包,核心部分是一个轻量级,模块化,高性能的AI 推断引擎,并支持用DLA.GPU ...

  8. 64位汇编之linux系统调用

    linux系统中64位汇编和32位汇编的系统调用主要有以下不同: (1)系统调用号不同.比如x86中sys_write是4,sys_exit是1:而x86_64中sys_write是1, sys_ex ...

  9. 汇编为什么分段执行总是执行不了_iOS汇编教程(六)CPU 指令重排与内存屏障...

    系列文章 iOS 汇编入门教程(一)ARM64 汇编基础 iOS 汇编入门教程(二)在 Xcode 工程中嵌入汇编代码 iOS 汇编入门教程(三)汇编中的 Section 与数据存取 iOS 汇编教程 ...

最新文章

  1. SAP WM中阶为多个TR创建了Group后将TR从Group里删除?
  2. php reverseShell
  3. IDEA万能快捷键,你不知道的17个实用技巧!!!
  4. Java 7之基础 - 强引用、弱引用、软引用、虚引用
  5. 计算机网络安全六要素,六要素教学在计算机网络教学中的探索与反思
  6. DNS 服务器地址大全
  7. druid 非对称加密_springboot配置文件中mysql的密码进行加密
  8. bzoj3190 [JLOI2013]赛车 半平面交
  9. javascript 遍历数组的常用方法(迭代、for循环 、for… in、for…of、foreach、map、filter、every、some,findindex)
  10. php产品管理系统,企业商品进销存管理系统
  11. word使用学习总结
  12. NRF24L01使用
  13. FT230X芯片的国产化替代
  14. 线性代数学习笔记4-1:线性方程组的数学和几何意义、零空间/解空间/核
  15. uhs3内存卡有哪些_存储卡的读写速度的区别:class 10,UHS-1(U1 U3),UHS-3
  16. 小米一元流量magisk_小米手机官方REC装面具(magisk)教程
  17. 解决tomcat安装配置后localhost 打不开
  18. Octave4.4.1-64位下载
  19. pip install mysqlclient安装
  20. Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化

热门文章

  1. 第一百三十五期:如何模拟一次阿里双11秒杀场景的实现?程序员必看
  2. html:(2):制作第一个网页和html和css的关系
  3. lwip+freeRTOS 无法ping通的解决方案
  4. 树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】
  5. c++中计算2得n次方_《一元二次方程》单元试卷,从中总结出5个考点,初三学生应知道...
  6. Linux环境安装zookeeper3.5.5后,总是启动不了
  7. Mvc NuGet 数据迁移
  8. python学习之wxPython
  9. Linq(03)基础之Orderby group-by
  10. app.config数据库路径问题