




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.第5章 模块化程序设计5.1 简答题(1)指令“CALL EBX”采用了指令的什么寻址方式?寄存器间接寻址(2)为什么MASM要求使用proc定义子程序?(这个问题不好回答,是不是作者写错了?我猜测可能的原因: 在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序 )(3)为什么特别强调为子程序加上必要的注释?便于程序员调用时使用,而不必关注子程序的内部实现。(4)参数传递的“传值”和“传址”有什么区别?传值是传递参数的拷贝,传址是传递参数的地址(5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?保证正确返回;释放传递参数占用的堆栈空间,避免多次调用可能导致的堆栈溢出(6)INCLUDE语句和INCLUDELIB有什么区别?INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件(7)什么是子程序库?子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用(8)调用宏时没有为形参提供实参会怎样?缺少的实参,形参会做“空”处理。(9)宏定义体中的标号为什么要用local为指令声明?为了避免宏展开后出现标示符不唯一的情况,定义为局部。(10)条件汇编不成立的语句会出现在可执行文件中吗?不会。5.2 判断题(1)过程定义proc是一条处理器指令。错,proc是伪指令(2)CALL指令的执行并不影响堆栈指针ESP。错,要改变,因为返回地址要压入堆栈(3)call指令本身不能包含子程序的参数。对。(4) call指令用在调用程序中,如果被调用程序中也有call指令,说明出现了嵌套。 对。(5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。错,不能保护传递出口参数的寄存器(6)利用INCLUDE包含的源文件实际上只是源程序的一部分。对(7)宏调用与子程序调用一样都要使用CALL指令实现。错,宏调用是通过宏展开实现的调用,不用CALL指令(8)宏定义与子程序一样一般书写与主程序之后。错,宏需要先定义后调用,一般在源程序开头部分。(9)重复汇编类似于宏汇编,需要先定义后调用。错。(10)条件汇编并不像条件转移指令那样使用标志作为条件对。5.3 填空题(1)指令“RET i16”的功能相当于“RET”指令和“ADD ESP, _”组合。i16(2)例5-1程序中的ret指令,如果用pop ebp和jmp ebp指令替换,则ebp内容是( )0000000分(3)子程序的参数传递主要有3种,它们是( )、( )和( )。寄存器传递,共享变量传递,堆栈传递(4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:_。如果将该编码加37H,则为_,它是字符_的ASCII码值。A,41H,A(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)”语句的功能也可以使用重复汇编,第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,eaxXoredx,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码,程序如下: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 al,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 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 ax,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 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;存放到数据缓冲区add 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,eaxcmp 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编写一个计算字节校验和的子程序。(所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。)主程序提供入口参数,包括数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。答:;计算字节校验和的通用过程;入口参数: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位二进制数。答:(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,39h;是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;子程序dispmemprocpush 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)说明进行模块连接的开发过程,并上机实现。(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 againpush 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/TEST,可以使用3个形式参数,并给出一个宏调用以及对应宏展开的例子。(2)必要时做一点修改,使该宏能够把NOT指令包括进去,给出一个使用NOT指令的宏调用以及对应宏展开的例子。答:(1)LOGICALMACROop,dst,srcopdst,srcENDMLOGICAL and,eax,1 00000000 83 E0 01 1andeax,1LOGICAL or,eax,1 00000003 83 C8 01 1oreax,1LOGICAL xor,eax,1 00000006 83 F0 01 1xoreax,1LOGICAL test,eax,1 00000009 A9 00000001 1testeax,1(2)LOGICALMACROop,dst,srcIFB opdstELSEopdst,srcENDIFENDMLOGICAL not,eax 00000000 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:Procedu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不老泉测试题及答案
- 2025年机动车抵押合同2篇
- 【8语期末】蚌埠市经开区2023-2024学年八年级下学期期末教学质量监测语文试卷
- 污水处理系统设计方案
- 健康促进校培训课件
- 有见证人婚前房产协议书6篇
- 土元项目绩效评估报告
- 小班美术系统课程课件
- T/ZHCA 030-2024化妆品舒缓功效测试重建表皮模型白介素-8生成抑制法
- 2025西双版纳职业技术学院辅导员考试试题及答案
- 2024年数字化管理试题及答案
- YY频道模板文档
- 2024-2025学年湘教版初中地理七年级下册课件 9.5 美国
- 《基于单片机的家用万能遥控器设计5800字(论文)》
- 小学生军人知识普及
- DB65-T 4863-2024 超设计使用年限压力容器安全评估规则
- 2025陕西建工控股集团限公司招聘12人易考易错模拟试题(共500题)试卷后附参考答案
- 光储充一体化低碳发展项目可行性研究报告写作模板-备案审批
- 智慧工会管理系统需求方案
- 临床三基培训
- 配电室巡检培训
评论
0/150
提交评论