基础知识

组成

汇编指令

机器码的助记符,汇编语言的核心

  1. mov ax,bx

伪指令

由编译器执行

其他符号

+``-``*``/等,由编译器识别,常数的加减乘除

存储器

指令和数据存放的地方

  1. 1000100111011000 -> 89D8H(数据)
  2. 1000100111011000 -> mov ax,bx(指令)

写汇编的时候数据不需要写末尾的 H

存储单元

存储器被划分成若干个存储单元,每个存储单一从 0 开始顺序编号,共 128 个,每个 1 Bety
image.png

读写

image.png

地址总线

地址总线能传送多少不同的信息,CPU 就能对多少存储单元进行寻址,即地址总线的宽度决定了 CPU 的寻址能力

如 10 根导线可以传送 基础知识 - 图3 个二进制数据,则地址总数为 基础知识 - 图4 个,而一个存储单元有1B,因此寻址能力1KB

image.png

数据总线

数据总线的宽度决定了 CPU 与外界的数据传送速度

8088CPU有 8 根数据总线,宽度为 8,8086CPU有 16 根数据总线

image.png

控制总线

控制总线的宽度决定了 CPU 对外部器件的控制能力

地址空间

接口卡

CPU 不能直接控制外部设备,而只能控制外部设备扩展插槽上的接口卡,而接口卡能直接控制外部设备

各种存储器

image.png

  • RAM(随机存储器)
  • ROM(只读存储器)
  • BIOS(基本输入/输出系统)

    地址空间

    若干个存储单元组成逻辑存储器
    image.png

    寄存器

    8086CPU有 14 个寄存器,寄存器用于对信息进行存储

通用寄存器

分别为AX``BX``CX``DX

8086CPU的通用寄存器为 16 位,即2B,用于存放一般数据 通用寄存器同时还具有特殊的功能: AX主要用于存放数据 BX常用来存放访问存储器时的地址 CX常用于保存计算值,如在移位指令,循环和串处理指令中用作隐含的计数器 DX常用于数据传递

一个寄存器又可以分成两个独立的 8 位寄存器,如AX可以分成AL(低位) 和AH(高位) 两个
image.png

一个字由两个字节组成

汇编指令

赋值 mov

  1. mov ax,18 ; 18 (实际上是 0018H) 送入寄存器 ax
  1. mov ah,18 ; 18 送入寄存器 ah
  2. ; mov ah,D812 这样是错误的, 16 位不能送入 8 位寄存器中
  1. mov ax,bx ; 将寄存器 bx 的数据送入寄存器 ax
  1. mov ax,[0] ; 将内存单元“默认段地址(ds):0”的数据送入 ax
  2. mov [0],ax ; ax的数据送入“默认段地址(ds):0”内存单元

image.png

加法 add

  1. add ax,bx ; ax=ax+bx
  1. mov al,C5
  2. add al,93 ; 结果 C5H+93H=158H, 超过 8 位会截断为 al=58H, 不会进位到 ah

减法 sub

  1. sub ax,bx ; ax=ax-bx

物理地址

基础知识 - 图11 有 20 根地址总线,其寻址范围为 基础知识 - 图12
基础知识 - 图13 是 16 位结构的 基础知识 - 图14,即 基础知识 - 图15 一次处理、传输、存放数据的能力最大为 16 位
内存地址在送入地址线时需要在 基础知识 - 图16 中暂时存放,因此只能使用两个 16 位地址合成 20 位地址
image.png

  • 偏移地址(EA)有 16 位,因此仅用偏移地址寻址,最多有 基础知识 - 图18 个地址单元
  • 不同的段地址(SA)和偏移地址能够表示相同的物理地址

    基础知识 - 图19

  • 数据存在 基础知识 - 图20 单元中,则段地址最大为 基础知识 - 图21(即偏移地址为 0),最小为 基础知识 - 图22(即偏移地址为 基础知识 - 图23),但是由于 基础知识 - 图24,再除以 16 得 基础知识 - 图25,如果段地址为 基础知识 - 图26 明显不能获得物理地址 基础知识 - 图27,因此最小只能为 基础知识 - 图28

    段寄存器

    分别为CS(指令)DS(数据)SS(栈)ES

    指令地址 CS:IP

  • CS代码段寄存器,存放段地址

  • IP指令指针寄存器,存放偏移地址

image.png

CS:IP所指向地址的内容被看作指令 SS:SP 所指向地址被看作栈顶 CPU 开机启动后,CS=FFFF``IP=0000此处有一个跳转指令,去初始化BIOS,初始化结束后,调用int 19h进行操作系统引导,计算机此时被操作系统控制

