汇编语言课件2.0汇编语言讲稿07章节

上传人:w****i 文档编号:94384524 上传时间:2019-08-06 格式:PPT 页数:101 大小:506KB
返回 下载 相关 举报
汇编语言课件2.0汇编语言讲稿07章节_第1页
第1页 / 共101页
汇编语言课件2.0汇编语言讲稿07章节_第2页
第2页 / 共101页
汇编语言课件2.0汇编语言讲稿07章节_第3页
第3页 / 共101页
汇编语言课件2.0汇编语言讲稿07章节_第4页
第4页 / 共101页
汇编语言课件2.0汇编语言讲稿07章节_第5页
第5页 / 共101页
点击查看更多>>
资源描述

《汇编语言课件2.0汇编语言讲稿07章节》由会员分享,可在线阅读,更多相关《汇编语言课件2.0汇编语言讲稿07章节(101页珍藏版)》请在金锄头文库上搜索。

1、汇编语言课件,王爽 著清华大学出版社,制作工具:Microsoft PowerPoint2003,本课件由汇编网()制作提供,第7章 更灵活的定位内存地址的方法,7.1 and和or指令 7.2 关于ASCII码 7.3 以字符形式给出的数据 7.4 大小写转换的问题 7.5 bx+idata 7.6 用bx+idata的方式进行数组的处理,7.7 SI和DI 7.8 bx+si和bx+di 7.9 bx+si+idata和bx+di+idata 7.10 不同的寻址方式的灵活应用,引言,前面,我们用0、bx的方法,在访问内存的指令中,定位内存单元的地址。 在这一章中,我们主要讲解一些更灵活的

2、定位内存地址的方法和相关的编程方法。 我们的讲解将通过具体的问题来进行。,7.1 and和or指令,首先我们介绍两条指令and和or,因为我们下面的例程中要用到它们。 (1)and 指令:逻辑与指令,按位进行与运算。 如 mov al, 01100011B and al, 00111011B 执行后:al = 00100011B 通过该指令可将操作对象的相应位设为0,其他位不变。示例,7.2 关于ASCII码,世界上有很多编码方案,有种方案叫做ASCII编码,是在计算机系统中通常被采用的。 简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。 比如说,在ASCII编码方

3、案中,用 61H 表示“a”,62H表示“b”。,7.2 关于ASCII码,一种规则需要人们遵守才有意义。 一个文本编辑过程中,就包含着按照ASCII编码规则进行的编码和解码。 在文本编辑过程中,我们按一下键盘的a键,就会在屏幕上看到“a”。 这是怎样一个过程呢?,7.3 以字符形式给出的数据,我们可以在汇编程序中,用 “”的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码。 例如程序7.1,7.3 以字符形式给出的数据,assume ds:data data segment db unIX db foRK data ends code segment start:m

4、ov al,a mov bl,b mov ax,4c00h int 21h code ends end start,程序7.1,7.3 以字符形式给出的数据,上面的源程序中: “db unIX ” 相当于“db 75H,6EH,49H,58H”, “u”、 “n”、 “I”、 “X”的ASCII码分别为75H、6EH、49H、58H; “db foRK ” 相当于“db 66H,6FH,52H,4BH”, “u”、 “n”、 “I”、 “X”的ASCII码分别为66H、6FH、52H、4BH; “mov al,a”相当于“mov al,61H”,”a”的ASCII码为61H; “mov al,

5、b”相当于“mov al,62H”,”b”的ASCII码为62H。,7.4 大小写转换的问题,首先分析一下,我们知道同一个字母的大写字符和小写字符对应的 ASCII 码是不同的,比如 “A” 的 ASCII 码是41H,“a”的ASCII码是61H。 要改变一个字母的大小写,实际上就是要改变它所对应的ASCII 码。,7.4 大小写转换的问题,我们可以将所有的字母的大写字符和小写字符所对应的ASCII码列出来,进行对比,从中找到规律。 大写 二进制 小写 二进制 A 01000001 a 01100001 B 01000010 b 01100010 C 01000011 c 01100011

6、D 01000100 d 01100100,7.4 大小写转换的问题,通过对比,我们可以看出来,小写字母的ASCII码值比大写字母的ASCII码值大20H 。 这样,我们可以想到,如果将 “a” 的ASCII码值减去20H,就可以得到“A”;如果将“A”的ASCII码值加上20H 就可以得到“a”。,7.4 大小写转换的问题,按照这样的方法,我们可以将 datasg段中: 第一个字符串“BaSiC”中的小写字母变成大写; 第二个字符串,“iNfOrMaTiOn”中的大写字母变成小写。,7.4 大小写转换的问题,要注意的是: 对于字符串“BaSic”,我们应只对其中的小写字母所对应的ASCII码

7、进行减20H 的处理,将其转为大写,而对其中的大写字母不进行改变;,7.4 大小写转换的问题,要注意的是: (续) 对于字符串 “ iNforMaTIOn ” ,我们应只对其中的大写字母所对应的ASCII码进行加20H 的处理,将其转为小写; 而对于其中的小写字母不进行改变,这里面就存在着一个前提,程序必须要能够判断一个字母是大写还是小写。,7.4 大小写转换的问题,以“BaSiC”讨论,程序的流程将是这样的:,assume cs:codesg,ds:datasg datasg segment db BaSiC db iNfOrMaTiOn datasg ends codesg segment

