第4章-程序结构习题答案汇编_第1页
第4章-程序结构习题答案汇编_第2页
第4章-程序结构习题答案汇编_第3页
第4章-程序结构习题答案汇编_第4页
第4章-程序结构习题答案汇编_第5页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学习-好资料第4章程序结构4.1 简答题(1) CPUID指令返回识别字符串的首字符“ G”在哪个寄存器中?EBX的高8位(2)数据的直接寻址和指令的直接寻址有什么区别?数据的直接寻址给出数据所在的存储器地址,指令的直接寻址给出指令所在的存储器地址。(3)是什么特点决定了目标地址的相对寻址方式应用最多?指令代码中提供目标地址相对于当前指令指针寄存器EIP的位移量,使得同一个程序被操作系统安排在不同的存储区时,指令间的位移并没有变化的特点。(4) Jcc指令能跳转到代码段之外吗?不能,Jcc指令采用段内相对寻址方式(5)什么是奇偶校验?数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括

2、校验位在内的“1的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验(6)助记符JZ和JE为什么表达同一条指令?两个数相减,差值为 0 (JZ)与两个数相等(JE)是一个含义(7)为什么判断无符号数大小和有符号大小的条件转移指令不同?判断两个无符号数的大小和判断两个有符号数大小关系要利用不同的标志组合。判断有符号数的大小需要组合SF和OF标志,并利用ZF标志确定相等与否。判断无符号数的高低利用 CF标志,利用ZF标志确定相等。(8)双分支结构中两个分支体之间的JMP指令有什么作用?用于跳过分支体2,避免进入分支体 2而出现错误。(9)如果循环体的代码量远超过128个字节,还能用LOOP指令实现计数

3、控制循环吗?不能,因为LOOP指令的目标地址采用相对短转移,只能在128+ 127字节之间循环(10)什么是“先循环、后判断”循环结构?指先执行循环体,然后判断是否继续循环的结构,这种结构通常至少执行一次循环体4.2 判断题(1) 指令指针或者号包括代码段寄存器值的改变将引起程序流程的改变。对(2) 指令的相对寻址都是近转移。对(3) 采用指令的寄存器间接寻址,目标地址来自存储单元。错,(4) JMP指令对应高级语言的 GOTO语句,所以不能使用错,需要使用(5) 因为条件转移指令 Jcc要利用标志作为条件,所以也影响标志。错(6) JA和JG指令的条件都是“大于”,所以是同一个指令的两个助记

4、符。错,JA针对无符号数,JG针对有符号数(7) JC和JB的条件都是CF= 1 ,所以是同一条指令。对。无符号小于(JB)必然借位(JC)(8)控制循环是否结束只能在一次循环结束之后进行错(9)介绍loop指令时,常说它相当于dec ecx和jnz两条指令。但是考虑对状态标志的 影响,它们有差别。Loop指令不影响标志,而 dec指令却影响除cf之外的其他状态标志。 对(10)若ECX = 0,则LOOP指令和JECX指令都发生转移。对4.3 填空题(1) JMP指令根据目标地址的转移范围和寻址方式,可以分成4种类型:段内转移、(),段内转移、()以及段间转移、(),段间转移、()。相对寻址

5、,间接寻址,直接寻址,间接寻址(2) MASM给短转移、近转移和远转移定义的类型名依次是和。SHORT, NEAR , FAR(3)假设在平展存储模型下, EBX= 1256H,双字变量TABLE的偏移地址是20A1H , 线性地址32F7H处存放3280H,执行指令“ JMP EBX ”后EIP =,执行指令“ JMP TABLEEBX " 后 EIP=。1256H, 3280H(4) “CMP EAX,3721H ”指令之后是JZ指令,发生转移的条件是 EAX =, 此时ZF =。3721H, 1(5)执行“ SHR EBX,4 "指令后,JNC发生转移,说明 EBX的

6、D3=。0(6)在EDX等于0时转移,可以使用指令“ CMP EDX,"、也可以使用“ TEST EDX,”构成条件,然后使用JE指令实现转移。0, EDX(7)循环结构程序一般由三个部分组成,它们是()、循环体和()部分。循环初始,循环控制(8) JECXZ指令发生转移的条件是(),loop指令不发生转移的条件是()。Ecx=0, ecx 不等于 0(9) loop指令进行减1计数,实际应用中也常进行加1计数。针对例4-14程序,如果删除其中的loop指令,则可以使用指令" cmp () ,ecx”和“ jb () ”替代。Ebx, jb again(10)小写字母“ e

