第七章 更灵活的定位内存地址的方法
7.1 and 和 or 指令
and 按位
进行与
运算
or 按位
进行或
运算
7.5 【bx+idata】
ps: idata 表示为立即数, 例如 [bx+4] 我们可以用[bx]的方式来指名一个内存单元,还可以用[bx+idata]来表示一个内存单元,它的偏移地址为bx + idata mov ax,[bx+200]的含义为 (ax) = ((ds)*16 + (bx) + 200)
7.6 用[bx+idata]的方式来处理数组
可以用[bx] 和 [bx + idta]来处理二维数组。 例如数组 [[1,2,3],[3,4,5]],我们可以通过 [bx] 和[bx + 3] 来分别获取到 第一个数组的bx位置的元素和 第二个数组中的bx位置的元素
7.7 si和di
si和di是8086cpu中和bx比较相近的寄存器,都是16位寄存器
7.8 [bx+si] 和 [bx+di]
可以通过这种形式来获取(bx+si) 和 (bx+di)内存地址的信息
7.9 [bx+si+idata] 和 [bx+di+idata]
可以通过这种形式来获取(bx+si+idata) 和 (bx+di+idata)内存地址的信息
这一章比较简单,讲了bx
si
di
寄存器和 and
or
指令
第八章 bx、 si、di、 和 bp
8.1 bx、si、di 和bp
可以这么理解 bx bp 为A类 si di为B类 idata为C类 A、B、C 三类可以随意组合, 但A、B不能同时拥有两个同类。 例如 bx + bp si + di 是错误的 bx + si, bx + di + idata 是正确的
如果[...] 中含有bp
, 则段地址默认在ss
中
8.2 机器指令处理的数据在什么地方
8.3 汇编语言中数据位置的表达
立即数
对于直接包含在机器指令中的数据(执行前在CPU的指令缓存器中),在汇编语言中成为立即数(idata),z在汇编中直接给出。 例如: mov ax, 1
寄存器
指令要处理的指令在寄存器上中,在汇编指令中给出相应的寄存器名 例:move ax,bx
段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可以用[x]的格式给好处EA,SA存在某个段寄存器中
- 以下默认在ds段寄存器中: mov ax, [0] mov ax, [di] mov ax, [bx] mov ax, [bx+si] mov ax, [bx+si + 8]
- 以下默认在ss段寄存器中: mov ax,[bp] mov ax,[bp+8] mov ax,[bp+si] mov ax,[bp+si+8]
8.4 寻址方式
8.5 指令要处理的数据有多长
8086CPU的指令,可以处理两个尺寸的数据,分别为byte和word, 分别为8位和16位
-
通过寄存器名称来指名处理数据的尺寸 例如: mov ax, 1 处理为16位, 为一个字 mov al, 1 处理为8位, 为一个字节 mov al, ds:[0] 一个字节
-
在没有寄存器名称的情况下,用操作符
X ptr
指名内存单元的长度,X
在汇编指令中可以为word活byte 以下指令用word ptr
指令访问内存单元是一个字
: mov word ptr ds:[0],1 inc word ptr [bx] 以下指令用byte ptr
指令访问内存单元是一个字节
mov byte ptr ds:[0],1 -
其他情况 有些指令默认访问的是字节还是字单元,比如
push[1000h]
就不用指明是字还是字节单元,因为push只能进行字
操作
8.7 div指令
div是除法指令,使用div做除法的时候应该注意一下几个问题
- 除数: 有8位和16位两种
- 被除数:默认放在AX或 DX和AX 中,
- 如果除数为8位,则被除数为16位。默认在AX中
- 如果除数为16位,则被除数在DX和AX中, AX中放低16位 DX放高16位
- 结果:
- 如果除数为8位, 则AL为商 AH为余数
- 如果除数为16位,则AX为商 DX为余数
div 操作的
值
在哪里,被除数
多少位,都掌握在除数
手中
8.8 伪指令dd
db: 定义字节
类型数据
dw: 定义字
类型数据
dd: 定义两个字
类型的数据(double word)
8.9 dup
dup是个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号,需要配合db、dw、dd使用,进行数据的重复
db 3 dup (0) 定义了是3个字节,他们都是0 相当于db 0, 0 ,0 db 3 dup (0,1,2) 定义了是9个字节,他们都是0 相当于db 0, 1 ,2, 0, 1 ,2, 0, 1 ,2