yznnnn

【汇编语言】1. 基础知识

1. 计算机系统的硬件组成

  1. 运算器:算数运算和逻辑运算核心
  2. 控制器:发出控制信号,协调工作秩序
  3. 存储器:存放程序和数据
  4. I/O设备:负责输入输出,接受和表示信息

2. Intel 8086 微处理器寄存器组

   学习汇编语言,其实就是学习寄存器的运用!Intel 8086 共 14 个 16 位可编程寄存器。

graph LR; 寄存器-->通用寄存器组 寄存器-->控制寄存器组 寄存器-->段寄存器组 通用寄存器组-->数据寄存器组 通用寄存器组-->指针和变址寄存器组 数据寄存器组-->累加器 数据寄存器组-->基址寄存器 数据寄存器组-->计数寄存器 数据寄存器组-->数据寄存器 累加器-->AH,AL 基址寄存器-->BH,BL 计数寄存器-->CH,CL 数据寄存器-->DH,DL 指针和变址寄存器组-->堆栈指针寄存器 指针和变址寄存器组-->基址指针寄存器 指针和变址寄存器组-->源变址寄存器 指针和变址寄存器组-->目的变址寄存器 堆栈指针寄存器-->SP 基址指针寄存器-->BP 源变址寄存器-->SI 目的变址寄存器-->DI 控制寄存器组-->指令指针寄存器 控制寄存器组-->标志寄存器 指令指针寄存器-->IP 标志寄存器-->FLAGS 段寄存器组-->代码段寄存器 段寄存器组-->数据段寄存器 段寄存器组-->堆栈段寄存器 段寄存器组-->附加段寄存器 代码段寄存器-->CS 数据段寄存器-->DS 堆栈段寄存器-->SS 附加段寄存器-->ES

数据寄存器组

   既可以作为16位寄存器使用,也可以分为两个8位寄存器使用。这些寄存器既可以作为算数逻辑运算的源操作数,向ALU(算数逻辑单元)提供参与运算的原始数据;也可以作为目标操作数,保存运算的中间结果或最后结果。

指针和变址寄存器组

  1. 指针寄存器:(1)SP 用于在堆栈操作过程中指示堆栈栈顶的偏移地址,称为 堆栈指针 。(2)BP 用来存放位于堆栈段中的一个数据区的“基址”的偏移量,称为 基址指针
  2. 变址寄存器:在串操作指令中,SI 用来存放源操作数地址的偏移量,DI 用来存放目标操作数地址的偏移量

段寄存器组

   这些寄存器指明了一个特定的现行段,用来存放各段的段基址。

  1. CS:存放当前使用的代码段的段基址,用户编写的程序必须存放在代码段中,CPU将会依次从代码段中取出指令代码并执行。
  2. DS:存放当前使用的数据段的段基址,程序运行所需的原始数据以及运算的结果应存放在数据段中。
  3. ES:存放当前使用的附加段的段基址,它通常也用来存放数据。
  4. SS:存放当前使用的 堆栈段 的段基址,所有堆栈操作的数据均存放在这个段中。

指令指针寄存器 IP

   其内容总是指向BIU将要取的下一条指令代码的16位偏移地址。

标志寄存器

   这是最重要的寄存器!它有16位,但只使用了9位。

  • 6位:状态标志位,用来反映算术运算或逻辑运算的结果的状态,CPU自动决定。(OF,SF,ZF,CF,AF,PF)
  • 3位:控制位,用来控制CPU的操作,由人主动决定。(DF,IF,TF)

\[\begin{matrix} 15&14&13&12&11&10&9&8&7&6&5&4&3&2&1&0\\ ×&×&×&×&OF&DF&IF&TF&SF&ZF&×&AF&3&PF&×&CF\\ \end{matrix} \]

  • 控制位
  1. DF (方向标志,Direction Flag):设定和控制字符串操作指令的步进方向。\(DF=1\) 时串操作过程中的地址自动递减 1,\(DF=0\) 时自动递增 1。
  2. IF (中断允许标志,Interrupt Enable Flag):用来控制可屏蔽的中断的标志位。\(IF=1\) ,开中断,CPU可以接收可屏蔽中断请求;\(IF=0\) ,关中断,CPU不能接收可屏蔽中断请求。
  3. TF (单步标志,Trap Flag):用来控制CPU进入单步工作方式。\(TF=1\) 时,8086 CPU 处于单步工作方式,每执行完一条指令就自动产生一次内部中断;\(TF=0\) 时,CPU不能以单步工作方式工作。主要用于程序调试
  • 状态标志位
  1. OF (溢出标志,OverFlow Flag):表示运算中的溢出情况。\(OF=1\) 表示当前正在进行的补码运算有溢出;\(OF=0\) 则无溢出。
  2. SF (符号标志,Sign Flag):表示运算结果的正负情况。\(SF=1\) 为负;\(SF=0\) 为正。
  3. ZF (零标志,Zero Flag):表示当前的运算结果是否为零。\(ZF=1\) 为零;\(ZF=0\) 则为非零。
  4. AF (辅助进位标志,Auxiliary Carry Flag):表示加法或减法中运算结果中 3位 向 4位 产生进位或借位的情况。\(AF=1\) 表示有进位借位;\(AF=0\) 表示无进位借位。
  5. PF (奇偶校验标志,Patity Flag):表示本次运算结果中包含“1”的个数。\(PF=1\) 则表示有偶数个“1”;\(PF=0\) 则表示有奇数个“1”。
  6. CF (进位标志,Carry Flag):表示本次加法或减法运算中 最高位 产生进位或借位的情况。\(CF=1\) 表示有进位或借位;\(CF=0\) 表示无进位或借位。

