博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编学习--第七天
阅读量:6097 次
发布时间:2019-06-20

本文共 4305 字,大约阅读时间需要 14 分钟。

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,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

 

 

转载于:https://www.cnblogs.com/Mayfly-nymph/p/11087561.html

你可能感兴趣的文章
Android主线程、子线程通信(Thread+handler)
查看>>
gitlab配置邮箱
查看>>
Win10桌面奔溃怎么办?雨林木风Win10奔溃解决方法教程
查看>>
mysql Inoodb 内核
查看>>
Redis 基础
查看>>
UITextField的returnkey点击事件
查看>>
特殊字体引用
查看>>
owlcar 用法心得 自定义导航
查看>>
数据结构 学习笔记03——栈与队列
查看>>
DB2 OLAP函数的使用(转)
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
easyui datagrid 行编辑功能
查看>>
类,对象与实例变量
查看>>
HDU 2818 (矢量并查集)
查看>>
【转】php字符串加密解密
查看>>
22. linux 常用命令
查看>>
ASP.Net 使用GridView模板删除一行的用法
查看>>