这章要解决数据处理的两个问题:数据地址和数据长度
数据地址
数据地址就是由段地址和偏移地址组成的。在8086CPU中,段地址寄存器有:ds、cs、ss、es;偏移地址寄存器有:bx、si、di和bp
段地址寄存器
- 一般偏移地址用的是bx,而指令中也没有显性地给出段地址,则段地址寄存器默认为ds
- 一般偏移地址用的是bp,而指令中也没有显性地给出段地址,则段地址寄存器默认为ss
偏移地址寄存器
这几个寄存器要么单独使用,要么只能是(bx,bp)组和(si,di)两两组合4种方式。即如下几种(idata是指确定的数字):
mov ax,[bx]
mov ax,[bp]
mov ax,[si]
mov ax,[di]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bp+di+idata]
mov ax,[bx+si+idata]
mov ax,[bp+di+idata]
具体位置
汇编指令 | 指令执行前数据的位置 | 备注 |
---|---|---|
mov bx,[0] | 内存,[0]内存单元 | |
mov bx,ax | CPU内部,在ax寄存器里 | |
mov bx,10 | CPU内部,在指令缓冲器里 | 这种直接给出具体数字的叫做立即数 |
数据长度
8086里只能处理两种长度的数据,byte和word。在具体操作中
可以隐式地根据寄存器得到
如果是ax则是word,如果是al则是byte。
显示地指定
mov word ptr ds:[0],1
add byte ptr ds:[0],1
div
div是除法指令
- 除数:可以是8位可以是16位,一般存在除了段寄存器外的寄存器里或者内存单元里
- 被除数:默认放在ax或者ax和dx中,如果除数是8位,则被除数是16位,放在ax中,如果除数是16位,则被除数是32位,高位放在dx中,低位放在ax中。
- 结果:如果除数是8位,则al中放商,ah放余数,如果除数是16位,则ax中放商,dx中放余数。
一些伪指令
dd,dw,db
dd是双字型,占2个字
dw是单字型,占1个字
db是字符型,占1个字节
dup
配合上面的dd,dw,db使用,进行数据的重复,比如
db 3 dup(0) //相当于db 0,0,0
db 3 dup(0,1,2) //相当于db 0,1,2,0,1,2,0,1,2