1 寄存器bp bx si di
1)在8086CPU中,只有4个寄存器可以用来进行内存单元的寻址:bx bp si di。
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax.[bp+si]
mov ax,[bp+di]
但不可以mov ax,[bx+bp]或者 mov ax,[si+di]
2) 使用bp寄存器时,指令中没有显性地指出段地址,段地址默认存储在ss中。
mov ax,[bp] ax=((ss*16)+bp)
2 机器指令处理的数据在什么地方
CPU指令在执行前一刻,关心将要处理的数据所在的位置。指令在执行前,所要处理的数据在:CPU内部寄存器、内存、端口。
3 汇编语言中数据位置的表达
汇编语言中用3个概念来表达数据位置:立即数,寄存器,段地址+偏移地址
1)对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),称为立即数
例如:mov ax,1 add bx,2000h
2)指令要处理的数据在寄存器中
例如:mov ax,bx
3)指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出偏移地址,段地址在某个段地址寄存器中,可显式给出或隐式给出。
mov ax,[bp+si+8]
mov ax,es:[bx]
4 寻址方式
当数据存放在内存中的时候,给定内存单元地址的方式成为寻址方式。
寻址方式
寻址方式 | 含义 | 名称 | 常用格式举例 |
[idata] | EA=(idata) SA=(ds) | 直接寻址 | [idata] |
[bx] | EA=(bx) SA=(ds) | 寄存器寻址 | [bx] |
[bp] | EA=(bp) SA=(ds) | ||
[si] | EA=(si) SA=(ds) | ||
[di] | EA=(di) SA=(ds) | ||
[bx+idata] | EA=(bx+idata),SA=(ds) | 寄存器相对寻址
| 用于结构体[bx].idata 用于数组 idata[si] idata[bx] 用于二位数组[bp][idata] |
[bp+idata] | EA=(bp+idata),SA=(ss) | ||
[si+idata] | EA=(si+idata),SA=(ds) | ||
[di+idata] | EA=(di+idata),SA=(ds) | ||
[bx+si] | EA=(bx+si),SA=(ds) | 基址变址寻址 | 用于二位数组[bx][si] |
[bx+di] | EA=(bx+di),SA=(ds) | ||
[bp+si] | EA=(bp+si),SA=(ss) | ||
[bp+di] | EA=(bp+di),SA=(ss) | ||
[bx+si+idata] | EA=(bx+si+idata),SA=(ds) | 相对基址变址寻址 | 用于表格结构中的数组 |
[bx+di+idata] | EA=(bx+di+idata),SA=(ds) | [bx].idata[si] | |
[bp+si+data] | EA=(bp+si+idata),SA=(ss) | 用于二位数组 | |
[bp+di+data] | EA=(bp+di+idata),SA=(ss) | Idata[bx][si] |
注意:寄存器bp的默认段地址寄存器:ss
5 指令要处理的数据有多长
8086可以处理两张尺寸数据:byte和word。
在机器指令中要致命进行的是字操作还是字节操作。
1) 通过寄存器名指明要处理的数据的尺寸。 mov ax,.bx 字操作 mov al,1 字节操作
2) 在没有寄存器名存在的情况下,用操作符word ptr或者byte ptr 指明是字操作还是字节操作。
mov word ptr ds:[0],1 字操作
mov byte ptr ds:[bx],4 字节操作
6 div指令
-除数:8位/16位,存放在寄存器或内存中;
被除数:ax或者dx:ax中(16位或32位)
若除数:8位,AL=商,AH=余数 被除数=16位
若除数:16位,AX=商,DX=余数 被输出=32位
格式:div reg/内存单元
例如:div byte ptr es:[0] 含义:al =(ax)/(es*16+0) 的商 ah =(ax)/(es*16+0)的余数
div word ptr ds:[0] 含义:ax=(dx*10000h+ax)/(ds*16+0)的商
dx=(dx*10000h+ax)/(ds*16+0)的余数
7 伪指令 dd
dd 用于定义dword(double word)双字
注:内存中是以字节空间编号,起始编号:0。参见第三章寄存器(内存访问)学习笔记。
8 操作符dup
db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字型数据)
stack segment
db 200 dup (0)
stack ends