8086汇编学习笔记10

数据处理

系列文章

约定描述性符号:reg 和 sreg

使用 reg 符号来表示一个普通寄存器,使用 sreg 符号来表示一个段寄存器。

reg 符号集:AX(AH/AL)、BX(BH/BL)、CX(CH/CL)、DX(DH/DL)、SP、BP、SI、DI;

sreg 符号集:DS、SS、CS、ES。

BP、ES寄存器

BP基指针寄存器,和 BX 类似,也可以用于暂存数据,也是通用寄存器。

在“ [BP] ”中使用寄存器 BP ,而指令中没有显式给出段地址,则段地址默认保存在 SS 段寄存器中。“ [BP] ”会被解释为“ SS:BP ”。

在8086CPU中,只有 BXSIDIDP 可以在“ […] ”中来进行内存单元的寻址

这四个寄存器可以单独出现,但只能以以下四种组合出现

  1. BXSI
  2. BXDI
  3. BPSI
  4. BPDI

其余组合都是错误的形式。

ES附加段寄存器,和其余段寄存器类似。当程序中如果除了数据、栈和代码外还需要其余的段,可以使用ES寄存器。

数据位置的表达

汇编语言用3个概念来表达数据的位置:

以H结尾的十六进制数据,以B结尾的二进制数据,以单引号引出的字符数据,都是立即数。

立即数在指令执行前,数据位于CPU的指令缓冲器中

存放段地址的寄存器如果没有显式给出,那么使用对应默认的段寄存器。也可以用段前缀的形式显式给出段寄存器。

寻址方式

下表总结了8086CPU的寻址方式:

8086CPU寻址方式
寻址方式 含义 名称 常用格式举例
[n] DS:n 直接寻址 [n]
[BX] DS:BX 寄存器间接寻址 [BX]
[SI] DS:SI
[DI] DS:DI
[BP] DS:BP
[BX+n] DS:BX+n 寄存器相对寻址 用于结构体:[BX].n
用于数组:n[SI]
用于二维数组:[BX][n]
[SI] DS:SI
[DI] DS:DI
[BP] DS:BP
[BX+SI] DS:BX+SI 基址变址寻址 用于二维数组:[BX][SI]
[BX+DI] DS:BX+DI
[BP+SI] SS:BP+SI
[BP+DI] SS:BP+DI
[BX+SI+n] DS:BX+SI+n 相对基址变址寻址 用于结构中的数组项:[BX].n
用于二维数组:n[BX][SI]
[BX+DI+n] DS:BX+DI+n
[BP+SI+n] SS:BP+SI+n
[BP+DI+n] SS:BP+DI+n

处理数据的位数

8086CPU的指令可以处理字节和字的数据。在机器指令中要指明指令处理的是字操作还是字节操作。汇编语言用以下方式处理该问题:

指令中出现16位寄存器时,表明指令中进行的是字操作;当指令中出现8位寄存器时,表明指令中进行的是字节操作

例如,以下指令使用 word ptr 指明了指令访问的内存单元是一个字单元:

mov word ptr ds:[0], 1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx], 2

以下指令使用 byte ptr 指明了指令访问的内存单元是一个字节单元:

mov byte ptr ds:[0], 1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx], 2

DIV指令和dd、dup伪指令

DIV指令(除法指令)
格式:
DIV container , number
用途:
container 对应的寄存器或存储空间中的值作为除数进行除法运算。

除数可以是8位数或16位数。被除数默认放在 AX ,或 DXAX 中:

除法运算的结果为:


可以用伪指令 dd 来定义dword(double word 双字)型数据。双字型数据占两个字的空间(32位)。

双字型数据一般用作被除数的存储。

dd 伪指令的使用类似于 dbdw ,例如:

dd 1, 01d5h, 0, 0010101011011100B

dup 是一个操作符,和 dbdwdd 等伪指令配合使用,用来进行数据的重复。

dup 的使用格式为:

dup 可以将括号内的对应类型的数据重复 times 次。例如:

dw 3 dup (12h)          ; same as word'12h'*3
db 6 dup ('abc', 'ABC') ; same as byte'abcABC'*6

dup 可以快速定义一块需要的内存空间,例如:

stacks segment
    db 200 dup (0)
stacks ends