8、 start: mov ax,datasg mov ds,ax mov bx,0 mov cx,5 s: mov al,bx 如果(al)61H,则为小写字母ASCII码,则:sub al,21H mov bx,al inc bx loop s : codesg ends end start,7.4 大小写转换的问题,判断将用到一些我们目前还没有学习到的指令。现在面临的问题是,用己学的指令来解决这个问题,则我们不能对字母的大小写进行任何判断。 但是,现实的问题却要求程序必须要能区别对待大写字母和小写字母。,7.4 大小写转换的问题,可以看出,就ASCII码的二进制形式来看,除第5位(位数从0开

9、始计算)外,大写字母和小写字母的其他各位都一样。 大写字母ASCII码的第5位(位数从0开始计算)为0,小写字母的第5位为1。,7.4 大小写转换的问题,这样,我们就有了新的方法: 一个字母,我们不管它原来是大写还是小写: 我们将它的第5位置0,它就必将变为大写字母; 将它的第5 位置1,它就必将变为小写字母。,7.4 大小写转换的问题,我们用什么方法将一个数据中的某一位置0还是置1? 当然是用我们刚刚学过的or和and指令。 完整的程序代码,7.5 bx+idata,在前面,我们可以用bx的方式来指明一个内存单元, 我们还可以用一种更为灵活的方式来指明内存单元: bx+idata表示一个内存

10、单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。,7.5 bx+idata,我们看一下指令mov ax,bx+200的含义: 将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上200,段地址在ds中。 数学化的描述为: (ax)=(ds)*16+(bx)+200),7.5 bx+idata,指令mov ax,bx+200也可以写成如下格式(常用): mov ax,200+bx mov ax,200bx mov ax,bx.200 问题,7.5 bx+idata,问题7.1 用Debug查看内存,结果如下: 2000

11、:1000 BE 00 06 00 00 00 写出下面的程序执行后,ax、bx、cx中的内容。 思考后看分析。,mov ax,2000H mov ds,ax mov bx,1000H mov ax,bx mov cx,bx+1 add cx,bx+2,7.5 bx+idata,问题7.1分析 mov ax,bx 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址在bx 中,(bx)=1000H; 指令执行后(ax)=00BEH。,7.5 bx+idata,问题7.1分析 mov cx,bx+1 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+1=1001

12、H; 指令执行后(cx)=0600H。,7.5 bx+idata,问题7.1分析 add cx,bx+2 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+2=1002H; 指令执行后(cx)=0606H。,7.6 用bx+idata的方式进行数组的处理,有了bx+idata这种表示内存单元的方式,我们就可以用更高级的结构来看待所要处理的数据。 我们通过下面的问题来理解这一点。,7.6 用bx+idata的方式进行数组的处理,在codesg中填写代码,将datasg中定义的第一个字符串,转化为大写,第二个字符串转化为小写。,assume cs:codesg,ds:dat

13、asg datasg segment db BaSiC db MinIX datasg ends codesg segment start: codesg ends end start,7.6 用bx+idata的方式进行数组的处理,按照我们原来的方法,用bx的方式定位字符串中的字符。 代码段中的程序代码:,mov ax,datasg mov ds,ax mov bx,0 mov cx,5 s: mov al,bx and al,11011111b mov bx,al inc bx loop s mov bx,5 mov cx,5 s0: mov al,bx or al,00100000b m

14、ov bx,al inc bx loop s0,7.6 用bx+idata的方式进行数组的处理,现在,我们有了 bx+idata的方式,就可以用更简化的方法来完成上面的程序。 我们观察datasg段中的两个字符串,一个的起始地址为0,另一个的起始地址为5。 我们可以将这两个字符串看作两个数组,一个从0地址开始存放,另一个从5开始存放。,7.6 用bx+idata的方式进行数组的处理,那么我们可以用0+bx和5+bx的方式在同一个循环中定位这两个字符串中的字符。 在这里,0和5给定了两个字符串的起始偏移地址,bx中给出了从起始偏移地址开始的相对地址。 这两个字符串在内存中的起始地址是不一样的,但

15、是,它们中的每一个字符,从起始地址开始的相对地址的变化是相同的。,7.6 用bx+idata的方式进行数组的处理,改进的程序:,mov ax,datasg mov ds,ax mov bx,0 mov cx,5 s: mov al,bx ;定位第一个字符串的字符 and al,11011111b mov bx,al mov al,5+bx ;定位第二个字符串的字符 or al,00100000b mov 5+bx,al inc bx loop s,7.6 用bx+idata的方式进行数组的处理,程序还可以写成这样:,mov ax,datasg mov ds,ax mov bx,0 mov cx,5 s: mov al,0bx and al,11011111b mov 0bx,al mov al,5bx or al,00100000b mov 5bx,al inc bx loop s,7.6 用bx+idata的方式进行数组的处理,如果我们用高级语言,比如C语言来描述上面的程序,大致是这样的:,char a5=“BaSiC”; char b5=“MinIX”; main() int i; i=0; do ai=ai ,7.6 用bx+idata的方式进行数组的处理,如果读者熟悉C语言的话,可以比较一下这

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号