0%

汇编语言总结

汇编语言

前言

这是一次总结,对读王爽的《汇编语言》的一次回顾。按照记忆中的印象来进行描述,有不完善不严谨的地方后面会继续修改。汇编语言其实是相当于机器语言native code 的助记版,理解好汇编语言,对于理解计算机如何运转有很大帮助。

寄存器

​ 在汇编语言中,或者说是对应的cpu设计中,寄存器是我们与机器进行交互的一个直接工具。在《计算机是这样跑起来的》一书中提到过,cpu实际上是寄存器的集合。

​ 接下来,我想默写一下我记得的寄存器。

CS 和 IP

​ CS是段寄存器,在内存中,我们把空间分为一个个地址单元,基本的单元是字节,一个字节8位。在8086处理器中,按照段式存储,将地址划分为段地址*16+偏移地址。所以cs寄存器存储的就是段地址,它是一个特别的寄存器,专门存储代码段地址,ip存的是偏移地址。8086处理器默认执行cs:ip地址的代码。每次执行后,ip都会移动,也就是ip = ip + 读取指令的长度,然后指向下一个要执行的代码。

DS

​ 同样,ds是一个段寄存器,它存储的是数据段地址。这个数据段很多时候是隐性的。例如 我们使用mov指令传送一个数据.

1
mov al, [0]

这里就隐藏了 ds, [0]其实指向 ds:[0]。

SS 和 SP

SS是栈的段存储器, SP是栈的指针存储器。

ss:sp指向栈底底位置。这里提一下,在8086中,这个sp指向的是高地址。例如给sp一个值0x20,那么这个栈的空间大小就是0 ~ 0x20, 每次入栈,这个指针都会减少,这里的栈空间需要我们自己管理的。一般入栈的是寄存器和内存单元。出栈,指针就会增加,那么当为设置sp=0x20的时候,我直接出栈,sp会怎么变化呢?

stackoverflow

答案:sp会继续增加,不会报错。参考

AX, BX, CX, DX

ax 和 dx

ax寄存器算是用的比较普遍的一个寄存器,我们不关心他最初被设计为什么寄存器。它现在的作用有

  1. 作为一个普通16位寄存器,或者2个8位寄存器al,ah来存储数据。
  2. 他被默认为乘法和除法的结果的存储寄存器之一,两个数相乘的指令,一个乘数默认放在ax寄存器中。如果是8位数据相乘,结果存放在ax中,如果是16位数据相乘,结果的低位存放在ax中, 高位放在dx中。除法中,如果除数是8位,被除数是16位,商存在al中,余数存在ah中。如果除数是16位,被除数是32位,商存在ax中。结果放在dx中。

bx

习惯上来说,用ax把段地址传给ds,然后bx中存放的是偏移地址。

在8086有4个寄存器可以在[…]中寻址。bx si di bp。

在[…]中 这4个寄存器可以单独出现,或者以4中组合出现
[bx+si] , [bx+di] [bp+si] [bp+di]

cx

cx与loop的联系密切,loop是循环指令,指向循环的次数就少cx的数不等于0,每次执行一次循环cx=cx-1.

si,di, bp, es

1.上面介绍了他们可以在[…]中寻址。

2.si,和di.对于指令movsb来说, ds:si 是ori, es:di是des。 即从ds:si向es:di传送数据。关于这条指令下面还要介绍。

3.只要在[…]中使用寄存器bp,而指令中没有显性的给出段地址,段地址默认在ss中。

4.es属于段寄存器,算是一个附加寄存器

Flag

flag

这是一个特别的寄存器,在8086中,它有16位。

0、2、4、6、7、8、9、10、11 都具有特殊含义

CF、PF、AF、ZF、SF、TF、IF、DF、OF

  • ZF,零标志位, 第6位, 记录相关运算指令执行后,结果是否为0, 为0 则zf=1. add、sub、mul、inc、div、or、and都是运算指令
  • PF,奇偶标志位, 第2位。 记录相关指令执行后, 如果所有的bit中1的个数是否为偶数个
    如果1的个数为偶数,pf=1,反之为0
  • SF,符号标志位, 第7位。 记录执行相关指令后, 结果是否为负,如果结果为负, sf=1, 反之为0。
  • CF,进位标志位, 第0位。 在进行无符号数运算的时候,她记录了运算结果的最高有效位的进位值,
    或者更高位的错位值。
  • OF,溢出标志位, 第11位。 进行有符号位运算的过程, 如果运算发生溢出,则of=1
    cf 与 of的区别: 分别是对无符号数和有符号数运算而言。
  • DF,方向标志位, 第10位。 在串处理指令中, 控制每次操作后si, di的增减。df=0, 每次操作后 si、di 递增,df=1, 每次操作后 si、di 递减。

一些基础的指令

mov

这个是汇编中最常用的指令了,数据传输指令。它可以将值传给寄存器,也可以将寄存器中的值传给内存单元。