汇编学习--第七天

1:数据寄存器,一般称之为通用寄存器组 

     8086 有8个8位数据寄存器, 
     这些8位寄存器可分别组成16位寄存器: 

AH&AL=AX:累加寄存器,常用于运算; 

BH&BL=BX:基址寄存器,常用于地址索引;

CH&CL=CX:计数寄存器,常用于计数;

DH&DL=DX:数据寄存器,常用于数据传递。 


2:地址寄存器/段地址寄存器 

     为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

CS(Code Segment):代码段寄存器; 

DS(Data Segment):数据段寄存器; 

SS(Stack Segment):堆栈段寄存器; 

ES(Extra Segment):附加段寄存器。 


3:特殊功能的寄存器 

IP(Instruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程; 

SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。 

BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; 

SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; 

DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。 

 

 

8.4 寻址方式

总共就五种,

常量---[idata]---[idata]---直接寻址

寄存器---[ax],[di]..---[bx]---(寄存器)间接寻址

常量+寄存器---[ax+idata],[bp+idata]...---[bx].idata, idata[bx], [bx][idata]---(寄存器)相对寻址

基址寄存器+变址寄存器---[bx+di],[bp+si]---[bx]---基址变址寻址

基址寄存器+变址寄存器+常量---[bx+di+idata]...---[bx].idata[di], idata[bx][di]---相对基址变址寻址

 

8.5 指令要处理的数据有多长

在汇编指令中指明是字操作还是字节操作

(1)通过寄存器名指明要处理的数据的尺寸

mov ax,1

mov bx,ds:[0]

inc ax

add ax,1000

 

mov al,1

mov al,bl

mov al,ds:[0]

inc al

add al, 100

 

(2)使用X ptr指明内存单元的长度

mov word ptr ds:[0],1

inc word ptr [bx]

inc word ptr ds:[0]

add word ptr [bx],2

 

mov word ptr ds:[0],1

inc word ptr [bx]

inc word ptr ds:[0]

add word ptr [bx],2

 

应用

mov ax,2000h
mov ds,ax
mov byte ptr [1000h],1
mov word ptr [1010h],1

 

8.6 寻址方式的综合应用

mov ax,seg
mov ds,ax
mov bx,60h

mov word ptr [bx+och],38
add word ptr [bx+oeh],70

mov si,0
mov byte ptr [bx+10h+si],'V'
inc si
mov byte ptr [bx+10h+si],'A'
inc si
mov byte ptr [bx+10h+si],'X'

 

 

8.7 div指令

(1)除数:有8位和16位两种,在一个reg或者内存单元中

(2)被除数:默认放在AX或者DX和AX中,如果除数为8位,被除数为16位,默认放在AX中;如果除数为16位,被除数为32位,在DX和AX中存放,DX存高六位,AX存低六位。

(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) = (ax) / ((ds) * 16 + (bx) + (si) + 8)的商

   (al) = (ax) / ((ds) * 16 + (bx) + (si) + 8)的余数

 

计算100001 / 100

100001 > 65535

 

计算 10001 / 100

 

 

8.8 伪指令dd

db定义字节型数据,dw定义字型数据

dd定义dword(double word)型数据

 

问题 8.1

assume cs:codesg,ds:datasg
datasg segment
    dd 100001
    dw 100
    dw 0
datasg ends
codesg segment
start:    mov ax,datasg
        mov ds,ax
        
        mov ax,ds:[0]      ;低16位储存在ax
        mov dx,ds:[2]      ;高16位储存在dx
        div word ptr ds:[4]    ;必须指明ds:[4]的大小
        mov ds:[6],ax
        
        mov ax,4c00h
        int 21h
codesg ends
end start

 

8.9 dup

assume cs:codesg,ds:datasg
datasg segment
    db 50 dup ('biu ')
datasg ends
codesg segment
        mov ax,4c00h
        int 21h
codesg ends
end

 

实验 7  寻址方式在结构化数据访问中的应用

这道出得很好,很综合的考查了前面所学知识。

 

assume cs:code,ds:data,es:table

data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的字符串 4 * 21 = 84

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的dword型数据 4 * 21 = 84

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据 2 * 21 = 42
data ends

table segment
db 21 dup ('year summ ne ?? ') ; 'year summ ne ?? ' 刚好16个字节
table ends

code segment
start:    mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax

        mov cx,21    ;外层循环每一年的情况
        mov bx,0    ;表示第几年的情况
        mov di,0    ;存储年份地址
        
        mov bp,0    ;1.获取到data段中雇员数数据 2.保存bx的值
s0:        push cx    
        mov cx,4
        mov si,0    ;表示这一年中的第几个
        
        ;年份
s:        mov al,ds:[di]        ;一位一位保存字符
        mov es:[bx+si],al
        
        ;收入
        mov al,ds:[di+54h]    
        mov es:[bx+si+5h],al
        
        inc si
        inc di
        loop s
        
        ;雇员数
        mov ax,ds:[bp+0a8h]    ;单独保存数据
        mov es:[bx+0ah],ax
        add bp,2    ;到段的下一个字的数据
        
        ;人均收入
        mov dx,es:[bx+7h]    ;高16位被除数
        mov ax,es:[bx+5h]    ;低16位被除数
        push bx    ;存放除数
        push bp    ;存放bx地址
        mov bp,bx
        mov bx,es:[bp+0ah]
        div bx
        mov es:[bp+0dh],ax        ;余数在dx中,只保存了商
        pop bp
        pop bx
        
        pop cx
        add bx,10h
        loop s0
        
        mov ax,4c00h
        int 21h
code ends
end start

 

 

posted @ 2019-06-26 01:02  Hk_Mayfly  阅读(270)  评论(0编辑  收藏  举报