reg表示一个寄存器,包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di。
sreg表示段寄存器,包括:ds、ss、cs、es。
bx、si、di、bp
8086cpu中,只有这4个寄存器可以用在[]中来进行内存单元的寻址。
在[]中,这四个寄存器可以单个出现,如果组合只能以下面四种方式组合:
bx和si、bx和di、bp和si、bp和di。
只要在[]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中。
机器指令处理的数据所在的位置
mov bx,[2] ;数据处于内存中ds:2单元
mov ax,bx ;数据处于cpu内部,bx寄存器中
mov ax,5 ;数据处于cpu内部,指令缓冲器中
汇编中数据位置的表达
- 立即数(idata):包含在指令中的数据,执行前在cpu的指令缓冲器中。
- 寄存器
- 段地址(SA)和偏移地址(EA)
在机器指令中指明处理数据的长度
8086cpu中,可以处理两种长度的数据:byte和word。
- 通过寄存器名指明要处理的数据尺寸。
例如mov ax,1
,则处理16位。mov al,1
则处理8位。 - 在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。
例如mov word ptr ds:[0],1
指明了指令访问的内存是一个字单元,mov byte ptr ds:[0],1
指明了指令访问的内存单元是一个字节单元。 - 有些指令默认了访问的是字单元还是字节单元。
例如push
指令,只进行字操作。
div指令
div为除法指令,使用时:
- 除数:8位或16位,在寄存器或内存单元中
- 被除数:默认放在ax或dx和ax中
- 当除数为8位时,被除数要为16位(ax)。运算结果将商存放在al中,余数存放在ah中。
- 当除数为16位时,被除数要为32位(ax+dx)。运算结果将商存放在ax中,余数存放在dx中。
格式为:div 内存单元
或div 寄存器
。
div word ptr [bx+si+8]
;(ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 为结果的商
;(dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8) 为结果的余数
计算100001/100;
mov dx,1
mov ax,86A1H
mov bx,100
div bx
计算1001/100;
mov ax,1001
mov bl,100
div bl
伪指令db、dw、dd
db用来定义字节型数据;
dw用来定义字型数据;
dd用来定义双字型数据。
用div计算data段中的第一个数据除以第二个数据后的结果,商放在第三个数据的内存单元中。
data degment
dd 100001
dw 100
dw 0
data ends
代码:
mov ax,data
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
dup操作符
和db、dw、dd一样,是由编译器识别处理的符号。是和db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复。
格式:db 重复次数 dup (重复的字节型数据)
,dw、dd类似。
例如:db 3 dup (0)
相当于db 0,0,0
。db 3 dup (0,1,2)
相当于db 0,1,2,0,1,2,0,1,2
。