汇编学习--第七天
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