第5章模块化程序设计(共12页).doc

上传人:飞****2 文档编号:27101667 上传时间:2022-07-22 格式:DOC 页数:12 大小:38KB
返回 下载 相关 举报
第5章模块化程序设计(共12页).doc_第1页
第1页 / 共12页
第5章模块化程序设计(共12页).doc_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《第5章模块化程序设计(共12页).doc》由会员分享,可在线阅读,更多相关《第5章模块化程序设计(共12页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上第5章 模块化程序设计5.1 简答题(1)指令“CALL EBX”采用了指令的什么寻址方式?寄存器间接寻址(2)为什么MASM要求使用proc定义子程序?(这个问题不好回答,是不是作者写错了?我猜测可能的原因: 在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序 )(3)为什么特别强调为子程序加上必要的注释?便于程序员调用时使用,而不必关注子程序的内部实现。(4)参数传递的“传值”和“传址”有什么区别?传值是传递参数的拷贝,传址是传递参数的地址(5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?保证正确返回;释放传递参数占用的堆栈空间,避免多次

2、调用可能导致的堆栈溢出(6)INCLUDE语句和INCLUDELIB有什么区别?INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件(7)什么是子程序库?子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用(8)调用宏时没有为形参提供实参会怎样?缺少的实参,形参会做“空”处理。(9)宏定义体中的标号为什么要用local为指令声明?为了避免宏展开后出现标示符不唯一的情况,定义为局部。(10)条件汇编不成立的语句会出现在可执行文件中吗?不会。5.2 判断题(1)过程定义proc是一条处理器指令。错

3、,proc是伪指令(2)CALL指令的执行并不影响堆栈指针ESP。错,要改变,因为返回地址要压入堆栈(3)call指令本身不能包含子程序的参数。对。(4) call指令用在调用程序中,如果被调用程序中也有call指令,说明出现了嵌套。 对。(5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。错,不能保护传递出口参数的寄存器(6)利用INCLUDE包含的源文件实际上只是源程序的一部分。对(7)宏调用与子程序调用一样都要使用CALL指令实现。错,宏调用是通过宏展开实现的调用,不用CALL指令(8)宏定义与子程序一样一般书写与主程序之后。错,宏需要先定义后调用,一般在源程序开头部

4、分。(9)重复汇编类似于宏汇编,需要先定义后调用。错。(10)条件汇编并不像条件转移指令那样使用标志作为条件对。5.3 填空题(1)指令“RET i16”的功能相当于“RET”指令和“ADD ESP, _”组合。i16(2)例5-1程序中的ret指令,如果用pop ebp和jmp ebp指令替换,则ebp内容是( )分(3)子程序的参数传递主要有3种,它们是( )、( )和( )。寄存器传递,共享变量传递,堆栈传递(4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:_。如果将该编码加37H,则为_,它是字符_的ASCII码值。A,41H,A(5)利用堆栈传递子程序参数的方

5、法是固定的,例如寻址堆栈段数据的寄存器是_。EBP(6)MASM汇编语言中,声明一个共用的变量应使用_伪指令;而使用外部变量要使用_伪指令声明。PUBLIC,EXTERN(7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是_。宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是_。TEST ENDP,ENDM(8)一个宏定义开始语句“WriteChar MACRO CHAR:REQ”,则宏名是( ),参数有 ( ) 个,并且使用“:REQ”说明该参数( )。WriteChar, 1 , 不可缺少(9)实现“byte 20 dup(20h)”语句的功能也可以使用重复汇

6、编,第1个语句是( ),第2个语句是“ byte 20h”,第3个语句是( )。REPEAT 20, ENDM(10)条件汇编语言语句“IF NUM LT 100”中的LT 表示( ),该语句需要配合( )语句结束条件汇编小于, ENDIF习题5.4 如下子程序完成对ECX个元素的数组(由EBX指向其首地址)的求和,通过EDX和EAX返回结果,但是程序有错误,请改正。CrazyprocPusheaxXoreax,eaxXoredx,edxAgain:Addeax,ebxAdcedx,0Addebx,4LoopagainRetENDP Crazy答:CrazyprocXoreax,eaxXore

7、dx,edxAgain:Addeax,ebxAdcedx,0Addebx,4LoopagainRetCrazy ENDP 习题5.5请按如下说明编写子程序:子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码。入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码出口参数:AL=对应的BCD码答:asc2bcdprocshldh,4anddl,0fhordh,dlmoval,dhretasc2bcdendp习题5.6乘法的非压缩BCD码调整指令AAM执行的操作是:AH-AL/10的商,AL-AL/10的余数。利用AAM可以实现将AL中的100内数据转换为ASCII码,程序

8、如下:Xor ah,ahAamAddax,3030h利用这段程序,编写一个显示AL中数值(099)的子程序。答:subaprocaamaddax,3030hxchgah,alcalldispcxchgah,alcalldispcretsubaendp习题5.7编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下退格键(对应ASCII码是08H)则程序退出。请调用书中的HTOASC子程序答:;代码段,主程序again:call readccmp al,08h;退格键BS=08Hjz donemov bl,almov al,:call dispcmov al,blrol a

9、l,4call htoasc;调用子程序call dispc;显示一个字符mov al,blcall htoasc;调用子程序call dispc;显示一个字符call dispcrlfjmp againdone:习题5.8编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。答:;代码段,主程序mov eax,8F98FF00Hcall dispbd;调用子程序;代码段,子程序dispbdproc;32位二进制数的输出push ecxmov ecx,32;要输出的字符个数dbd:rol eax,1;AL循环左移一位push eaxand al,01h;取AL最低位add

10、 al,30h;转化成相应的ASCLL码值call dispc;以二进制的形式显示pop eaxloop dbdpop ecxretdispbdendp习题5.9将例5-4的32位寄存器改用16位寄存器,仅实现输出-215 +215-1之间的数据。答:start:mov ecx,lengthof arraymov ebx,0again:mov ax,arrayebx call writecall dispcrlfinc ebxinc ebxloop againexit 0writeprocpush ebxpush ecxpush edxmov ebx,offset writebuftest a

11、x,axjnz write1mov byte ptr ebx,30hinc ebxjmp write5write1:jns write2mov byte ptr ebx,-inc ebxneg axwrite2:mov cx,10push cxwrite3:cmp ax,0jz write4 xor dx,dxdiv cxadd dx,30hpush dxjmp write3write4:pop dxcmp dx,cxje write5mov ebx,dlinc ebxjmp write4write5:mov byte ptr ebx,0mov eax,offset writebufcall

12、dispmsgpop edx;恢复寄存器pop ecxpop ebxret;子程序返回writeendp习题5.10参考例5-6,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。答: include io32.inc.datacount= 5arraydword count dup(0)tempdword ?;共享变量readbufbyte 30 dup(0).codestart:mov ecx,countmov ebx,offset arrayagain:call read;调用子程序,输入一个数据mov eax,temp;获得出口参数mov ebx,eax;存放到数据缓冲区ad

13、d ebx,4dec ecxjnz againexit 0readprocpush eaxpush ebxpush ecxpush edxread0:mov eax,offset readbufcall readmsgtest eax,eaxjz readerrcmp eax,10ja readerrmov edx,offset readbufxor ebx,ebxread1:mov al,edxread2:incedxcmp al,0jb readerrcmp al,9ja readerrsub al,30himul ebx,10jc readerrmovzx eax,aladd ebx,e

14、axcmp ebx,0ffffffffhjareaderrdec cxjnzread1jmpread5readerr:mov eax,offset errmsgcall dispmsgjmp read0;read5:mov temp,ebxpop edxpop ecxpop ebxpop eaxreterrmsgbyte Input error, enter again: ,0readendpend start习题5.11编写一个计算字节校验和的子程序。(所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。)主程序提供入口参数,包括数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口

15、参数。答:;计算字节校验和的通用过程;入口参数:DS:EBX数组的段地址:偏移地址ECX元素个数;出口参数:AL校验和;说明:除EAX/EBX/ECX外,不影响其他寄存器checksumprocxor al,al;累加器清0sum:add al,ebx;求和inc ebx;指向下一个字节loop sumretchecksumendp习题5.12编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。(1)采用EAX寄存器传递这个32位二进制数。(2)采用temp变量传递这个32位二进制数。(3)采用堆栈方法传递这个32位二进制

16、数。答:(1).codestart:mov eax, 1234abcdh;假设一个要显示的数据callBin2Hexexit 0Bin2Hexprocpushecxmov ecx,8;8位十六进制数again:rol eax,4;高4位循环移位进入低4位push eax;子程序利用AL返回结果,所以需要保存EAX中的数据call htoasc;调用子程序pop eax;恢复保存的数据loop againpopecxrethtoascproc;将AL低4位表达的一位十六进制数转换为ASCII码and al,0fh;只取AL的低4位or al,30h;AL高4位变成3,实现加30Hcmp al,3

17、9h;是09,还是AFjbe htoendadd al,7;是AF,其ASCII码再加上7htoend:calldispcret;子程序返回htoascendpBin2Hexendpend start习题5.13利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX主存偏移地址,ECX字节个数(主存区域的长度)。同时编写一个主程序进行验证。答:;数据段varbyte This is a test!;主程序mov eax,offset varmov ecx,sizeof varcall dispmem;子程序dispm

18、emprocpush ebxmov ebx,eaxdispm1:cmp ecx,0jz dispm2mov al,ebxcall disphb mov al, call dispcinc ebxdec ecxjmp dispm1dispm2:pop ebxretdispmemendp习题5.14数据输入输出程序。使用有符号十进制数据输入(例5-6)、求平均值(例5-7)以及输出子程序(例5-4),编程实现从键盘输入10个数据,并输出它们的平均值。(1)编写主程序文件:定义必要的变量和交互信息,调用子程序输入10个数据,求平均值然后输出。 (2)编写子程序文件:包括3个子程序的过程定义。(3)说

19、明进行模块连接的开发过程,并上机实现。(4)将子程序文件形成一个子程序库,说明开发过程并上机实现。答:.data; 数据定义count= 10arraydword count dup(0)tempdword ?;共享变量readbufbyte 30 dup(0)writebufbyte 12 dup(0);显示缓冲区.code; 主程序start:mov ecx,countmov ebx,offset arrayagain:call read;调用子程序,输入一个数据mov eax,temp;获得出口参数mov ebx,eax;存放到数据缓冲区add ebx,4dec ecxjnz again

20、push lengthof array;压入数据个数push offset array;压数组的偏移地址call mean;调用求平均值子程序,出口参数:EAX平均值(整数部分)add esp,8;平衡堆栈(压入了8个字节数据)callwriteexit 0习题5.18编写一个宏swap,参数是两个32位寄存器或存储器操作数,宏定义体实现两个操作数位置交换,包括两个都是存储器操作数的情况。答:SWAP MACROop1,op2PUSHOP1PUSHOP2POPOP1POPOP2ENDM习题5.19定义一个使用逻辑指令的宏LOGICAL。(1)用它代表4条逻辑运算指令:AND/OR/XOR/TE

21、ST,可以使用3个形式参数,并给出一个宏调用以及对应宏展开的例子。(2)必要时做一点修改,使该宏能够把NOT指令包括进去,给出一个使用NOT指令的宏调用以及对应宏展开的例子。答:(1)LOGICALMACROop,dst,srcopdst,srcENDMLOGICAL and,eax,1 83 E0 01 1andeax,1LOGICAL or,eax,1 83 C8 01 1oreax,1LOGICAL xor,eax,1 83 F0 01 1xoreax,1LOGICAL test,eax,1 A9 1testeax,1(2)LOGICALMACROop,dst,srcIFB opdstE

22、LSEopdst,srcENDIFENDMLOGICAL not,eax F7 D0 1noteax习题5.20有一个宏定义:Defstr macro name,num,stringName&numbyte&string&,0Endm给出如下宏调用的宏展开:(1)defstr msg,4,(2)defstr msg,5,答:Msg4 byte Chapter 4:Program Structure,0Msg5 byte Chapter 5:Procedure Programming,0习题5.21定义一个宏“movestr strN,dstr,sstr”,它将strN个字符从一个字符区sstr

23、传送到另一个字符区dstr。假设数据段定义如下缓冲区,请使用上述宏的调用实现STRING1到STRING2的传送。 String1 byte In a major matter,no detail are small.,0String2 byte sizeof string1 dup(0)答:movestr MACRO strN,dstr,sstrpushecxpushesipushedimovecx,strNleaesi,sstrleaedi,dstrcldrepmovsbpopedipopesipopecxENDM习题5.22利用重复汇编定义一个数据区,数据区有100个双字,每个双子的高字

24、部分依次是2,4,6,.,200,低字部分都是0。答:num = 0REPEAT 100num = num +2word 0,numENDM习题5.23利用宏结构完成以下功能:如果名为count的数大于5,指令“ADD EAX,EAX”将汇编10次,否则什么也不汇编。答:IF count GT 5REPEAT 10ADDEAX,EAXENDMENDIF习题5.24用宏结构实现宏指令FINSUM,它比较两个数varx和vary,若varx=vary,则执行sum=varx+8*vary,否则执行sum=4*varx+vary。答:FINSUM MACRO varx,varyIF varx GE varysum = varx + 8 * varyELSEsum = 4*varx+varyENDIFENDM专心-专注-专业

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

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