汇编语言学习总结

0x00 汇编语言的组成

  • 汇编指令:机器码的助记符,有对应的机器码
  • 伪指令: 没有对应的机器码,由编译器执行,计算机并不执行
  • 其他符号: 如: +、-、*、/ 等,由编译器识别,没有对应的机器码


0x01 存储单元

  • 存储器被划分成若干个存储单元,每个存储单元从0开始顺序编号,例如一个存储器有128个存储单元,编号从0~127
  • 一个存储单元可以存储1Byte
  • 8bit=1Byte(字节)


0x02 CPU对存储单元的读写

  • 存储单元的地址(地址信息)
    器件的选择,读或写的命令(控制信息)
    读或写的数据(数据信息)
  • 地址总线从逻辑上可以分为地址总线,控制总线,数据总线
  • 一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N,这样CPU最多可以寻找2的N次方个内存单元
  • 数据总线的宽度决定了数据的传输速度,若数据总线的宽度为N则CPU可以一次性传输数据Nbit数据
  • 控制总线的宽度决定了CPU对其他部件的控制能力(个人理解为指令个数上限)


0x03 内存地址空间

  • 是一个假想的逻辑存储器
  • 所有的物理存储器被看作是一个由若干存储空间组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段即一段地址空间
  • 内存地址空间的大小受到地址总线宽度的限制
  • 汇编语言学习总结_第1张图片


0x04 8086通用寄存器

  • 8086所有寄存器都是16位的可以存放两个字节
  • AX BX CX DX四个寄存器通常用来存放一般性数据被称为通用寄存器
  • 为了兼容上一代CPU的8位寄存器AX可分为AL AH,BX可分为BL BH
  • 汇编语言学习总结_第2张图片
  • 汇编语言学习总结_第3张图片
    QQ截图20181021152436.png


0x05 字在寄存器中的存储

  • 字节记为byte,一个字节由8个bit位组成
  • 字记为word,一个字由两个字节组成分别称为高位字节和低位字节


0x06 简单的汇编指令

  • mov ax,bx 将bx的值赋给ax中
  • add ax,1406H
  • mov al,bl al被作为一个独立的8位存储器来运算溢出的部分不会被保存在ah中
  • 在8086CPU中寄存器是16位的,如果超出位数最高位会溢出(例将13650H传递给ax 最终ax=3650H)


0x07 16位结构(字长为16)CPU

  • 运算器一次最多处理16位数
  • 寄存器的最大宽度为16位
  • 寄存器和运算器之间的通路为16位
  • 8086是16位结构的CPU也就是说在8086CPU内部可以一次性处理、传输、暂存最大长度是16位的存储信息


0x08 物理地址计算方法

  • 物理地址=段地址x16+偏移地址(其中段地址和偏移地址都为16位地址)
  • 段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数
  • CPU可以用不同的段地址和偏移地址来形成同一个物理地址
  • 一个X进制的数据左移1位,相当于乘以X


0x09 CS和IP寄存器

  • CS为代码段寄存器,保存着要执行的指令所在段地址
  • IP为指令指针寄存器,保存着要执行的指令所在偏移地址
  • 每执行一句指令IP寄存器会自动增加


0x0A 8086CPU的工作过程

  • (1)从CS:IP 指向内存单元读取指令,读取的指令进入指令缓冲器
    (2)IP=IP+所读取的指令的长度 从而指向下一条指令
    (3)执行指令 跳到步骤(1)重复这个过程


0x0B 修改CS:IP的值

  • jmp 段地址:偏移地址
  • jmp 某一合法寄存器 (用寄存器中的值修改IP)


0x0C Debug的使用

  • r 命令 查看寄存器中的值
  • r ax 或者rax 修改ax寄存器的值(即r命令可用于查看/修改寄存器的值)
  • d 段地址:偏移地址 查看内存中的内容(列出从指定位置开始的128个内存单元)
  • 在使用d 段地址:偏移地址命令之后接着使用d命令可以列出后续的内容
  • e改写内存中的内容(例e 1000:0 0 1 2 3 4 5 6)
  • d查看某个地址段的内容(d 1000:0 f 即可查看1000:0~1000:f单元的内容)
  • 采用提问的方式改写内存(e 1000:0 空格继续输入下一个字符 回车结束输入)
  • u 段地址:偏移地址 命令查看机器码的含义(将数据翻译成指令)
  • t命令执行当前CS:IP指向的指令
  • a 段地址:偏移地址 命令直接以汇编指令的形式写入指令


0x0D 字在内存中的存储

  • 在8086CPU中用16位寄存器来存储一个字,高8位存放高位字节,低8位存放低位字节
  • 一个字要用两个地址连续的内存单元来存放
  • 字的低位字节存放在低地址单元中,高位字节存放在高地址单元中


0x0E 字节单元和字单元

  • 字节单元即一个单元存放一个字节,内存单元是字节单元
  • 字单元即存放一个字型数据的内存单元,由两个地址连续的内存单元组成
  • 我们将起始地址为N的字单元简称为N地址单元


0x0F 数据段寄存器DS

  • DS通常用来存放要访问的数据的段地址
  • 使用[0]的形式来表示内存单元偏移地址


0x10 不支持将数据直接送入段寄存器

  • 8086CPU硬件设计不支持


0x11 栈段寄存器SS和寄存器SP

  • 栈顶的段地址存放在SS中
  • 偏移地址存放在SP中
  • SS:SP始终指向栈顶元素
  • push ax 将ax的数据压栈
  • pop ax 栈顶元素出栈给ax


0x12 栈顶超界问题

  • 8086CPU不检查越界问题

你可能感兴趣的:(汇编语言学习总结)