计算机进行数据的处理和运算,那么有两个基本的问题包含在其中:
(1)处理的数据在什么地方
(2)要处理的数据有多长
1.关于bx , si,di,bp
(1)在8086CPU中,只有这四个寄存器可以用在[...]中来进行内存单元的寻址。
(2)在[....]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si,bx和di,bp和si,bp和di。
(3)只要在[....]中使用bp,而指令中没有显性地给出段地址,段地址就默认在ss中。
2.机器指令处理的数据在什么地方
绝大多数机器指令都是进行数据处理的指令,处理大致可以分为3类:读取,写入,运算。在机器指令这一层来讲,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理数据的位置。
3.汇编语言中数据位置的表达
汇编语言用3个概念来表达数据的位置。
(1)立即数(idata)
例如:
mov ax , 1 add bx , 2000h or bx , 00010000b mov al , 'a'
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名
例如:
mov ax , bx mov ds , ax push bx mov ds:[0] , bx
指令要处理的数据在内存中
存放地址的寄存器可以使默认的,比如:
mov ax,[0] mov ax,[di] mov ax,[bx+8] mov ax,[bx+si] mov ax,[bx+si+8]等指令,段地址默认在ds中
mov ax,[bp] mov ax,[bp+8] mov ax,[bp+si] mov ax,[bp+si+8]等指令,段地址默认在ss中
存放段地址的寄存器也可以是显性给出的,比如以下的指令
mov ax,ds:[bp] mov ax,es:[bx] mov ax,ss:[bx+si] mov ax,cs:[bx+si+8]
8086CPU有多种寻址方式:
寻址方式 含义 名称
[idata] EA=idata,SA=(ds) 直接寻址
[bx] EA=(bx),SA=(ds) 寄存器间接寻址
[si] EA=(si),SA=(ds) 寄存器间接寻址
[di] EA=(di),SA=(ds) 寄存器间接寻址
[bp] EA=(BP),SA=(ss) 寄存器间接寻址
-------------------------------------------------------------------------------------------------
[bx+idata] EA=(bx)+idata;SA=(ds) 寄存器相对寻址
[si+idata] EA=(si)+idata,SA=(ds) 寄存器相对寻址
[di+idata] EA=(di)+idata,SA=(ds) 寄存器相对寻址
[bp+idata] EA=(bp)+idata,SA=(ss) 寄存器相对寻址
-------------------------------------------------------------------------------------------------
[bx+si] EA=(bx)+(si),SA=(ds) 基址变址寻址
[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) 基址变址寻址
[bp+si+idata] EA=(bp)+(si)+idata,SA=(ss) 基址变址寻址
[bp+di+idata] EA=(bp)+(di)+idata,SA=(ss) 基址变址寻址
------------------------------------------------------------------------------------------------
5.指令要处理的数据有多长
8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。对于这个问题,汇编语言用以下方法处理。
(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 ds:[0],al mov al,ds:[0] inc al add al,100(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word和byte
例如,下面的指令,用word ptr指明了指令访问的内存单元是一个字单元
mov word ptr ds:[0],1 inc word ptr [bx] inc word ptr ds:[0] add word ptr [bx],2
mov byte ptr ds:[0],1 inc byte ptr [bx] inc byte ptr ds:[0] add byte ptr [bx],2
除此之外,PUSH指令只进行字操作
6.div指令
div是除法指令,使用div做除法的时候应该注意以下问题。
(1)除数:有8位和16位两种,在一个reg或内存单元中
(2)被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
(3)结果:如果除数为8位,则AL储存除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX储存除法操作的商,DX储存余数。
db 3 dup (0)
db 3 dup (0,1,2)定义9个字节,他们是0,1,2,0,1,2,0,1,2