汇编-8.0-数据处理

1.计算机是进行数据处理、运算的机器,在机器指令中,必须明确给以隐含的说明,否则计算机就无法工作。

(1).处理数据的位置

(2).处理数据的长度

2.使用描述性的符号reg(表示一个寄存器)和sreg(表示一个段寄存器)

(1).reg集合包括:

ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di

(2).sreg包括:ds,ss,cs,es.

3.bx、si、di和bp

(1).只有bx、si、di和bp这四个寄存器可以在“[...]”中进行内存单元的寻址。

(2)[...]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di.

(3).只要在[...]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中。

4.机器指令处理数据的位置

绝大多数机器指令都是进行数据处理的指令,处理大致可以分为3类:读取,写入,运算。

在指令执行前一刻,需要知道机器将要处理的数据所在的位置。

在执行前,所要处理的数据可以在3个地方:CPU内部,内存,端口。

5.汇编语言中数据位置的表达

汇编语言用3个概念来表达数据的位置:

(1).立即数(idata)

对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲区中),在汇编语言称为立即数(idata),在汇编指令中直接给出。

(2).寄存器

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

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

指令要处理的数据在内存中,在汇编指令中可以用[X]的格式给出EA,SA在某个段寄存器中。

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

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]    含义:(ax)=((ds)*16+(bp))

6.寻址方式

当数据存放在内存中的时候,可以使用多种方式来给定这个内存单元的偏移地址。这样的定位内存单元的方法称为寻址方式。

7.指令要处理数据的长度

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 al,ds:[0],ax

inc al

add al,1000

(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

word ptr指明指令访问的内存单元是一个字节单元:

mov byte ptr ds:[0],1

inc byte ptr [bx]

inc byte ptr ds:[0]

add byte ptr [bx],2

在没有寄存器参与的内存单元访问指令中,用word ptr和byte ptr显性指明指令访问的内存单元长度很有必要。否则,CPU无法知道所要访问的单元是字单元还是字节单元。

(3)有些指令默认访问的是字单元还是字节单元,如,push指令只进行字操作。

8.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存储除法操作的余数。

格式:

div reg

div 内存单元

如:

div byte ptr ds:[0]

含义:(al)=(ax)/((ds)*16+0)的商

      (ah)=(ax)/((ds)*16+0)的余数

div word ptr es:[0]

含义:(ax)=[(dx)*10000H+(ax)]/((es)*16+0)的商

(dx)=[(dx)*10000H+(ax)]/((es)*16+0)的余数

div byte ptr [bx+si+8]

含义:(al)=[(ds)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的商

含义:(ah)=[(ds)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的余数

div word ptr [bx+si+8]

含义:(al)=(ax)/((ds)*16+(bx)+(si)+8)的商

含义:(ah)=(ax)/((ds)*16+(bx)+(si)+8)的余数

9.伪指令dd

db和dw定义字节型数据和字型数据。dd是用来定义dword(double word,双字)型数据。

9.dup

dup是一个操作符,在汇编语言中,db,dw,dd等是一样的,也是由编译器识别处理的符号。它是和db,dw,dd等数据定义伪指令配合使用,用来进行数据重复。如:

db 3 dup (0)

定义了3个字节,他们的值都是0,相当于db0,0,0.

db 3 dup (0,1,2)

定义了9个字节,他们是0、1、2、0、1、2、0、1、2;相当于db 0,1,2,0,1,2,0,1,2.

定义一个容量位200个字节的栈段:

stack segment

db 200 dup (0)

stack ends

 

posted @ 2018-08-01 21:22  西贡小傻  Views(234)  Comments(0Edit  收藏  举报