秃头的汇编

秃头的汇编

说明

本篇博客记录的是博主在学习基于Intel 8086指令系统的汇编一些知识点。

什么是汇编语言

  • 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
  • 在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

一些基础知识

字节、字、bit、byte的关系

1
2
3
4
5
6
7
8
word
字节 byte
位 bit

1字=2字节(1 word = 2 byte)
1字节=8位(1 byte = 8bit)

字长是指字的长度(所占的二进制位数)

80×86寄存器

  • 8086 CPU中寄存器总共为14个,且均为16位。
  • 即AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES共14个。
  • 而这14个寄存器按照一定方式又分为了通用寄存器(8个),控制寄存器(2个)和段寄存器(4个)。

通用寄存器

  • AX,BX,CX,DX 称作为数据寄存器:

    • AX (Accumulator):累加寄存器,也称之为累加器
    • BX (Base):基地址寄存器
    • CX (Count):计数器寄存器
    • DX (Data):数据寄存器
  • 由于在 8086 之前的 CPU 为 8 位 CPU,所以为了兼容以前的 8 位程序,在 8086 CPU 中,每一个数据寄存器都可以当做两个单独的寄存器来使用。

    • AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;
    • BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;
    • CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;
    • DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;

  • SP 和 BP 又称作为指针寄存器:

    • SP (Stack Pointer):堆栈指针寄存器
    • BP (Base Pointer):基指针寄存器
  • SI 和 DI 又称作为变址寄存器:

    • SI (Source Index):源变址寄存器
    • DI (Destination Index):目的变址寄存器

控制寄存器

  • IP (Instruction Pointer):指令指针寄存器
  • FLAG:标志寄存器

段寄存器

  • CS (Code Segment):代码段寄存器
  • DS (Data Segment):数据段寄存器
  • SS (Stack Segment):堆栈段寄存器
  • ES (Extra Segment):附加段寄存器

寄存器
注意: 此图片还包含了80286的寄存器。

物理地址的产生

  • 逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。
  • 物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。
  • 物理地址=段基址×16+偏移量
    物理地址

寻址方式

  • 寻址:寻找操作数地址的过程
  • 寻址方式与操作数位置有关
操作数位置 操作数名称 寻址方式名称
在指令中 立即数 立即寻址
在寄存器中 寄存器操作数 寄存器寻址
在储存器中 存储器操作数 存储器寻址
在I/O端口中 I/O操作数 I/O端口寻址

寻址

与数据有关的7种寻址方式

  • 立即寻址

    • 操作数在指令中,紧跟在操作码之后,这样的操作数成为立即数。
  • 直接寻址

    • 操作数的地址中的偏移量直接跟在操作码之后,默认情况下基址存放在DS中,这个时候不需要加前缀,如果是加了别的前缀,如ES,表示基址在ES中。
  • 寄存器寻址

    • 操作数在CPU的寄存器中,指令指定寄存器号,这种寻址速度快,它不需要访问存储器中的操作数,因为所有的操作数都在寄存器中
  • 寄存器间接寻址

    • 操作数在存储器中,操作数有效地址在SI,DI,BX,BP这四个寄存器之一中,在一般情况下,如果有效地址在SI,DI和BX中,则以DS段寄存器之内容为段值。如果有效地址在BP中,则以SS段寄存器之内容为段值。
  • 寄存器相对寻址方式

    • 基址相对寻址
    1
    2
    3
    4
    对于BX寄存器来说,使用DS作为基址寄存器
    例如:
    MOV AX,COUNT[BX] 或 MOV AX, [COUNT+BX]
    ------DS基址------
    1
    2
    3
    4
    对于BP寄存器来说,使用SS作为基址寄存器
    例如:
    MOV AX,COUNT[BP] 或 MOV AX, [COUNT+BP]
    ------SS基址------
    • 变址相对寻址
    1
    2
    3
    使用2个变址寄存器SI,DI.例如:
    MOV AX,COUNT[SI] 或 MOV AX,[COUNT+SI]
    MOV AX,COUNT[DI] 或 MOV AX,[COUNT+DI]
1
2
3
4
5
6
7
物理地址=16×(DS)+(BX)+816位位移量
或(SI)
或(DI)

注意:(SI)和(DI)替换的是(BX)

物理地址=16×(SS)+(BP)+816位位移量
  • 基址变址寻址
1
2
3
4
5
6
7
8
9
10
        (BP)           (SI)
即:EA=         + EA即有效地址
(BX) (DI)

例如:
MOV, [BX][DI] 或 MOV, [BX+DI]

物理地址=16×(DS)+(BX)+(DI)

物理地址=16×(SS)+(BP)+(DI)
  • 相对基址变址寻址
1
2
3
4
5
6
7
8
9
10
        (BP)           (SI)         8位位移量
即:EA=         + +
(BX) (DI) 16位位移量

例如:
MOV, MASK[BX][DI] 或 MOV, MASK[BX+DI] 或 MOV, [BX+DI+MASK]

物理地址=16×(DS)+(BX)+(DI)+位移量

物理地址=16×(SS)+(BP)+(DI)+位移量

寻址

作者

TIANYUZHOU

发布于

2020-03-29

更新于

2021-02-17

许可协议

评论