第4章-汇编语言程序设计(共20页).doc
《第4章-汇编语言程序设计(共20页).doc》由会员分享,可在线阅读,更多相关《第4章-汇编语言程序设计(共20页).doc(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上第4章 汇编语言程序设计习题4.1简答题解答 当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。 数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括校验位在内的“1”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验。 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。 双分支结构中两个分支体之间的JMP指令,用于实现结束前一个分支回到共同的出口作用。 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子
2、程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。 子程序保持堆栈平衡,才能保证执行RET指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能就致使堆栈溢出。 “传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;“传址”时,被调用程序可能修改通过地址引用的变量内容。 INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件。 取长补短。 Windows程序在运行时需要加载其配套的动态链接库DLL文件,当其没有被搜索到时就会提示不存在。习题4.2判断
3、题解答 对 错 错 错 错 对 对 错 对 错习题4.3填空题解答 相对寻址,间接寻址,直接寻址,间接寻址 1256H,3280H 3721H,1 EAH 循环初始,循环控制 REPT1标号的地址 TEST ENDP,ENDM EBP PUBLIC,EXTERN 38H 0DH 0AH习题4.4为了验证例题4-1程序的执行路径,可以在每个标号前后增加显示功能。例如使得程序运行后显示数码1234。解答jmp labl1; 相对寻址nopmov eax,?call dispclabl1: mov eax,1call dispcjmp near ptr labl2; 相对近转移nopmov eax,
4、?call dispclabl2: mov eax,2call dispcmov eax,offset labl3 jmp eax; 寄存器间接寻址nopmov eax,?call dispclabl3: mov eax,3call dispcmov eax,offset labl4mov nvar,eaxjmp nvar; 存储器间接寻址nopmov eax,?call dispclabl4: mov eax,4call dispc习题4.5使用“SHR EAX,2”将EAX中的D1位移入CF标志,然后用JC/JNC指令替代JZ/JNZ指令完成例题4-3的功能。解答mov eax,56h;
5、假设一个数据shr eax,2; D1位移入CF标志jnc nom; D10条件成立,转移.; 余同原程序习题4.6执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令指令Jcc的条件成立、发生转移?mov eax,20hcmp eax,80h解答CF1 ZF0 SF1 OF0 PF1可以使得条件成立、发生转移的指令有:JC JS JP JNZ JNO习题4.7将例题4-4程序修改为实现偶校验。建议进一步增加显示有关提示信息的功能,使得程序具有更加良好的交互性。解答include io32.inc.datamsg1 byte Pl
6、ease input a character: ,0msg2 byte The ASCII code of the charater you entered is: ,0msg3 byte The code with even parity is: ,0.codestart:mov eax,offset msg1call dispmsgcall readccall dispcrlfmov ebx,eaxmov eax,offset msg2call dispmsgmov eax,ebxcall dispbbcall dispcrlfand al,7fhjp nextor al,80hnext:
7、mov ebx,eaxmov eax,offset msg3call dispmsgmov eax,ebxcall dispbbexit 0end start习题4.8在采用奇偶校验传输数据的接收端应该验证数据传输的正确性。例如,如果采用偶校验,那么在接收到的数据中,其包含“1”的个数应该为0或偶数个,否则说明出现传输错误。现在,在接收端编写一个这样的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在Rdata变量中。解答; 数据段Rdatabyte 57h;保存接收的数据errorbyte Error !,0; 代码段mov al,
8、Rdataand al,0ffh;标志PF反映“1”的个数jp done;个数为偶数,正确继续mov eax,offset error;个数为奇数,显示出错call dispmsgdone:习题4.9指令CDQ将EAX符号扩展到EDX,即:EAX最高为0,则EDX0;EAX最高为1,则EDXFFFFFFFFH。请编程实现该指令功能。解答1test eax,8000h; 测试最高位jz next1; 最高位为0(ZF1),转移到标号NEXT1mov edx,0ffffffffh; 最高位为1,顺序执行:设置EDXFFFFFFFFHjmp done; 无条件转移,跳过另一个分支next1:mov
9、dx,0; 最高位为0转移到此执行:设置EDX0done:解答2使用移位指令更好。rol eax,1rcr edx,1sar edx,31ror eax,1习题4.10编程,首先测试双字变量DVAR的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”。解答; 数据段dvardword 57h; 代码段mov eax,dvartest eax,hjnz nextltest eax,1jnz nextrmov al,Mjmp donenextl:mov al,Ljmp donenextr:mov al,Rd
10、one:call dispc习题4.11编写一个程序,先提示输入数字“Input Number:09”,然后在下一行显示输入的数字,结束;如果不是键入了09数字,就提示错误“Error!”,继续等待输入数字。解答; 数据段inmsgbyte Input number(09): ,0ermsgbyte 0dh,0ah,Error! Input again: ,0; 代码段mov eax,offset inmsg; 提示输入数字call dispmsgagain:call readc; 等待按键cmp al,0; 数字 9?ja erdispcall dispcrlfcall dispcjmp d
11、oneerdisp:mov eax,offset ermsgcall dispmsgjmp againdone:习题4.12有一个首地址为ARRAY的20个双字的数组,说明下列程序段的功能。mov ecx,20mov eax,0mov esi,eaxsumlp:add eax,arrayesiadd esi,4loop sumlpmov total,eax解答求这20个双字的和,保存在TOTAL变量,不关进心进位和溢出。习题4.13编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在SPACE单元。解答; 数据段stringbyte Do you have fu
12、n with Assembly ?,0;以0结尾的字符串spacedword ?; 代码段mov esi,offset stringxor ebx,ebx;EBX用于记录空格数again:mov al,esicmp al,0jz donecmp al,20h;空格的ASCII码是20Hjne next;不相等、不是空格,转移inc bx;相等、是空格,空格个数加1next:inc esijmp again;继续循环done:mov space,ebx;保存结果习题4.14编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到WORDSUM,如超过则显示O
13、verflow !。解答; 数据段arrayword 2005,2008,98 dup (1394); 假设100个16位正整数wordsumword ?errorbyte Overflow !,0; 代码段and ebx,0mov ecx,100xor ax,axagain:add ax,arrayebx*2jc overinc ebxloop againmov wordsum,axover:mov eax,offset errorcall dispmsg习题4.15在一个已知长度的字符串中查找是否包含“BUG”子字符串。如果存在,显示“Y”,否则显示“N”。解答; 数据段stringbyt
14、e If you find any error in the program, you can DEBUG it.count= sizeof stringbugbyte BUG; 代码段mov ecx,countmov edi,offset stringL1:mov esi,offset bugpush edimov edx,sizeof bugLN:mov al,esicmp edi,aljne L2inc esiinc edidec edxjne LNpop edimov al,Yjmp L3L2:pop ediinc ediloop L1mov al,NL3:call dispc习题4.
15、16主存中有一个8位压缩BCD码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导0。由于位数较多,需要利用循环实现,但如何处理前导0和数据中间的0呢?不妨设置一个标记。编程实现。解答; 数据段bcddword h; 代码段mov esi,bcdcmp esi,0jnz goonmov al,0call dispcjmp donegoon:mov ecx,8xor ebx,ebx; EBX0,表示可能是前导0again:rol esi,4mov eax,esiand eax,0fh; EAX低4位保存当前要显示的BCD码cmp ebx,0; EBX0,说明不是前导0,要显示jnz
16、disp; EBX0,说明可能是前导0cmp eax,0 jz next; EAX0,说明是前导0,不显示mov ebx,1 ; EAX0,没有前导0了,令EBX10disp:add al,30hcall dispcnext:loop againdone:习题4.17已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。解答; 数据段stringbyte Let us have a try !,0dh,0ah,0; 代码段mov ecx,sizeof stringcmp ecx,2jb donelea eax,string; 显示处理前的字符串cal
17、l dispmsgmov esi,ecxdec esioutlp:cmp stringesi, ; 检测是否是空格jnz next; 不是空格继续循环mov edi,esi; 是空格,进入剔除空格分支dec ecxinlp:inc edimov al,stringedi; 前移一个位置mov stringedi-1,alcmp edi,ecxjb inlpnext:dec esi; 继续进行cmp esi,0jnz outlp; 为0结束lea eax,string; 显示处理后的字符串call dispmsgdone:习题4.18第3章习题3.14在屏幕上显示ASCII表,现仅在数据段设置表
18、格缓冲区,编程将ASCII代码值填入留出位置的表格,然后调用显示功能实现(需要利用双重循环)。解答include io32.inc.datatablebyte |0 1 2 3 4 5 6 7 8 9 A B C D E F,13,10byte -+-,13,10tab1byte 6 dup(36 dup(?),13,10)byte 0.codestart:mov ebx,offset tab1mov edx,| 02mov ax,2020hmov esi,6again0:mov ebx,edxadd ebx,4mov ecx,16again1:mov word ptr ebx,axadd e
19、bx,2inc alloop again1add ebx,2add edx,1dec esijnz again0mov eax,offset tablecall dispmsgexit 0end start习题4.19请按如下说明编写子程序:子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码入口参数:DH十位数的ASCII码,DL个位数的ASCII码出口参数:AL对应BCD码解答asctobprocshl dh,4mov al,dhand dl,0fhor al,dlretasctobendp习题4.20乘法的非压缩BCD码调整指令AAM执行的操作是:AHAL10的商,ALAL1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 20
限制150内