[TOC]
问题:
+ 处理的数据在什么位置?
+ 指令要处理的数据有多长?
# bx、si、di、dp
+ 在 8086 CPU中,只有ax、bp、si、di这四个寄存器客户以通用`[...]`来进行内存单元的寻址。
指令要处理的数据有多长?

+ 在“[…]” 中,这4个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现:
- bx和si
- bx和di
- bp和si
- bp和di
+ 只要在`[...]`中使用寄存器`bp`,而指令中没有显性的给出duan
# 汇编语言中数据位置的表达
用三个概念来表达数据的位置:
+ 立即数(idata)
+ 寄存器
+ 段地址(SA)和偏移地址(EA)
## 立即数
执行前放在CPU的指令缓冲器中。
~~~
mov ax, 1
~~~
## 寄存器
指令要处理的数据在寄存器中,汇编语言给出相应的寄存器名。
~~~
mov ax, bx
~~~
## 段地址(SA)和偏移地址(EA)
需要处理的数据在内存中,在汇编中使用 `[X]` 的格式给出段地址。
**默认的**
~~~
mov ax, [0]
mov ax, [bx]
mov ax, [bx+8]
mov ax, [bx+si]
mov ax, [bx+di]
; 存放段地址的寄存器是默认的: ds中
mov ax, [bp]
; 与bp相关的都放在 ss 中的
~~~
**显示给出**

# 寻址方式

# 指令要处理的数据有多长?
8086CPU中可以处理两种尺寸的数据:`byte`和`word`,即字操作、字节操作。
## 通过寄存器名指定要处理的数据的尺寸
~~~
mov ax, 1 ; 0001H 1word
mov bx ds:[0]
;上面的是字节操作
mov al, 1
mov al, ds:[0]
; 以上的是字操作
~~~
## 在没有出现寄存器名的情况下,使用`作符X ptr`来指明内存单元的长度
注意:X可以为`word`、`byte`
~~~
mov word ptr ds:[0], 1
inc word ptr [bx]
~~~
`mov word ptr ds:[0], 1`和`mov byte ptr ds:[0], 1`的区别与联系:
联系:都是访问的`ds:1000H`的单元
区别:
+ `mov word ptr ds:[0], 1`修改的是`ds:1001H`
+ `mov byte ptr ds:[0], 1`修改的是`ds:1000H`
## 其他方法
push
~~~
push [1000H] ; push只进行字操作
~~~
# 寻址方式的综合应用
# div 指令(除法)
`div`是`division`的缩写,是除法指令
除数:8位或16位,在寄存器或者内存单元中
被除数:放在AX 或DX、AX中
| 除数 | 被除数 |
| --- | --- |
| 8位 | 16位(AX) |
| 16位 | 32位(DX+AX) |
**结果**
| 运算 | 8位 | 16位 |
| --- | --- | --- |
| 商 | AL | AX |
| 余数 | AH | DX |
## 格式
~~~
div 寄存器
div 内存单元
~~~
## 实例
~~~
div byte ptr ds:[0]
~~~
含义:
+ (al) = (ax)/((ds)*16 + 0) 的商
+ (ah)= (ax)/((ds)*16 + 0) 的余数
~~~
div word ptr es:[0]
~~~
含义:
+ (ax) = [(dx)*10000H + (ax)] / ((ds)*16 + 0) 的商
+ (dx) = [(dx)*10000H + (ax)] / ((ds)*16 + 0) 的余数
## 案例
+ 计算 100001/100
~~~
mov dx, 1
mov ax, 86a1H ; (dx)*10000H + (ax) = 100001
mov bx, 100
div bx ; 结果:商:(ax)=03E8H;余数:(dx) = 1
~~~
+ 计算 1001/100
~~~
mov ax, 1001
mov bl, 100
div bl ;
~~~
# dd 伪指令
> db、dw用来定义`字节型`数据和`字型`数据
`dd`用来定义dword(double word双字节)型数据
## 实例
~~~
data segment
db 1 ; data:0,占1字节,值为: 01H
dw 1 ; data:1 占 1字节;值为: 0001H
dd 1 ; data:3 占2字节;值为: 0000 0001H
data ends
~~~
# dup
是一个操作符,是一个伪指令
~~~
dd 3 dup(0) ; 定义类3个字节,他们的值都是 0 ,相当于 dd 0,0,0
dd 3 dup(0,1, 2) ; 定义了 9 个字节,相当于 dd 0, 1, 2, 0, 1, 2, 0, 1, 2
dd 3 dup('abc', 'ABC') ; 定义了 18个字节,相当于 dd 'abcABCabcABCabcABC'
~~~
## 格式
~~~
dd 重复的次数 dup(重复的双字节型数据)
~~~