7、”是英文当中出现频率最高的字母。如果某个英文文档利用例4-16的异或方法进行简单加密,统计发现密文中字节数据“ 8FH”最多,则高程序采用的字节密码可能是()0EAh习题4.4已知van、var2、var3和var4是32位无符号整数,用汇编语言程序片段实现如下C+语句:var4=(var1*6)/( var2-7)+var3解答:mov eax,var1mov ebx,6mul ebx ;var1*6mov ebx,var2 sub ebx,7 ;var2-7 div ebx ;(var1*6)/( var2-7) add eax,var3 ;(var1*6)/( var2-7)+var3

8、mov var4,eax 习题4.5已知van、var2、var3和var4是32位有符号整数,用汇编语言程序片段实现如下C+语句:Var1=(var2*var3)/( var4+8)-47 解答: Moveax,var2Imulvar3Movebx,var4Addebx,8IdivebxSubeax,47Movvar1,eax习题4.6参看例4-1,假设N小于90000,这时求和结果只需要 eax保存,edx为0。修改例4-1 使其可以从键盘输入一个数值 N(用readuid子程序),最后显示累加和(用 dispuid子程序)。 解答:.dataMsg byte Input a number

9、(090000): ',0.codeStart:Mov eax,offset msgCall readuidCall dispcrlfMov ebx,eaxAdd ebx,1Imul ebxShredx,1Rcreax,1Call dispuid习题4.7定义COUNT (假设为10)个元素的32位数组,输入元素编号(0COUNT-1 ),利用 DISPHD子程序输出其地址、利用 DISPSID子程序输出其值。解答:;数据段count = 10array dword 0,1,2,3,4,5,6,7,8,9 ;代码段call readuid;输入 N ,小于 10lea eax,arra

10、yeax*4;EAX =地址call disphd;显示地址mov eax,arrayeax*4;EAX =变量值call dispsid;显示数值习题4.10判断下列程序段跳转的条件(1) xor ax,1e1eh Je equal(2) test al,10000001b Jnz here(3) 3) cmp cx,64h Jb there 答:(1) zf= 1 (2) zf= 0 cf =1 习题4.11假设EBX和ESI存放的是有符号数,EDX和EDI存放的是无符号数, 条件转移指令实现以下判断:(1)若 EDX > EDI ,转至ij above 执行(2)若 EBX >

11、; ESI ,转到 greater 执行(3)若EBX = 0 ,转到zero执行(4)若EBX - ESI产生溢出 ,转到overflow执行(5)若 ESI <= EBX ,转至ij less_eq 执行(6)若 EDI<= EDX ,转到 below_eq 执行答: cmp ebx,edi Ja above(2) cmp ebx,esiJg greater(3) cmp ebx ,0 Je zero(4) cmp ebx,esi Jo overflow (5) cmp esi,ebx Jle less_eq(6) cmp edi,edxJbe below_eq习题4.12使用

12、“ shr eax,2”将eax中的D1位移入CF标志,然后用JC /JNC指令替换 成例4-6程序的功能。答:mov eax,56h请用比较指令和JZ /JNZ指令完Shr eax,2 jnc nommov eax,offset yes_msg jmp done nom:mov eax,offset no_msgdone:call dispmsg或mov eax,58hShr eax,2 jc yesm mov eax,offset no_msg jmp done yesm:mov eax,offset yes_msgdone:call dispmsg习题4.13将例4-7程序修改为实现偶校

13、验,并进一步增加显示有关提示信息的功能,使得程序具有更加 良好的交互性.答:.dataMsg1bytePlease input a char:",0Msg2byteAscii is : ',0Msg3byteParty is : ',0.codestart:mov eax,offset msg1call dispmsgcall readccall dispcrlflea eax,msg2call dispmsgcall dispbbcall dispcrlfand al,7fhjp nextor al,80hnext:pusheaxlea eax,msg3call d

14、ispmsg3pop eaxcall dispbbexit 0end start习题4.14在采用奇偶校验传输数据的接收端应该验证数据传输的正确性.例如,如果采用偶校验那么在接受到的数据中,其包含“1”的个数应该为0或偶数个,否则说明出现传输错误。现在,在接收端编写一个的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在Rdata变量中。答:.dataRdata byte a"Errmsg byte Data Error! ',0 .codeStart:Test rdata,0Jnp err Err:Lea eax,

