《汇编语言》 第5章 bx和loop指令

上传人:努力****83 文档编号:190503494 上传时间:2023-02-28 格式:PPT 页数:103 大小:684.50KB
返回 下载 相关 举报
《汇编语言》 第5章 bx和loop指令_第1页
第1页 / 共103页
《汇编语言》 第5章 bx和loop指令_第2页
第2页 / 共103页
《汇编语言》 第5章 bx和loop指令_第3页
第3页 / 共103页
点击查看更多>>
资源描述
本课件由汇编网()制作提供第5章 bx和loop指令n5.1 bxn5.2 Loop指令n5.3 在Debug中跟踪用loop指令实现的循环程序n5.4 Debug和汇编编译器Masm对指令的不同处理n5.5 loop和bx的联合应用n5.6 段前缀n5.7 一段安全的空间 n5.8 段前缀的使用本课件由汇编网()制作提供bx和内存单元的描述nbx是什么呢?和0有些类似,0表示内存单元,它的偏移地址是0。本课件由汇编网()制作提供bx和内存单元的描述n我们要完整地描述一个内存单元,需要两种信息:n(1)内存单元的地址;n(2)内存单元的长度(类型)。n我们用0表示一个内存单元时,0 表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。本课件由汇编网()制作提供bx和内存单元的描述nbx同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:nmov ax,bxnmov al,bx 本课件由汇编网()制作提供loopn英文单词“loop”有循环的含义,显然这个指令和循环有关。本课件由汇编网()制作提供描述性符号“()”n为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号“()”来表示一个寄存器或一个内存单元中的内容。本课件由汇编网()制作提供描述性符号“()”n我们看一下(X)的应用,比如:n(1)ax中的内容为0010H,我们可以这样来描述:(ax)=0010H;n(2)2000:1000 处的内容为0010H,我们可以这样来描述:(21000H)=0010H;n(3)对于mov ax,2的功能,我们可以这样来描述:(ax)=(ds)*16+2);n(4)对于mov 2,ax 的功能,我们可以这样来描述:(ds)*16+2)=(ax);本课件由汇编网()制作提供描述性符号“()”n(5)对于 add ax,2 的功能,我们可以这样来描述:(ax)=(ax)+2;n(6)对于add ax,bx的功能,我们可以这样来描述:(ax)=(ax)+(bx);n(7)对于push ax的功能,我们可以这样来描述:(sp)=(sp)-2 (ss)*16(sp)=(ax)本课件由汇编网()制作提供描述性符号“()”n(8)对于pop ax 的功能,我们可以这样来描述:(ax)=(ss)*16+(sp)(sp)=(sp)+2本课件由汇编网()制作提供约定符号idata表示常量n我们在Debug 中写过类似的指令:mov ax,0,表示将 ds:0 处的数据送入ax中。指令中,在“”里用一个常量0表示内存单元的偏移地址。以后,我们用idata表示常量。n比如本课件由汇编网()制作提供约定符号idata表示常量n比如:nmov ax,idata就代表mov ax,1、mov ax,2、mov ax,3等。nmov bx,idata就代表mov bx,l、mov bx,2、mov bx,3等。nmov ds,idata就代表mov ds,1、mov ds,2等,它们都是非法指令。本课件由汇编网()制作提供5.1 bxn我们看一看下面指令的功能:nmov ax,bx 功能:bx 中存放的数据作为一个偏移地址EA,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中。即:(ax)=(ds*16+(bx);本课件由汇编网()制作提供5.1 bxnmov bx,ax 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。即:(ds*16+(bx)=(ax)。本课件由汇编网()制作提供5.1 bxn问题5.1 程序和内存中的情况如下图所示,写出程序执行后,21000H21007H 单元中的内容。n思考后看分析。本课件由汇编网()制作提供5.1 bxn问题5.1分析n(1)先看一下程序的前三条指令:mov ax,2000H mov ds,ax mov bx,1000H这三条指令执行后 ds=2000H,bx=1000H;本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(2)再看第4条指令:mov ax,bx指令执行前:ds=2000H,bx=1000H,则mov ax,bx将把内存2000:1000处的字型数据送入ax中。该指令执行后:ax=00beH。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(3)再看第5、6条指令:inc bx inc bx指令执行前:bx=1000H。执行后:bx=1002H。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(4)再看第7条指令:mov bx,ax 指令执行前:ds=2000H,bx=1002H,则 mov bx,ax将把ax中的数据 送入内存2000:1002处。指令执行后:2000:1002单元的内容为BE,2000:1003单元的内容为00。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(5)再看第8、9条指令:inc bx inc bx指令执行前:bx=1002H。执行后:bx=1004H。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(6)再看第10条指令:mov bx,ax 指令执行前:ds=2000H,bx=1004H,则 mov bx,ax将把ax中的数据 送入内存2000:1004处。指令执行后:2000:1004单元的内容为BE,2000:1005单元的内容为00。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(7)再看第11条指令:inc bx 指令执行前:bx=1004H。执行后:bx=1005H。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(8)再看第12条指令:mov bx,al 指令执行前:ds=2000H,bx=1005H,则 mov bx,ax将把al中的数据送 入内存2000:1005处。指令执行后:2000:1005单元的内容为BE。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(9)接下来是第13条指令:inc bx 指令执行前:bx=1005H,指令执行后:bx=1006H。本课件由汇编网()制作提供5.1 bxn问题5.1分析(续)n(10)再看第12条指令:mov bx,al 指令执行前:ds=2000H,bx=1006H,则 mov bx,ax将把al中的数据 送入内存2000:1006处。指令执行后:2000:1006单元的内容为BE。本课件由汇编网()制作提供5.2 Loop指令n指令的格式是:loop 标号,CPU 执行loop指令的时候,要进行两步操作:n(cx)=(cx)-1;n 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。本课件由汇编网()制作提供5.2 Loop指令n从上面的描述中,我们可以看到,cx中的值影响着loop指令的执行结果。n通常(注意,我们说的是通常)我们用loop指令来实现循环功能,cx 中存放循环次数。本课件由汇编网()制作提供5.2 Loop指令n这里我们讲解loop指令的功能,关于loop指令如何实现转至标号处的细节,将在后面的课程中讲解。下面我们通过一个程序来看一下loop指令的具体应用:n任务1:编程计算2 2,结果存放在ax中。任务1分析n任务2:编程计算2 3。任务2分析n任务3:编程计算2 12。任务3分析本课件由汇编网()制作提供5.2 Loop指令n任务1:编程计算22,结果存放在ax中。分析:设(ax)=2,可计算:(ax)=(ax)*2,最后(ax)中为22的值。N*2可用N+N 实现。程序代码本课件由汇编网()制作提供5.2 Loop指令n任务1:编程计算22,结果存放在ax中。程序代码:assume cs:code code segment mov ax,2 add ax,ax mov ax,4c00h int 21h code ends end本课件由汇编网()制作提供5.2 Loop指令n任务2:编程计算23。分析:23=2*2*2,若设(ax)=2,可计算:(ax)=(ax)*2*2,最后(ax)中为23的值。N*2可用N+N 实现。程序代码本课件由汇编网()制作提供5.2 Loop指令n任务2:编程计算23。程序代码:assume cs:code code segment mov ax,2 add ax,ax add ax,ax mov ax,4c00h int 21h code ends end本课件由汇编网()制作提供5.2 Loop指令n任务3:编程计算212。分析:212=2*2*2*2*2*2*2*2*2*2*2*2,若设(ax)=2,可计算:(ax)=(ax)*2*2*2*2*2*2*2*2*2*2*2,最后(ax)中为212的值。N*2可用N+N 实现。程序代码本课件由汇编网()制作提供5.2 Loop指令n任务3:编程计算212。程序代码:assume cs:code code segment mov ax,2 ;做11次add ax,ax mov ax,4c00h int 21h code ends end 按照我们的算法,计算212需要11条重复的指令add ax,ax。我们显然不希望这样来写程序,这里,可用loop来简化我们的程序本课件由汇编网()制作提供5.2 Loop指令n任务3:编程计算212。程序代码:assume cs:code code segment mov ax,2 mov cx,11 s:add ax,ax loop s mov ax,4c00h int 21h code ends end本课件由汇编网()制作提供5.2 Loop指令n程序分析:(1)标号在汇编语言中,标号代表一个地址,此程序中有一个标号s。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax。(2)loop s CPU 执行loop s的时候,要进行两步操作:(cx)=(cx)-1;判断cx 中的值,不为0 则转至标号s 所标识的地址处执行(这里的指令是“add ax,ax),如果为零则执行下一条指令(下一条指令是mov ax,4c00h)。编程计算212。程序代码:assume cs:code code segment mov ax,2 mov cx,11 s:add ax,ax loop s mov ax,4c00h int 21h code ends end本课件由汇编网()制作提供5.2 Loop指令n程序分析(续):(3)以下三条指令 mov cx,11 s:ddd ax,ax loop s 执行loop s时,首先要将(cx)减1,然后若(cx)不为0,则向前转至s处执行add ax,ax。所以,我们可以利用cx来控制add ax,ax的执行次数。n下面我们详细分析一下这段程序的执行过程,从中体会如何用cx 和loops 相配合实现循环功能。编程计算212。程序代码:assume cs:code code segment mov ax,2 mov cx,11 s:add ax,ax loop s mov ax,4c00h int 21h code ends end本课件由汇编网()制作提供5.2 Loop指令n程序的执行过程:mov cx,11 s:add ax,ax loop s(1)执行mov cx,11,设置(cx)=11;(2)执行add ax,ax(第1次);(3)执行loop s 将(cx)减1,(cx)=10,(cx)不为0,所以转至s处;(4)执行add ax,ax(第2次);(5)执行loop s 将(cx)减1,(cx)=9,(cx)不为0,所以转至s处;本课件由汇编网()制作提供5.2 Loop指令n程序的执行过程:mov cx,11 s:add ax,ax loop s (6)执行add ax,ax(第3次);(7)执行loop s 将(cx)减1,(cx)=8,(cx)不为0,所以转至s处;(8)执行add ax,ax(第4次);(9)执行loop s 将(cx)减1,(cx)=7,(cx)不为0,所以转至s处;本课件由汇编网()制作提供5.2 Loop指令n程序的执行过程:mov cx,11 s:add ax,ax loop s(10)执行add ax,ax(第5次);(11)执行loop s 将(cx)减1,(cx)=6,(cx)不为0,所以转至s处;(12)执行add ax,ax(第6次);(13)执行loop s 将(cx)减1,(cx)=5,(cx)不为0,所以转至s处;本课件由汇编网()制作提供5.2 Loop指令n程序的执行过程:mov cx,11 s:add ax,ax loop s (14)执行add ax,ax(第7次);(15)执行loop s 将(cx)减1,(cx)=4,(cx)不为0,所以转至s处;(16)执行add ax,ax(第8次);(17)执行loop s 将(cx)减1,(cx)=3,(cx)不为0,所以转至s处;本课件由汇编网()制作提供5.2 Loop指令n程序的执行过程:mov cx,11 s:add ax,ax loop s(18)执行add ax,ax(第9次);(19)执行loop s 将(cx)减1,(cx)=2,(cx)不为0,所以转至s处;(20)执行add ax,ax(第10次);(21)执行loop s 将(cx)减1,(cx)=1,(cx)不为0,所以转至s处;本课件由汇编网()制作提供5.2 Loop指令n程序的执行过程:mov cx,11 s:add ax,ax loop s(22)执行add ax,ax(第11次);(23)执行loop s 将(cx)减1,(cx)=0,(cx)为0,所以向下执行。(结束循环)本课件由汇编网()制作提供5.2 Loop指令n从上面的过程中,我们可以总结出用cx和loop 指令相配合实现循环功能的三个要点:n(1)在cx中存放循环次数;n(2)loop 指令中的标号所标识地址要在前面;n(3)要循环执行的程序段,要写在标号和loop 指令的中间。本课件由汇编网()制作提供5.2 Loop指令n用cx和loop指令相配合实现循环功能的程序框架如下:mov cx,循环次数 s:循环执行的程序段 loop s 本课件由汇编网()制作提供5.2 Loop指令n问题5.2n用加法计算123 x236,结果存在ax 中。n思考后看分析。n分析:可用循环完成,将123加236次。可先设(ax)=0,然后循环做236次(ax)=(ax)+123。n程序代码本课件由汇编网()制作提供5.2 Loop指令n问题5.2程序代码 assume cs:code code segment mov ax,0 mov cx,236 s:add ax,123 loop s mov ax,4c00h int 21h code ends end本课件由汇编网()制作提供5.2 Loop指令n问题5.3 改进问题5.2程序,提高123x236 的计算速度。n思考后看分析。n分析:问题5.2程序做了236 次加法,我们可以将236 加123次。可先设(ax)=0,然后循环做123次(ax)=(ax)+236,这样可以用123 次加法实现相同的功能。n程序代码请自行实现。(参考代码)本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n考虑这样一个问题,计算ffff:0006单元中的数乘以3,结果存储在dx中。我们分析一下:n(1)运算后的结果是否会超出dx所能存储的范围?ffff:0006 单元中的数是一个字节型的数据,范围在0255之间,则用它和3相乘结果不会大于65535,可以在dx 中存放下。本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n分析:n(2)我们用循环累加来实现乘法,用哪个寄存器进行累加?我们将ffff:0006单元中的数赋值给ax,用dx进行累加。先设(dx)=0,然后做3次(dx)=(dx)+(ax)。n(3)ffff:0006单元是一个字节单元,ax是一个 16 位寄存器,数据长度不一样,如何赋值?本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n注意,n我们说的是“赋值”,就是说,让 ax 中的数据的值(数据的大小)和ffff:0006 单元中的数据的值(数据的大小)相等。n8 位数据01H和16位数据0001H的数据长度不一样,但它们的值是相等的。本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n那么我们如何赋值?n设ffff:0006单元中的数据是XXH,若要ax中的值和ffff:0006单元中的相等,ax中的数据应为00XXH。所以,若实现ffff:0006单元向ax 赋值,我们应该令(ah)=0,(al)=(ffff6H)。n实现计算ffff:0006单元中的数乘以3,结果存储在dx中的程序代码。本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序assume cs:codecode segmentmov ax,0ffffhmov ds,axmov bx,6mov al,bxmov ah,0mov dx,0mov cx,3s:add dx,axloop smov ax,4c00hint 21hcode endsendn注意程序中的第一条指令mov ax,0ffffh。n我们知道大于9FFFH的十六进制数据A000H、A001H、C000H、C001H、FFFEH、FFFFH等,在书写的时候都是以字母开头的。n而在汇编源程序中,数据不能以字母开头,所以要在前面加0。本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n下面我们对程序的执行过程进行跟踪。n首先,我们将它编辑为源程序文件,文件名定为 p3.asm;对其进行编译连接后生成p3.exe;然后再用Debug对p3.exe中的程序进行跟踪。n源程序p3.asm本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n上面,我们通过对一个循环程序的跟踪,更深入一步地讲解了 loop指令实现循环的原理。n下面,我们将前面的程序改一下,计算 ffff:0006单元中的数乘以 123,结果存储在dx中。n更改程序:只要将寻循环次数改为123。本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n程序源码 Debug加载 跟踪本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序nDebug执行“g 0012”后,CS:0012前的程序段被执行,从各个相关的寄存器中的值,我们可以看出执行的结果:本课件由汇编网()制作提供5.3 在Debug中跟踪用loop指令实现的循环程序n我们跟踪两次循环的过程,可以确定循环程序段在逻辑上是正确的。n我们不想再继续一步一步的观察循环的过程了,因为还要进行 121((cx)=79h)次循环,我们希望将循环一次执行完,显然 T命令不可行,我们可以使用P命令来达到目的。n再次遇到loop指令时,使用P命令来执行。Debug就会自动重复执行循环中的指令,直到(cx)=0为止。本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理n 本节只试点为下面刻成的顺利进行提供一点预备知识。n我们在Debug中写过类似的指令:mov ax,0 表示将ds:0处的数据送入al中。n但是在汇编元程序中,指令“mov ax,0”被编译器当作指令“mov ax,0”处理。n示例本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理n示例任务:将内存2000:0、2000:1、2000:2、2000:3单元中的数据送入al,bl,cl,dl中。n(1)在Debug中编程实现n(2)汇编程序实现n两种实现的实际实施情况本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理n在Debug中编程实现:mov ax,2000hmov ds,axmov al,0mov bl,1mov cl,2mov dl,3本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理n汇编程序实现:assume cs:code code segmentmov ax,2000hmov ds,axmov al,0mov bl,1mov cl,2mov dl,3mov ax,4c00hint 21hcode endsend本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理nDebug中的情况:本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理n将汇编源程序存储为compare.asm用masm、link生成compare.exe,用debug加载compare.exe,如图:本课件由汇编网()制作提供5.4 Debug和汇编编译器Masm对指令的不同处理n如果我们希望在汇编源程序中使用idata操作,我们可以这样访问(以2000:0单元为例):mov ax,2000h mov ds,ax mov al,ds:0 ;ds:称为段前缀段前缀本课件由汇编网()制作提供 段前缀n指令“mov ax,bx”中,内存单元的偏移地址由bx给出,而段地址默认在ds中。n我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。如:mov ax,es:bx本课件由汇编网()制作提供 段前缀n这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀。本课件由汇编网()制作提供5.5 loop和bx的联合应用n考虑这样一个问题:计算ffff:0ffff:b单元中的数据的和,结果存储在dx中。n我们还是先分析一下本课件由汇编网()制作提供5.5 loop和bx的联合应用n计算ffff:0ffff:b单元中的数据的和,结果存储在dx中。n分析:(1)运算后的结果是否会超出 dx 所能存储的范围?ffff:0ffff:b内存单元中的数据是字节型数据,范围在0255之间,12个这样的数据相加,结果不会大于 65535,可以在dx中存放下。本课件由汇编网()制作提供5.5 loop和bx的联合应用n计算ffff:0ffff:b单元中的数据的和,结果存储在dx中。n分析:(2)我们是否将 ffff:0ffff:b中的数据直接累加到dx中?当然不行,因为ffff:0ffff:b中的数据是8位的,不能直接加到16位寄存器dx中。本课件由汇编网()制作提供5.5 loop和bx的联合应用n计算ffff:0ffff:b单元中的数据的和,结果存储在dx中。n分析:(3)我们能否将ffff:0ffff:b中的数据累加到dl中,并设置(dh=0,从而实现累加到dx中的目标?这也不行,因为dl是8位寄存器,能容纳的数据的范围在小 255 之间,ffff:0ffff:b中的数据也都是 8 位,如果仅向dl中累加12个 8 位数据,很有可能造成进位丢失。本课件由汇编网()制作提供5.5 loop和bx的联合应用n计算ffff:0ffff:b单元中的数据的和,结果存储在dx中。n分析:(4)我们到底怎样将用ffff:0ffff:b中的8位数据,累加到16位寄存器dx中?本课件由汇编网()制作提供5.5 loop和bx的联合应用n从上面的分析中,我们可以看到,这里面有两个问题:类型的匹配和结果的不超界。n具体的说,就是在做加法的时候,我们有两种方法:(dx)=(dx)+内存中的8位数据:(dl)=(dl)+内存中的8 位数据;第一种方法中的问题是两个运算对象的类型不匹配,第二种方法中的问题是结果有可能超界。本课件由汇编网()制作提供5.5 loop和bx的联合应用n计算ffff:0ffff:b单元中的数据的和,结果存储在dx中。n分析:怎样解决这两个看似矛盾的问题?目前的方法(在后面的课程中我们还有别的方法)就是我们得用一个16位寄存器来做中介。本课件由汇编网()制作提供5.5 loop和bx的联合应用n我们将内存单元中的 8 位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。想清楚以上的问题之后,我们编写程序代码(p105.asm)。本课件由汇编网()制作提供5.5 loop和bx的联合应用n问题5.4 应用loop 指令,改进程序5.5,使它的指令行数让人能够接受。思考后看分析。本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:可以看出,在程序中,有12个相似的程序段,我们将它们一般化地描述为:mov al,ds:x mov ah,0 add dx,ax 我们可以看到,12个相似的程序段中,只有mov al,ds:X指令中的内存单元的偏移地址是不同的,其他都一样。本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:(续)而这些不同的偏移地址是可在0X0bH的范围内递增变化的。我们可以用数学语言来描述这个累加的运算:bh00 x)xh100ffffh(sum本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:(续)从程序实现上,我们将循环做:(al)=(ds)*16+X)(ah)=0 (dx)=(dx)+(ax)一共循环12次,在循环开始前(dx)=0ffffh,X=0,ds:X指向第一个内存单元。每次循环后,X递增,ds:X指向下一个内存单元。本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:(续)完整的算法描述 初始化:(ds)=0ffffhX=0(dx)=0 循环12次:(al)=(ds)*16+X)(ah)=0(dx)=(dx)+(ax)X=X+1 本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:(续)可见,表示内存单元偏移地址的X应该是一个变量,因为在循环的过程中,偏移地址必须能够递增。这样,在指令中,我们就不能用常量来表示偏移地址。我们可以将偏移地址放到 bx中,用bx的方式访问内存单元。本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:(续)在循环开始前设(bx)=0,每次循环,将bx中的内容加1即可。最后一个问题是,如何实现循环12次?我们的loop指令该发挥作用了。更详细的算法描述。本课件由汇编网()制作提供5.5 loop和bx的联合应用n分析:(续)更详细的算法描述初始化 (ds)=0ffffh (bx)=0 (dx)=0 (cx)=12 循环12 次:s:(al)=(ds)*16+(bx)(ah)=0 (dx)=(dx)+(ax)(bx)=(bx)+1 loopsn 写出程序(p108.asm)本课件由汇编网()制作提供5.5 loop和bx的联合应用n在实际编程中,经常会遇到,用同一种方法处理地址连续的内存单元中的数据的问题。n我们需要用循环来解决这类问题,同时我们必须能够在每次循环的时候按照同一种方法来改变要访问的内存单元的地址。本课件由汇编网()制作提供5.5 loop和bx的联合应用n这时,我们就不能用常量来给出内存单元的地址(比如0、1、2中,0、1、2是常量),而应用变量。n“mov al,bx”中的 bx就可以看作一个代表内存单元地址的变量,我们可以不写新的指令,仅通过改变bx中的数值,改变指令访问的内存单元。本课件由汇编网()制作提供5.7 一段安全的空间n在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段空间中可能存放着重要的系统数据或代码。n比如下面的指令:mov ax,1000h mov ds,ax mov al,0 mov ds:0,al本课件由汇编网()制作提供5.7 一段安全的空间n我们以前在Debug中,为了讲解上的方便,写过类似的指令。n但这种做法是不合理的,因为之前我们并没有论证过 1000:0中是否存放着重要的系统数据或代码。n如果1000:0中存放着重要的系统数据或代码,“mov ds:0,al”将其改写,将引发错误。n比如程序(p110.asm)本课件由汇编网()制作提供5.7 一段安全的空间n上图是在Windows2000的DOS方式中,在Debug里执行“mov 0026,ax”的结果。如果在实模式(即纯DOS方式)下执行程序p7.exe,将会引起死机。产生这种结果的原因是0:0026处存放着重要的系统数据,而“mov 0026,ax”将其改写。本课件由汇编网()制作提供5.7 一段安全的空间n可见,我们在不能确定一段内存空间中是否存放着重要的放据或代码的时候,不能随意向其中写入内容。n不要忘记,我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。本课件由汇编网()制作提供5.7 一段安全的空间n同样不能忘记,我们正在学习的是汇编语言,要通过它来获得底层的编程体验,理解计算机底层的基本工作机理。所以我们尽量直接对硬件编程,而不去理会操作系统。本课件由汇编网()制作提供5.7 一段安全的空间n我们似乎面临一种选择,是在操作系统中安全、规矩地编程,还是自由、直接地用汇编语言去操作真实的硬件,了解那些早己被层层系统软件掩盖的真相?在大部分的情况下,我们选择后者,除非我们就是在学习操作系统本身的内容。n注意本课件由汇编网()制作提供5.7 一段安全的空间n注意:我们在纯DOS方式(实模式)下,可以不理会DOS,直接用汇编语言去操作真实的硬件,因为运行在CPU实模式下的DOS,没有能力对硬件系统进行全面、严格地管理。本课件由汇编网()制作提供5.7 一段安全的空间n注意:(续)但在Windows 2000、UNIX这些运行于CPU保护模式下的操作系统中,不理会操作系统,用汇编语言去操作真实的硬件,是根本不可能的。硬件已被这些操作系统利用CPU保护模式所提供的功能全面而严格地管理了。本课件由汇编网()制作提供5.7 一段安全的空间n在后面的课程中,我们需要直接向内存中写入内容,可我们又不希望发生图5.17中的那种情况。所以要找到一段安全的空间供我们使用。在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:2000:2FF(0:200h0:2FFh)的256 个字节的空间。所以,我们使用这段空间是安全的。本课件由汇编网()制作提供5.7 一段安全的空间n不过为了谨慎起见,在进入DOS后,我们可以先用Debug 查看一下,如果0:2000:2FF单元的内容都是0的话,则证明DOS 和其他合法的程序没有使用这里。n为什么DOS和其他合法的程序一般都不会使用0:2000:2FF这段空间?我们将在以后的课程中讨论这个问题。本课件由汇编网()制作提供5.7 一段安全的空间n好了,我们总结一下:n(1)我们需要直接向一段内存中写入内容;n(2)这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。n(3)DOS方式下,一般情况,0:2000:2FF 空间中没有系统或其他程序的数据或代码;n(4)以后,我们需要直接向一段内存中写入内容时,就使用0:2000:2FF这段空间。本课件由汇编网()制作提供5.8 段前缀的使用n我们考虑一个问题:将内存ffff:0ffff:b段元中的数据拷贝到 0:2000:20b单元中。分析一下n程序代码 n改进的程序代码本课件由汇编网()制作提供5.8 段前缀的使用n分析一下:n(1)0:2000:20b单元等同于0020:00020:b单元,它们描述的是同一段内存空间:n(2)拷贝的过程应用循环实现,简要描述如下:初始化:X=0 循环12次:将ffff:X单元中的数据送入0020:X(需要用一个寄存器中转)X=X+1本课件由汇编网()制作提供5.8 段前缀的使用n分析一下:(续)n(3)在循环中,源单元ffff:X和目标单元的0020:X的偏移地址X是变量。我们用bx来存放。n(4)我们将0:2000:20b用0020:00020:b描述,就是为了使目标单元的偏移地址和源始单元的偏移地址从同一数值0开始。本课件由汇编网()制作提供5.8 段前缀的使用本课件由汇编网()制作提供5.8 段前缀的使用n因源单元ffff:X和目标单元0020:X 相距大于64KB,在不同的64KB段里,程序中,每次循环要设置两次ds。n这样做是正确的,但是效率不高。n我们可以使用两个段寄存器分别存放源单元ffff:X和目标单元0020:X的段地址,这样就可以省略循环中需要重复做12次的设置ds的程序段。本课件由汇编网()制作提供5.8 段前缀的使用本课件由汇编网()制作提供5.8 段前缀的使用n改进的程序中,使用 es 存放目标空间0020:00020:b的段地址,用ds存放源空间ffff:0ffff:b的段地址。n在访问内存单元的指令“mov es:bx,al”中,显式地用段前缀“es:”给出单元的段地址,这样就不必在循环中重复设置ds。小结
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!