<学习笔记>王爽汇编语言__处理数据的两个基本问题

计算机进行数据的处理和运算,那么有两个基本的问题包含在其中:

(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'

(2)寄存器

指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名

例如:

mov ax , bx
mov ds , ax
push bx
mov ds:[0] , bx

(3)段地址(SA)和偏移地址(EA)

指令要处理的数据在内存中

存放地址的寄存器可以使默认的,比如:

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]

4.寻址方式

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

下面指令中,用byte ptr指明了指令访问的内存单元是一个字节单元

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储存余数。

 
7.伪指令dd
 
前面我们用db和dw定义字节型数据和字型数据。dd是用来dword(double word,双字)型数据的。
 
8.dup
 
dup是一个操作符,在汇编语言中同db,dw,dd等一样,它和db,dw,dd等数据定义伪指令使用,用来进行数据的重复,比如:
db 3 dup (0)
定义了3个字节,他们的值都是0,相当于db 0,0,0
db 3 dup (0,1,2)
定义9个字节,他们是0,1,2,0,1,2,0,1,2


你可能感兴趣的:(<学习笔记>王爽汇编语言__处理数据的两个基本问题)