1:数据寄存器,一般称之为通用寄存器组
8086 有8个8位数据寄存器, 这些8位寄存器可分别组成16位寄存器:2:地址寄存器/段地址寄存器 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:AH&AL=AX:累加寄存器,常用于运算;
BH&BL=BX:基址寄存器,常用于地址索引;
CH&CL=CX:计数寄存器,常用于计数;
DH&DL=DX:数据寄存器,常用于数据传递。
3:特殊功能的寄存器CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
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,1mov bx,ds:[0]inc axadd ax,1000
mov al,1mov al,blmov al,ds:[0]inc aladd al, 100
(2)使用X ptr指明内存单元的长度
mov word ptr ds:[0],1inc word ptr [bx]inc word ptr ds:[0]add word ptr [bx],2
mov word ptr ds:[0],1inc word ptr [bx]inc word ptr ds:[0]add word ptr [bx],2
应用
mov ax,2000hmov ds,axmov byte ptr [1000h],1mov word ptr [1010h],1
8.6 寻址方式的综合应用
mov ax,segmov ds,axmov bx,60hmov word ptr [bx+och],38add word ptr [bx+oeh],70mov si,0mov byte ptr [bx+10h+si],'V'inc simov byte ptr [bx+10h+si],'A'inc simov 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:datasgdatasg segment dd 100001 dw 100 dw 0datasg endscodesg segmentstart: 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 21hcodesg endsend start
8.9 dup
assume cs:codesg,ds:datasgdatasg segment db 50 dup ('biu ')datasg endscodesg segment mov ax,4c00h int 21hcodesg endsend
实验 7 寻址方式在结构化数据访问中的应用
这道出得很好,很综合的考查了前面所学知识。
assume cs:code,ds:data,es:tabledata segmentdb '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 = 84dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;以上是表示21年公司总收入的dword型数据 4 * 21 = 84dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;以上是表示21年公司雇员人数的21个word型数据 2 * 21 = 42data endstable segmentdb 21 dup ('year summ ne ?? ') ; 'year summ ne ?? ' 刚好16个字节table endscode segmentstart: 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 21hcode endsend start