指令跳转 jmp(修改CS/IP)

  1. jmp 2AE3:3 ; 跳转到 2AE3:0003

jmp cs:ip这只能在debug里用,源程序中不可以这么写 image.png

  1. mov bx,3
  2. jmp bx ; 跳转到“ds:0003

image.png

读取完指令后(即指令从内存中读取后放入CPU的指令缓存器中) IP 就会自增 image.png 如果读取到jmp bxIP会先增,然后在执行的时候被修改成bx所指向的数据

  1. mov ax,1000H
  2. mov cs,ax ; 可行
  1. mov cs,1000H ; 不可行
  1. mov IP,1000H ; 不可行

DOSBox

常用命令

  1. R:查看、改变 CPU 寄存器的内容

image.png

  1. r ds ; 查看 ds 的数据

image.png

  1. D:查看内存中的内容

image.png
image.png

  1. d cs:0 ; 查看指令
  1. d ds:0 ; 查看数据
  1. d ss:0 ; 查看栈段数据
  1. E:改写内存中的内容

image.png
image.png
image.png

  1. e ds:0 ; ds:0 写入数据
  1. U:机器指令翻译成汇编指令

image.png

  1. T:执行一条指令

    当 T 执行的是修改栈段寄存器 基础知识 - 图41 的指令时,它的下一步指令也会跟着执行(即执行两条指令) image.png

  2. A:写入指令

image.png

  1. G:直接跳到某条指令

image.png

内存访问

image.png

DS [address]

  1. mov bx, 1000
  2. mov ds,bx
  3. mov al,[0] ; 1000:0 的数据送入 al, [...] 里的值表示 IP(偏移地址)

基础知识 - 图46 寄存器存放默认段地址,可通过 MOV 指令修改 高级语言中数组第一个元素 a[0]ds:[0]有相似之处

DS 不能直接送入数据

段寄存器只能通过寄存器或者内存单元中转

  1. mov ax,1000
  2. mov ds,ax
  1. mov ds,[0] ; 段寄存器也可以接收内存单位的数据
  1. mov ds,1000 ; 不可行

段寄存器相互不能传送数据

  1. mov ds,cs ; 不可行
  2. mov ds,ss ; 不可行

不能对段寄存器进行 基础知识 - 图47基础知识 - 图48 操作

  1. add ds,ax ; 不可行
  1. add ax,ds ; 不可行

[…] 不能直接送入数据

  1. mov [0],ds ; 可以把段寄存器的内容送入内存单位
  1. mov [0],1000 ; 不可行
  1. inc [0] ; 自增运算也不行

不能直接送入数据是因为 基础知识 - 图49 无法知道送入的数据是字型数据还是字节型数据,因此只要声明一下,还是可以直接送入的

  1. mov word ptr [0],1000 ; 字型
  1. mov byte ptr [0],10 ; 字节型
  1. inc word ptr [0] ; 以字型方式自增, 可行

以字为单位

栈地址 SS:SP

  1. mov ax,0123
  2. push ax
  3. pop bx ;bx=0123
  • 栈空间是需要自己分配的,但也可以使用默认的

image.png

  • 一个栈变化范围最多为 基础知识 - 图51,即 基础知识 - 图52 的空间,如果不手动改变 基础知识 - 图53,一直进行 基础知识 - 图54 操作最后会形成一个环
  • 高地址向低地址的方向入栈,并且入栈前先改变 SP,再送入数据

image.png

  • 空栈

image.png

  • 出栈不会删除原有的数据

image.png

  • CPU 不会处理栈越界的问题,即如果越界了不会提示,会覆盖栈空间外的数据(可能存在覆盖重要数据的风险)
  • 不可以直接向栈段寄存器 SS 直接送入数据,但可以向 SP 直接送入数据

image.png

栈实现逆序

image.png

  1. mov ax,1000
  2. mov ds,ax
  3. mov ax,2000
  4. mov ss,ax
  5. mov sp,0010
  6. push [0]
  7. push [2]
  8. push [4]
  9. push [6]
  10. push [8]
  11. push [A]
  12. push [C]
  13. push [E]
  1. mov ax,2000
  2. mov ds,ax
  3. mov ax,1000
  4. mov ss,ax
  5. mov sp,0000
  6. pop [E]
  7. pop [C]
  8. pop [A]
  9. pop [8]
  10. pop [6]
  11. pop [4]
  12. pop [2]
  13. pop [0]