第八章 数据处理的两个基本问题
本章对前面具有总结性。主要解决以下两个问题
- 处理的数据在什么地方
- 要处理的数据有多长
定义描述符号reg和sreg
- reg:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di;
- sreg:ds,ss,cs,es。
8.1 bx,di和bp
- 在8086CPU中,只有这4个寄存器可以用在
"[..]"
当中来进行内存单元的寻址。 -
4种寄存器可以单独出现,否则只能以这四种组合出现
- bx和si
- bx和di
- bp和si
- bp和di
-
重点:只要在
[..]
中使用bp,而指令中没有显性地给出地址,段地址默认为ss中 -
不太懂这三个规则的由来
8.2 机器指令处理的数据在什么地方
在机器指令这一层来说,不关心数据的值,关心指令执行前一刻,他将要处理的数据的位置。
- CPU内部
- 内存
- 端口
8.3 汇编语言中数据位置的表达
-
立即数(idata)
执行前在CPU的指令缓冲器中
-
寄存器
在CPU内寄存器中
-
段地址(SA)和偏移地址(EA)
在内存或端口
8.4 寻址方式
8.4.1 直接寻址
形式 [idata]
含义 普通变量
8.4.2 寄存器间接寻址
形式 [bx]
,[si]
,[di]
,[bp]
含义
- 数组
8.4.3 寄存器相对寻址
形式 [bx+idata]
….idata[bx]
….[bx].idata
含义
- 二维数组
[bx][idata]
- 一维数组
idata[bx]
- 结构体
[bx].idata
8.4.4**基址变址寻址**
形式 [bx+si]
,[bx+di]
,[bp+si]
,[bp+di]
含义
- 二维数组
[bx][si]
8.4.5 相对基址变址
形式 [bx+si+idata]
,[bx].idata[si]
,idata[bx][si]
含义
- 普通数组
[bx+si+idata]
- 结构中的数组
[bx].idata[si]
- 二维数组
idata[bx][si]
8.5 指令要处理的数据有多长
8086CPU的指令,可以处理两种尺寸的数据,byte
和word
。在机器指令中要指明处理那种数据。
汇编语言有以下方法处理。
- 通过寄存器名指明要处理的数据的尺寸。
- 用操作符
X ptr
指明长度,X可以是word
/byte
- 其他方法,
push
只进行字操作
Tips:
注意 inc byte ptr
和 inc word prt
的区别
答:在不进位的时候,两者没有区别,进位的时候,byte会抛弃进位。
8.6 寻址方式的综合应用
mov si,0 mov byte ptr [bx].10h[si],'V' inc si mov byte ptr [bx].10h[si],'A' inc si mov byte ptr [bx].10h[si],'X'
8.7 div指令
- 除数:有8位,和16位两种。根据8.5判定。
-
被除数:
- 8位:默认放在AX中
- 16位:默认放在DX和AX中,DX存高16位,AX存低16位
-
结果
- 8位:AL存储商,AH存储余数
- 16位:AX存储商,DX存储余数
格式如下
div reg div byte/word ptr 内存单元
至于溢出的问题
会提示 divide error – overflow.至于怎么解决,要看后面的分析
8.8 伪指令dd
dd
=Double worD,双字型数据,32位
data segment db 1 dw 1 dd 1 data ends 实质: db=01H dw=0001H dd=00000001H
8.9 dub
dub是一个操作符,伪指令用于进行数据的重复
语法
db/dw/dd 重复次数 (重复的db/dw/dd数据)