实验8汇编实验.doc
《实验8汇编实验.doc》由会员分享,可在线阅读,更多相关《实验8汇编实验.doc(8页珍藏版)》请在咨信网上搜索。
实验八 编写子程序(4学时) 在本次实验中,我们将编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。同前面的所有实验一样,这个实验室必须独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。 1、 显示字符串 显示字符串是下现实工作中经常要用到的功能,应该编写一个通用的字程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。 该子程序描述如下: 名称:show_str 功能:在指定位置用指定颜色显示一个用0结束的字符串。 参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址。 返回:无 应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。 assume cs: code data segment db ‘Wele to masm!’, 0 data ends code segment start: mov dh, 8 mov dl, 3 mov cl, 2 mov ax, data mov ds, ax mov si, 0 call show_str mov ax, 4c00h int 21h show_str: : : : code ends end start 提示: (1) 子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系; (2) 注意保存子程序中用到的相关寄存器; (3) 这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。通过调用这个子程序,进行字符串的显示时可以不必了解显存的结果,为编程提供了方便。在实验中,注意体会这种设计思想。 data segment db "Wele to masm!" data ends stack segment db "Wele to masm!" stack ends code segment start: mov dh, 8 mov dl, 3 mov cl, 2 mov ax, data mov ds, ax mov si, 0 mov ax,0B800h mov es,ax mov ax, stack mov ss, ax mov sp,10h call show_str mov ax, 4c00h int 21h show_str: push dx push cx mov al,160 dec dh mul dh mov bx,ax add dx,si add dl,dl add bl,dl mov cl,[si] mov ch,0 jcxz ok mov es:[bx],cl pop cx mov es:[bx+1],cl inc si pop dx jmp short show_str ok: pop cx pop dx ret code ends end start 2、 解决除法溢出的问题 前面讲过,div指令可以做除法。当进行8位除法的时候,用al存储商,ah存储余数;进行16位除法时,用ax存储商,dx存储余数。可是,现在有一个问题,如果结果的商大于al或ax所能存储的最大值,那么将如何? 比如,下面的程序段: mov bh, 1 mov ax, 1000 div bh 进行的是8位除法,商为1000,而1000在al中放不下。 又比如,下面的程序段: mov ax, 1000H mov dx, 1 mov bx, 1 div bx 进行的是16位除法,商为11000H,而11000H在ax中放不下。 我们在用div指令做除法的时候,和可能发生上面的情况:结果的商过大,超出了寄存器所能存储的范围。当CPU执行div等除法指令时,如果发生这样的情况,将引发CPU的一个内部错误,这个错误被称为:除法溢出。我们可以通过特殊的程序来处理这个错误,但在这里我们不讨论这个错误的处理,这是后面课程中要涉及的内容。下面我们仅仅来看一下除法发生时的一些现象,如同8.1所示。 图8.1 除法溢出时发生的现象 图中展示了在Windows 2000中使用Debug执行相关程序段的结果,div指令引发了CPU的除法溢出,系统对其进行了相关的处理。 至此,我们已经清楚了问题所在;用div指令做除法的时候可能产生除法溢出。由于有这样的问题,在进行除法运算时要注意除数和被除数的值,比如1000000/10就不能用div指令来计算。那么怎么办呢?我们用下面的子程序divdw解决。 该子程序的描述如下: 名称:divdw 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。 参数: (ax)=dword型数据的低16位;(dx)=dword型数据的高16位;(cx)=除数 返回:(ax)=商的低16位;(dx)=商的高16位;(cx)=余数 应用举例:计算1000000/10(F424H/0AH) mov ax, 4240H mov dx, 000FH mov cx, 0AH call divdw 结果:(ax)=86A0H,(dx)=0001H, (cx)=0. 提示: 给出一个公式: X: 被除数,范围:[0,FFFFFFFF] N: 除数,范围: [0,FFFF] H: X高16位,范围: [0,FFFF] L: X低16位,范围: [0,FFFF] int(): 描述性运算符,取商,比如int(38/10)=3 rem(): 描述性运算符,取余数,比如rem(38/10)=8 公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N 这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算。公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致除法溢出。(关于这个公式的推导,有兴趣的同学可参见王爽所著《汇编语言》的附注5. 代码: assume cs: code data segment db "Wele to masm!",0 data ends stack segment db "Wele to masm!" stack ends code segment start: mov ax, 4240H mov dx, 000FH mov cx, 0AH call divdw mov ax, 4c00h int 21h divdw: push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx ret code ends end start 3、 数值显示 编程实现将data段中的数据以十进制的形式显示出来。 data segment dw 123, 12666, 1, 8, 3, 38 data ends 这些数据在内存中都是二进制信息,标记了数值的大小。要把它们显示到屏幕上,成为我们能够读懂的信息,需要进行信息的转化。比如,数值12666,在机器中存储为二进制信息:0011000101111010B(317AH),计算机可以理解它。而要在显示器上读到可以理解的数值12666,我们看到的应该是一串字符:“12666”。由于显卡遵循的是ASCII编码,为了让我们能在显示器上看到这串字符,它在机器中应以ASCII码的形式存储为:31H, 32H, 36H, 36H, 36H(字符“0”~“9”对应的ASCII码为30H~39H). 通过上面的分析可以看到,在概念世界中,有一个抽象的数据12666,它表示了一个数值的大小。在现实世界中它可以有多种表示形式,可以在电子机器中以高低电平(二进制)的形式存储,也可以在纸上、黑板上、屏幕上以人类的语言“12666”来书写。现在,我们面临的问题的就是,要将同一抽象的数据从一种表示形式转化为另一种表示形式。 可见,要将数据用十进制形式显示到屏幕上,要进行两步工作: (1) 将用二进制信息存储的数据转变为十进制形式的字符串; (2) 显示十进制形式的字符串。 第二步我们在本次实验的第一个子程序中已经实现,在这里只要调用一下show_str即可。我们来讨论第一步,因为将二进制信息转变为十进制形式的字符串也是经常要用到的功能,我们应该为它编写一个通用的子程序。 该子程序的描述如下: 名称: dtoc 功能: 将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。 参数: (ax)=word型数据,ds:si指向字符串的首地址。 返回: 无 应用举例: 编程实现将数据12666以十进制形式在屏幕的8行3列用绿色显示出来。在显示时我们调用本次实验中的第一个子程序show_str。 assume cs: code data segment db 10 dup (0) data ends code segment start: mov ax, 12666 mov bx, data mov ds, bx mov si, 0 call dtoc mov dh, 8 mov dl, 3 mov cl, 2 call show_str : : : code ends end start 提示: 下面我们对这个问题进行一下简单的分析。 (1) 要得到字符串“12666”,就是要得到一列表示该字符串的ASCII码:31H, 32H, 36H, 36H, 36H。 十进制数码字符对应的ASCII码=十进制数码值+30H。 要得到表示十进制数的字符串,先求十进制数每位的值。 例:对于12666,先求得每位的值:1,2,6,6,6。再将这些数分别加上30H,便得到了表示12666的ASCII码串: 31H, 32H, 36H, 36H, 36H。 (2) 那么,怎样得到每位的值呢?采用除基取余法: 余数 10 | 1 2 6 6 6 6 10 | 1 2 6 6 6 10 | 1 2 6 6 10 | 1 2 2 10 | 1 1 0 可见,用基数10除12666,共除5次,记下每次的余数,就得到了每位的值。 (3) 综合上面的分析,可得到处理过程如下: 用12666除以10,循环5次,记下每次的余数;将每次的余数分别加上30H,便得到了表示十进制数的ASCII码串。如下: 余数 +30H ASCII码串 字符串 10 | 1 2 6 6 6 6 36H ‘6’ 10 | 1 2 6 6 6 36H ‘6’ 10 | 1 2 6 6 36H ‘6’ 10 | 1 2 2 32H ‘2’ 10 | 1 1 31H ‘1’ 0 (4) 对(3)的质疑。 在已知数据是12666的情况下,知道进行5次循环。可在实际问题中,数据的值是多少程序员并不知道,也就是说,程序员不能事先确定循环次数。 那么,如何确定数据各位的值已经全部求出来了呢?我们可以看出,只要是除到商为0,各位的值就已经全部求出。可以使用jcxz指令来实现相关的功能。 代码: assume cs: code data segment db 10 dup (0) data ends code segment start: mov ax, 12666 mov bx, data mov ds, bx mov bx,0B800h mov es,bx mov si, 0 call dtoc mov dh, 8 mov dl, 3 mov cl, 2 call show_str mov ax, 4c00h int 21h dtoc: mov bx,10 mov dx,0 div bx mov cx,ax mov [si],dx add byte ptr [si],30h inc si jcxz ok1 jmp short dtoc ok1: ret show_str: push dx push cx mov al,160 dec dh mul dh mov bx,ax add dx,si add dl,dl add bl,dl mov cx,si jcxz ok mov cl,[si] mov es:[bx],cl pop cx mov es:[bx+1],cl dec si pop dx jmp short show_str ok: pop cx pop dx ret code ends end start- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 汇编
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【1587****927】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【1587****927】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【1587****927】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【1587****927】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文