15、errmsg Call dispmsg习题4.15IA-32处理器的指令 CDQ将EAX符号扩展到EDX。假若没有该指令,编程实现该指 令功能。(1)按照符号扩展的含义编程,即: EAX最高为0,则EDX =0; EAX最高为1,则 EDX = FFFFFFFFH。编程实现指令CDQ,将EAX符号扩展到EDX(2)使用移位等指令进行优化编程。答:test eax,8000h ;测试最高位jz next1 ;最高位为0,转移 mov edxQffffffffh最高位为1,设置 EDX = FFFFFFFFHjmp done ;跳过另一个分支next1: mov dx,0 ;设置 EDX = 0

16、done:方法1:mov edx,eaxsar edx,31 方法2:rol eax,1rcr edx,1 sar edx,31 ror eax,1习题4.16编写一个成旭,首先测试双字变量 DVAR的最高位,如果为1,则显示字母“ L” ;如果 最高位不为1,则继续测试最低位,如果最低位为1则显示字母“R”,如果最低位也不为1, 则显示字母“ M ”。答: .data Dvardword 80000000h .code Testdvar,80000000hJnzdispLTestdvar,1JzdispMMov al,'R'Jmp dispdispL:mov al, '

17、;L' jmp dispdispM:mov al,'M 'disp: call dispc习题4.17编写一个程序,先提示输入数字“Input Number: 09”,然后在下一行显示输入的数 字,结束;如果不是键入了09数字,就提示错误" Error!”,继续等待输入数字。方法1:使用字符输入输出子程序 激据段inmsgbyte 'Input number(09): ',0ermsgbyte 0dh,0ah,'Error! Input again: ',0;代码段mov eax,0fset inmsg;提示输入数字call d

18、ispmsg方法1:使用字符输入输出子程序again:call readc ;等待按键cmp al,'0'数字 < 0? jb erdispcmp al,'9' ;数字 > 9? ja erdisp call dispcrlf call dispc jmp done erdisp: mov eax,offset ermsg call dispmsg jmp againdone:方法2:使用数字输入输出子程序again: call readuid ;call readsid cmp eax,0 ;数字 < 0 ?jb erdisp ;jl erd

19、isp cmp eax,9;数字 > 9 ?ja erdisp ;jg erdisp call dispuid ;call dispsid jmp done erdisp: mov eax,offset ermsgcall dispmsg jmp again 习题4.18有一个首地址为 Array的20个双字的数据,说明下列程序段的功能。Mov ecx,20Mov eax,0Mov esi,eaxSum1p:Add eax,arrayesiAdd esi,4Loop sum1pMov total,eax答:累加Array数组,并将Z果存入 total变量习题4.19说明如下程序段的功能:

20、Mov ecx,16Mov bx,axNext:Shr ax,1Rcr edx,1Shr bx,1 Rcr edx,1 Loop next Mov eax,edx 答: 习题4.20编程将一个64位数据逻辑左移3位,假设这个数据已经保存在EDX.EAX寄存器对中。答:Mov ecx,3Next:shr edx,1Rcr eax,1 Loop next 习题4.21编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在 space单元。 答:space dword 0string byte 'this is a test string !' .cod

21、estart:;主程序mov eax,0mov ebx,eaxmov ecx,lengthof string nextchar:cmp stringebx,20hjnz nospaceinc eaxnospace:inc ebxloop nextcharmov space,eax call dispuid exit 0;子程序end start习题4.22将一个已经按升序排列的数组(地1个元素最小,后面的逐个增大)改为按照降序排列。 编程实现该功能。答:.data;数据定义ArrayUp dword -1,0,2,3,20,23,36,100,2048 .codestart:;主程序movec

22、x,lengthof ArrayUpaddecx,1rcrecx,1xoresi,esimovedi,(lengthof ArrayUp) -1exchange:moveax,ArrayUpesi* Type ArrayUpxchg eax,ArrayUpedi* Type ArrayUpxchg eax,ArrayUpesi* type ArrayUp inc esi dec edi loop exchangeexit 0;子程序end start习题4.23编写计算100个16位正整数之和的程序。如果和不超过16位字的范围,wordsum , 如果超过贝U显示 " overflo

23、w !".答:.datacount = 100num word count dup(90) wordsum word 0 errmsg byte 'Overflow!'数据定义 .codestart:;主程序 xor eax,eax mov ebx,eax mov ecx,count sum:add ax,numebxjc over inc ebx inc ebx loop sum mov wordsum,ax call dispuiw jmp quitover:mov eax,01fset errmsgcall dispmsg quit:exit 0;子程序 end start 习题4.27在屏幕上显示 ASCII表,现仅在数据段设置表格缓冲区,编程将 ASCII 出位置的表格,然后调用显示功能实现(需要利用双重循环)。答

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论