bx,di,si,bp
bx:常见的通用寄存器,默认基于数据段偏移,[bx]将会在ds段地址上偏移后然后寻址
di和si:SI(source index)和DI(destination index)是8086CPU
中和bx功能相近的寄存器,但是SI和DI
不能分成两个低位的寄存器,在处理内存中的数据的过程中,只能一次将两个字节放入寄存器中
bp:(base pointer)功能和bx一致,但是[bp]默认是基于ss上的偏移后寻址,和sp一样
在[…]中,只能是这四个寄存器或者这四个寄存器的特定组合,这些组合只能是:
- bx和si
- bx和di
- bp和si
- bp和di
其他(bx和bp以及si和di)均不允许出现
寻址方式的总结
]
8086为16位CPU,支持两种尺寸的数据,byte和word(2 byte)
确定要处理的数据的长度
-
通过寄存器名字指定
mov ax,1 ;16位
mov al,1 ;8位
-
在没有出现寄存器名的情况下
mov word ptr ds:[0],1 ;一个字的长度
mov byte ptr ds:[0],1 ;一个byte长度
-
有些指令默认了访问的是字单元还是字节单元
例如push和pop指令,push指令在执行的时候,sp默认就是字形数据,过程就是先执行,sp=sp-2然后访存。pop指令执行的时候,先弹出数据,然后sp=sp+2
寻址方式的应用:
例如数据结构中的结构体:
实际上使用的就是相对基址变址寻址
]
div指令
说明
除法指令,单操作数指令
除数:8为或者16位,放在寄存器或者内存单元中
被除数:默认放在AX或者DX和AX中
当指明除数为8位,那么被除数就会去ax中找,结果也存放在ax中
当指明除数为16位,那么会利用DX和AX当做被除数,结果放在DX和AX中,如下
结果:
运算 8位 16位
商 AL AX
余数 AH DX
div指令格式:
div reg
div 内存单元
格式:
8位模式举例
div byte ptr ds:[0]
含义为:
(al) = (ax)/((ds)*16+0)
(ax) = (ax)%((ds)*16+0)
16位模式举例:
div word ptr es:[0]
含义为:
(ax)=[(dx)*10000H+ax]/((ds)+0)
(ax) =[(dx)*10000H+ax]%((ds)+0)
使用的时候,先判断被除数能不能放在一个寄存器中,也就是值是否大于65535(FFFFH),如果大于就将高位放在dx,低位放在ax。然后使用div指令,小于65535就放在ax,然后使用指令
伪指令dd
db:(define byte)定义一个字节长度的数据
dw: (define word)定义一个字长度的数据
dd: (define double word)定义2个字长度的数据
伪指令dup
示例1:
db 3 dup(0)
编译后:db 0,0,0
示例2:
db 3 dup(0,1,2)
编译后:db 0,1,2,0,1,2,0,1,2
所以:
db/dw/dd 重复的次数 dup(重复的内容长度和选择的db/dw/dd一致)