本节咱们介绍下intel汇编语法和at&t汇编语法的区别。

以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说。

在Intel语法中,立即数就是普通的数字,如果让立即数成为内存地址,需要将它用中括号括起来,“[立即数]”这样才表示以“立即数”为地址的内存。

而AT&T认为,内存地址既然是数字,那数字也应该被当作内存地址,所以,数字被优先认为是内存地址,也就是说,操作数若为数字,则统统按以该数字为地址的内存来访问。这样,立即数的地位比较次要了,如果想表示成单纯的立即数,需要额外在前面加个前缀$。

无论是哪种汇编语言风格,都要有访问内存的能力,这就是内存寻址。

咱们之前学习了Intel汇编语法中的很多寻址方式,就内存寻址来说,有直接寻址,基址寻址,变址寻址,基址变址寻址。也可能是习惯了的原因,我个人觉得intel语法真的很直白,容易理解,尤其是在和AT&T的内存寻址相比较之后……

而在AT&T中的内存寻址还是挺独特的,它的内存寻址有固定的格式:

segreg(段基址):base_address(offset_address,index,size)

该格式对应的表达式为:

segreg(段基址):base_address+ offset_address+ index*size

此表达式的格式和intel 32位内存寻址中的基址变址寻址类似,intel的格式:

segreg:[base+index*size+offset]

不过与intel不同的是,AT&T地址表达式的值是内存地址,直接被当做是内存来读写,而不是普通数字。

看上去格式有些怪异,但其实这是一种“通用”格式,格式中短短的几个成员囊括了它所有内存寻址的方式,任意一种内存寻址方式,其格式都是这个通用格式的子集,都是格式中各种成员的组合。下面介绍下这些成员项。

base_address是基地址,可以为整数,变量名,可正可负。

offset_address是偏移地址,index是索引值,这两个必须是那8个通用寄存器之一。

size是个长度,只能是1、2、4、8(intel语法中也是只能乘以这4个数)。

下面看看内存寻址中有哪些方式,注意,这些方式都是上面通用格式的一部分。

直接寻址:此寻址中只有base_address项,即后面括号中的东东全不要,base_address便为内存啦,比如movl $255,0xc00008F0,或者用变量名:mov $6,var。

寄存器间接寻址:此寻址中只有offset_address项,即格式为(offset_address),要记得,offset_address只能是通用寄存器。寄存器中是地址,不要忘记格式中的圆括号。如mov (%eax), %ebx。

寄存器相对寻址:此寻址中有offset_address项和base_address项,即格式为base_address(offset_address)。这样得出的内存地址是基址+偏移地址之和。

各部分还是要按照格式填写,如movb -4(%ebx),%al,功能是将地址(ebx-4)所指向的内存复制1字节到寄存器al。

变址寻址:此类寻址称为变址的原因是含有通用格式中的变量Index。因为index是size的倍数,所以有index的地方就有size。既然是变址,只要有index和size就成了,base_address和offset_address可有可无,注意,格式中没有的部分也要保留逗号来占位。一共有4种变址寻址组合,下面各举个例子。

无base_address,无offset_address:

movl %eax,(,%esi,2)

功能是将eax的值写入esi*2所指向的内存。

无base_address,有offset_address:

movl %eax,(%ebx, %esi,2)

功能是将eax的值写入ebx+esi*2所指向的内存。

有base_address,无offset_address:

movl %eax,base_value(,%esi,2)

功能是将eax的值写入base_value+esi*2所指向的内存。

有base_address,有offset_address:

movl %eax,base_value(%ebx,%esi,2)

功能是将eax的值写入base_value+ebx+ esi*2所指向的内存。

好啦,AT&T就简单介绍到这,咱们重点是内联汇编。

一步步编写操作系统 78 intel汇编与ATT汇编语法区别相关推荐

  1. 一步步编写操作系统 65 标准调用约定stdcall 汇编实战

    因为c语言遵循的调用约定是cdecl,咱们也自然要遵守cdecl约定了.不过为了起到对比的作用,除了介绍cdecl外,也会介绍下stdcall. 既然咱们用的是调用约定是cdecl,那对它的介绍最好让 ...

  2. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  3. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  4. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  5. 一步步编写操作系统 77 内联汇编与ATT语法简介

    内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件. 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就 ...

  6. 一步步编写操作系统81 att内嵌汇编语法

    内联汇编的格式也变得让人生畏了,感觉既不像C语言,也不像汇编语言,似乎是一种中间产物,不信您看: asm [volatile] ("assembly code" : output ...

  7. 一步步编写操作系统80 扩展内联汇编1

    由于基本内联汇编功能太薄弱了,所以才对它进行了扩展以使其功能强大.不过,易用性往往与功能强弱是成正比的,如您所料,扩展内联汇编确实有点难,但在求知欲的驱使下,就让咱们痛并快乐着吧. gcc本身是个c编 ...

  8. 一步步编写操作系统 79 在c代码中内联汇编

    基本内联汇编是最简单的内联形式,其格式为: asm [volatile] ("assembly code") 各关键字之间可以用空格或制表符分隔也可以紧凑挨在一起不分隔,各部分意义 ...

  9. 一步步编写操作系统 43 汇编语言和c语言的理解

    也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种"一切尽在掌握"的赶脚.而用c语言实现操作系统这件事,虽然轻松很多,但似乎隐约感觉到有 ...

最新文章

  1. python后端开发框架加密_Flask框架实现的前端RSA加密与后端Python解密功能详解
  2. DeeoID:Deep learning face representation from predicting 10,000 classes
  3. Android中Activity的四种启动方式
  4. ubuntu 设置大小写切换隐藏_VirtualBox中ubuntu的LAMP项目(温度采集)
  5. 使用JUnit 5进行更清洁的参数化测试
  6. 城市轨道交通运营管理属于什么院系_专业介绍|城市轨道交通运营管理专业
  7. python复制查题_python面试题(复制的)
  8. 6个web前端核心技术,你学到哪个了呢?
  9. 华为魔术手机拆机图解_华为荣耀20进水不开机
  10. DBMS_ERRLOG记录DML错误日志(一)
  11. 4.php 注册树模式
  12. OpenGL编程指南 示例笔记(2)--独立地移动光源
  13. opencv——访问图像元素(imagedata widthstep)
  14. matlab符号运算报错,matlab符号运算符
  15. 给网页加一个全屏转场动画 HTML JS
  16. 华为社招机试卷经验总结
  17. Android 实现拍照功能,并将图片保存到本地存储
  18. 浅析N沟道增强型MOS管的工作原理
  19. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解
  20. 对微分方程的特征描述及其称呼

热门文章

  1. BZOJ 2768 [JLOI2010]冠军调查
  2. 从零开始构建一个的asp.net Core 项目(一)
  3. 201521123014 《Java程序设计》第8周学习总结
  4. 《DSP using MATLAB》第6章开始了
  5. Spring基础学习笔记-Bean的基础知识
  6. Vb.Net实现图片合并(相框效果)
  7. 第五课 机器学习中的特征工程
  8. 740. Delete and Earn
  9. 310. Minimum Height Trees
  10. 【小技巧】【堆】【优先队列】优先队列初始化