您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 第5章-模块化程序设计
第5章模块化程序设计5.1简答题(1)指令“CALLEBX”采用了指令的什么寻址方式?寄存器间接寻址(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)指令“RETi16”的功能相当于“RET”指令和“ADDESP,__________”组合。i16(2)例5-1程序中的ret指令,如果用popebp和jmpebp指令替换,则ebp内容是()0000000分(3)子程序的参数传递主要有3种,它们是()、()和()。寄存器传递,共享变量传递,堆栈传递(4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:____。如果将该编码加37H,则为_____,它是字符______的ASCII码值。A,41H,A(5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_____。EBP(6)MASM汇编语言中,声明一个共用的变量应使用___伪指令;而使用外部变量要使用___伪指令声明。PUBLIC,EXTERN(7)过程定义开始是“TESTPROC”语句,则过程定义结束的语句是________。宏定义开始是“DISPMACRO”语句,则宏定义结束的语句是________。TESTENDP,ENDM(8)一个宏定义开始语句“WriteCharMACROCHAR:REQ”,则宏名是(),参数有()个,并且使用“:REQ”说明该参数()。WriteChar,1,不可缺少(9)实现“byte20dup(20h)”语句的功能也可以使用重复汇编,第1个语句是(),第2个语句是“byte20h”,第3个语句是()。REPEAT20,ENDM(10)条件汇编语言语句“IFNUMLT100”中的LT表示(),该语句需要配合()语句结束条件汇编小于,ENDIF习题5.4如下子程序完成对ECX个元素的数组(由EBX指向其首地址)的求和,通过EDX和EAX返回结果,但是程序有错误,请改正。CrazyprocPusheaxXoreax,eaxXoredx,edxAgain:Addeax,[ebx]Adcedx,0Addebx,4LoopagainRetENDPCrazy答:CrazyprocXoreax,eaxXoredx,edxAgain:Addeax,[ebx]Adcedx,0Addebx,4LoopagainRetCrazyENDP习题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码,程序如下:Xorah,ahAamAddax,3030h利用这段程序,编写一个显示AL中数值(0~99)的子程序。答:subaprocaamaddax,3030hxchgah,alcalldispcxchgah,alcalldispcretsubaendp习题5.7编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下退格键(对应ASCII码是08H)则程序退出。请调用书中的HTOASC子程序答:;代码段,主程序again:callreadccmpal,08h;退格键BS=08Hjzdonemovbl,almoval,':'calldispcmoval,blrolal,4callhtoasc;调用子程序calldispc;显示一个字符moval,blcallhtoasc;调用子程序calldispc;显示一个字符calldispcrlfjmpagaindone:习题5.8编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。答:;代码段,主程序moveax,8F98FF00Hcalldispbd;调用子程序;代码段,子程序dispbdproc;32位二进制数的输出pushecxmovecx,32;要输出的字符个数dbd:roleax,1;AL循环左移一位pusheaxandal,01h;取AL最低位addal,30h;转化成相应的ASCLL码值calldispc;以二进制的形式显示popeaxloopdbdpopecxretdispbdendp习题5.9将例5-4的32位寄存器改用16位寄存器,仅实现输出-215~+215-1之间的数据。答:start:movecx,lengthofarraymovebx,0again:movax,array[ebx]callwritecalldispcrlfincebxincebxloopagainexit0writeprocpushebxpushecxpushedxmovebx,offsetwritebuftestax,axjnzwrite1movbyteptr[ebx],30hincebxjmpwrite5write1:jnswrite2movbyteptr[ebx],'-'incebxnegaxwrite2:movcx,10pushcxwrite3:cmpax,0jzwrite4xordx,dxdivcxadddx,30hpushdxjmpwrite3write4:popdxcmpdx,cxjewrite5mov[ebx],dlincebxjmpwrite4write5:movbyteptr[ebx],0moveax,offsetwritebufcalldispmsgpopedx;恢复寄存器popecxpopebxret;子程序返回writeendp习题5.10参考例5-6,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。答:includeio32.inc.datacount=5arraydwordcountdup(0)tempdword?;共享变量readbufbyte30dup(0).codestart:movecx,countmovebx,offsetarrayagain:callread;调用子程序,输入一个数据moveax,temp;获得出口参数mov[ebx],eax;存放到数据缓冲区addebx,4dececxjnzagainexit0readprocpusheaxpushebxpushecxpushedxread0:moveax,offsetreadbufcallreadmsgtesteax,eaxjzreaderrcmpeax,10jareaderrmovedx,offsetreadbufxorebx,ebxread1:moval,[edx]read2:incedxcmpal,'0'jbreaderrcmpal,'9'jareaderrsubal,30himulebx,10jcreaderrmovzxeax,aladdebx,eaxcmpebx,0ffffffffhjareaderrdeccxjnzread1jmpread5readerr:moveax,offseterrmsgcalldispmsgjmpread0;read5:movtemp,ebxpopedxpopecxpopebxpopeaxreterrmsgbyte'Inputerror,enteragain:',0readendpendstart习题5.11编写一个计算字节校验和的子程序。(所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。)主程序提供入口参数,包括数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。答:;计算字节校验和的通用过程;入口参数:DS:EBX=数组的段地址:偏移地址ECX=元素个数;出口参数:AL=校验和;说明:除EAX/EBX/ECX外,不影响其他寄存器checksumprocxoral,al;累加器清0sum:addal,[ebx];求和incebx;指向下一个字节loopsumretchecksumendp习题5.12编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。(1)采用EAX寄存器传递这个32位二进制数。(2)采用temp变量传递这个32位二进制数。(3)采用堆栈方法传递这个32位二进制数。答:(1).codestart:moveax,1234abcdh;假设一个要显示的数据callBin2Hexexit0Bin2Hexprocpushecxmovecx,8;8位十六进制数again:roleax,4;高4位循环移位进入低4位pusheax;子程序利用AL返回结果,所以需要保存EAX中的数据callhtoasc;调用子程序popeax;恢复保存的数据loopagainpopecxrethtoascproc;将AL低4位表达的一位十六进制数转换为ASCII码andal,0fh;只取AL的低4位oral,30h;AL高4位变成3,实现加30Hcmpal,39h;是0~9,还是A~Fjbehtoendaddal,7;是A~F,其ASCII码再加上7htoend:calldispcret;子程序返回htoascendpBin2Hexendpendstart习题5.13利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX=主存偏移地址,ECX=字节个数(主存区域的长度)。同时编写一个主程序进行验证。答:;数据段varbyte'Thisisatest!';主程序moveax,offsetvarmovecx,sizeofvarcalldispmem;子程序dispmemprocpushebxmovebx,eaxdispm1:cmpecx,0j
本文标题:第5章-模块化程序设计
链接地址:https://www.777doc.com/doc-7291898 .html