用于内存寻址的寄存器
8086CPU有14个寄存器:
(1)通用寄存器:
AX (Accumulator):累加寄存器
BX (Base):基地址寄存器
CX (Count):计数器寄存器
DX (Data):数据寄存器
(2)变址寄存器:
SI (Source Index):源变址寄存器
DI (Destination Index):目的变址寄存器
(3)指针寄存器:
SP (Stack Pointer):堆栈指针寄存器
BP (Base Pointer):基指针寄存器
(4)段寄存器:
CS (Code Segment):代码段寄存器
DS (Data Segment):数据段寄存器
SS (Stack Segment):堆栈段寄存器
ES (Extra Segment):附加段寄存器
(5)指令指针寄存器: IP
(6)标志寄存器:PSW
使用原则:
(1)bx、bp、di、si寄存器可用于内存单元寻址,其中bx、di、si段地址默认在ds中,bp的段地址默认在ss中
(2)CS寄存器不允许赋值,其他DS,ES,SS可以用通用寄存器给其赋值。
处理的数据在什么地方?
1.立即数
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),称为立即数(idata ),数据包含在指令中
mov ax,1
add bx,2000h
or bx,00010000b
mov al,'a'
2.寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。
mov ax,bx
mov ds,ax
push bx
mov ds:[0],bx
push ds
mov ss,ax
mov sp,ax
3.段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,可通过[X]的格式给出EA,SA在某个寄存器中
段地址默认在ds中
mov ax,[0]
mov ax,[di]
mov ax,[bx+8]
mov ax,[bx+si]
mov ax,[bx+si+8]
段地址默认在ss中
mov ax,[bp]
mov ax,[bp+8]
mov ax,[bp+si]
mov ax,[bp+si+8]
显性的给出存放段地址的寄存器
mov ax,ds:[bp]
mov ax,es:[bx]
mov ax,ss:[bx+si]
mov ax,cs:[bx+si+8]
处理的数据有多长?
1 .通过寄存器名指明要处理的数据尺寸
字操作:
mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
字节操作:
mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100
2 . 在没有寄存器的情况下,用操作符X ptr指明内存单元长度
字操作: word ptr
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
字节操作: byte ptr
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
div 指令
div是除法指令,使用div作除法的时候:
div 除数(寄存器或内存单元,内存单元时要指明是字单元还是字节单元)
1. 除数为8位时,被除数则为16位,默认放在AX里,运算结果的商用AL存储,余数用AH存储
2. 除数为16位时,被除数则为32位,高16位放在DX里,低16位放在AX中,运算结果的商用AX存储,余数用DX存储
dup操作符
dup和db、dw、dd 等数据定义伪指令配合使用,用来进行数据的重复。
dup的使用格式
db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字数据)
eg:
db 3 dup (0)
定义了3个字节,相当于 db 0,0,0
db 3 dup (0,1,2)
定义了9个字节,相当于 db 0,1,2,0,1,2,0,1,2
db 3 dup (‘abc’ , ’ABC’)
定义了18个字节,相当于 db ‘abcABCabcABCabcABC’