3. 存储方式

   8086 CPU 的地址总线有20根,可以直接寻址 \(2^{20}=1\ MB\) 的存储器空间。然而它的寄存器只有 16位 ,只能直接寻址 $ 2{16}=26×2^{10}=64\ KB​ $ 的空间。为了以小寻大,采用 存储器地址分段的方法

  这个方法的核心是间存储器的地址分段,段基址用16位表示,然后用两个寄存器指明在哪一段和段内的哪一部分,即可完成寻址,逻辑地址={段基址:段偏移地址}

\[物理地址=段基址×10H+段内偏移地址 \]

\[\begin{align} 段基址 & = 0000\ 0000\ 0000\ 0000 \\ 段基址×10H& = 0000\ 0000\ 0000\ 0000\ 0000 \\ \end{align} \]

\[\begin{align} 段基址×10H+段内偏移地址=&0000\ 0000\ 0000\ 0000\ 0000 \\ +&\ \ \ \ \ \ \ \ \ 0000\ 0000 \ 0000\ 0000\\ & —————————— \end{align} \]

举个例子,现已知一个逻辑地址为 {B21H : 4567 H},现在将其转换为物理地址:

\[\begin{align} 段基址 =B21H& = 0000\ 1011\ 0010\ 0001 \\ 段基址×10H& = 0000\ 1011\ 0010\ 0001\ 0000 =B210H\\ 段内偏移地址=4567H&=0100\ 0101\ 0110\ 0111 \\ \end{align} \]

\[\begin{align} 段基址×10H+段内偏移地址=&\ 0000\ 1011\ 0010\ 0001\ 0000 \\ +&\ \ \ \ \ \ \ \ \ \ 0100\ 0101\ 0110\ 0111 \\ & ——————————\\ =&\ 0000\ 1111\ 0111\ 0111\ 0111 \\ =&\ F777H \end{align} \]

4. 进制转换

  计算机只认识二进制的语言,但要人类去读二进制则显得冗长,故而一般将二进制转换为十六进制来进行阅读。转换的一般途径如下:

graph LR; 十进制-->二进制 二进制-->十六进制 十六进制-->二进制 二进制-->八进制 八进制-->二进制 二进制-->十进制

4.1. 十进制——>二进制

  十进制转换为二进制主要使用取余法。比如求十进制数125的二进制数:

\[\begin{matrix} 整&125&62&31&15&7&3&1&0\\ 余& &1 &0 &1&1&1&1&1\\ \end{matrix}\\ (125)_{dec}=(111 \ 1101)_{bin} \]

再比如求十进制数837的二进制数:

\[\begin{matrix} 整&837&418&209&104&52&26&13&6&3&1&0\\ 余& &1 &0 &1 &0 &0 &0 &1&0&1&1\\ \end{matrix}\\ (837)_{dec}=(11\ 0100\ 0101)_{bin} \]

4.2. 二进制——>十进制

  二进制转十进制就是一个加权求和的过程,比如将 \((111 \ 1101)_{bin}​\) 转为十进制:

\[\begin{matrix} 权&2^6&2^5&2^4&2^3&2^2&2^1&2^0\\ 位&1&1&1&1&1&0&1\\ \end{matrix}\\ \begin{align} DEC& = 1 ×2^6+1 ×2^5+1 ×2^4+1 ×2^3+1 ×2^2+0 ×2^1+1 ×2^0\\ & = 1 ×64+1 ×32+1 ×16+1 ×8\ +1 ×4\ \ +0 ×2\ \ +1 ×1 \\ &=(125)_{dec} \end{align} \]

4.3. 二进制与八进制和十六进制的互相转换

  二进制与八进制和十六进制的转换非常简单,4位二进制对应1位十六进制,3位二进制对应1位八进制。

\[\begin{matrix} 二进制&十六进制&|&八进制&二进制\\ 0000&0&|&0&000\\ 0001&1&|&1&001\\ 0010&2&|&2&010\\ 0011&3&|&3&011\\ 0100&4&|&4&100\\ 0101&5&|&5&101\\ 0110&6&|&6&110\\ 0111&7&|&7&111\\ 1000&8&|\\ 1001&9&|\\ 1010&A&|\\ 1011&B&|\\ 1100&C&|\\ 1101&D&|\\ 1110&E&|\\ 1111&F&|\\ \end{matrix}\\ \]

比如将 \((111 \ 1101)_{bin}\) 转换为 十六进制 则为 \((7D)_{HEX}\),转换为八进制则为 \((175)_{oct}\)

分类:

技术点:

相关文章: