汇编语言概论

1,汇编语言的由来

为什么写这篇文章,我想还是要说一说的,俗话说好记性不如烂笔头,作为一个嵌入式行业开发者,汇编不可谓不重要,不管是大学的基于x86架构程序设计还是工作后的基于ARM的嵌入式软件设计,汇编都扮演了及其重要的重要,而且汇编可以说是最底层的语言,为什么?有人说机器语言才是,但我告诉你机器语言是给CPU设计者看的,因为一个机器语言就代表着CPU的一种状态,而cpu本质上来说就是一个“有限状态机”,可能在远古时代cpu功能不多的时候还会有程序员写下一串串0101...的二进制指令来编程并且运行于计算机上,那是二进制01用纸带上的孔表示如图1-1

 

   图1-1

  这个时候编程得手工计算指令码和操作数并写在纸上,不得不说是一件极其麻烦的事,但是人们发现二进制指令还是有规律的,比如加法它的指令码是相同的,只是操作数会变化,所以人们想出用“add”这个字符代替二进制的加法的指令码,用形如add 3,5代表3+5这个算数运算,自此汇编语言诞生,然后就是汇编器的诞生,汇编器可以让程序员专注于程序的逻辑设计,而不用担心记不住指令的二进制代码,其实一条汇编语句就是对应于一条二进制编码,汇编器就是一个翻译的机器,从这一点来说写二进制代码和二进制代码没有什么区别,虽然现在高级语言功能很多,可以让程序员脱离机器,甚至都不需要了解机器架构,但是汇编语言依然具有不可替代的地位。


2,汇编语言的用途

2.1操作系统设计的独家武器

  在操作系统设计上必然是不可或缺的要与机器打交道,对于一个使用高级程序设计语言的程序员来说他不需要知道他的程序怎么样去申请内存,怎么样去访问磁盘,怎么样去访问网卡,他不会懂也不需要懂,他只是实现他的业务逻辑,因为所有的这一切都是操作系统帮他完成的,所以我一直认为能写操作系统的程序员才是牛逼的程序员,在操作系统上有相当一部分是用汇编语言编写完成的,因为汇编语言直接操作机器的特点,所以它可以做到精简,快速,当然这也对设计人员的能力提出极大的要求,因为需要懂指令集架构,需要知道程序编译,链接,及地址空间分布等一些底层的技术,在操作系统的启动文件,进程切换函数,无一例外不是用汇编写成的,当然这也只能用汇编,因为编译器不会知道怎么样去启动机器,它也不知道怎么是特定于机器的指令。

2.2在嵌入式编程领域

为什么说汇编是嵌入式程序员的独家武器,因为如果你懂汇编你就不怕你的程序出问题, 从机器层面上来说你可以读取CPU的寄存器从而判断程序状态,如ARM的 mrs r0 cpsr 指令,然后把r0的值打印出来,这是高级程序员无法用高级语言实现的,当然我们不建议这样子做,因为这会破坏程序的可移植性,但是这就是嵌入式的独特性,因为移植也是嵌入式程序员的本职工作,比如把一个基于x86的c/c++项目移植到基于ARM的机器上去,这件事只能由嵌入式程序员去干,另外就是驱动的编程了,这是嵌入式干的另一件大事,任何高级语言不管是编译型的还是解释型的语言,最终都会到机器上去运行,而驱动就是去告诉机器应该怎么样才能完成好这件事,比如高级语言的读文件,到了驱动这里就是怎么样去控制磁盘了,所以驱动程序的优化可以很好的提升机器的速度和性能,

2.3在高精尖武器领域

在这里编程最重要的是稳定,因此程序用汇编编写,另外就是速度,这个速度是程序运行的速度,要确保用最少的指令完成最好的工作,如果一个导弹程序在锁定目标后还有较大的延时这将是不可接受的,因为这个程序要精确的运行时间和实时性,这部分程序只能是由汇编语言设计。


3,汇编语言分类

3.1基于x86架构的汇编

 AT&T风格/Intel风格

为什么会有AT&T风格这与贝尔实验室有莫大的关系,因为贝尔实验室曾属于AT&T公司,在当时这两个词语几乎等价,只是后来贝尔实验室脱离AT&T成立里朗讯,这个历史可以百度查的到,不在此详细介绍,而贝尔实验室又研发出了大名鼎鼎的unix操作系统,这个操作系统可以说是现代操作系统的鼻祖,而贝尔实验室这批人使用的汇编风格也因此传承了下来,所以在x86架构下就有了两种汇编风格,即开源软件界使用的At&T风格,这也是GNU/gcc默认使用的汇编风格,另外就是Inter风格,这是windows使用的风格,在linux下默认是AT&T风格。下面介绍两种风格的差异。

1,立即数

何为立即数,就是可以直接编码在指令里的数,这种数一般有长度要求,因为指令也是有宽度的,在不同架构里面宽度一般不同,这里不是我们讨论重点,在AT&T 汇编中 , 用$前缀表示一个立即数,而在Intel风格中则没有任何前缀,如下图

2,寄存器命名

在AT&T中寄存器有%号作为前缀,例如%eax,Intel则没有前缀,如eax,具体如下图

3,操作数顺序

AT&T中目的操作数在右,源操作数在左,即 操作符 源操作数 , 目的操作数,而Intel与此相反即操作符 目的操作数 , 源操作数,

  • AT&T风格: 操作符 源操作数 , 目的操作数
    mov $1 , %eax
  • Intel 风格:操作符 目的操作数 , 源操作数
    mov  eax , 1
 4,寻址方式

在AT&T中用()表示间接寻址,在intel中用[ ]表示,即

AT&T :disp(base   ,    index  ,   scale) 

intel:[  base + index * scale +disp  ] 
中文释义: 地址或偏移 (%基址或偏移量寄存器, %索引寄存器, 比例因子)
计算方法: 最终地址 = 地址或偏移 + %基址或偏移量寄存器 + %索引寄存器 * 比例因子
寻址参考: AT&T汇编语言及其寻址方式

5,数据宽度表示 
  • 在AT&T汇编格式中,操作数的字长由操作符的最后一个字母决定,
    后缀bwl分别表示操作数为字节(byte,8比特)、字(word,16比特)和长字(long,32比特);
  • 而在Intel汇编格式中,操作数的字长是用byte ptrword ptr等前缀来表示的


3.2,基于ARM架构的汇编

z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值