微机原理与接口技术(第四版)课后习题答案 (1)(38页).doc
-微机原理与接口技术(第四版)课后习题答案 (1)-第 35 页 第1章 微型计算机系统习题1.1简答题(2)总线信号分成哪三组信号?(3)PC机主存采用DRAM组成还是SRAM组成?(5)ROM-BIOS是什么?(6)中断是什么?(9)处理器的“取指译码执行周期”是指什么?解答 总线信号分成三组,分别是数据总线、地址总线和控制总线。 PC机主存采用DRAM组成。 ROM-BIOS是“基本输入输出系统”,操作系统通过对BIOS的调用驱动各硬件设备,用户也可以在应用程序中调用BIOS中的许多功能。 中断是CPU正常执行程序的流程被某种原因打断、并暂时停止,转向执行事先安排好的一段处理程序,待该处理程序结束后仍返回被中断的指令继续执行的过程。 指令的处理过程。处理器的“取指译码执行周期” 是指处理器从主存储器读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的操作(简称执行)的过程。习题1.3填空题(2)Intel 8086支持_容量主存空间,80486支持_容量主存空间。(3)二进制16位共有_个编码组合,如果一位对应处理器一个地址信号,16位地址信号共能寻址_容量主存空间。(9)最初由 公司采用Intel 8088处理器和( )操作系统推出PC机。 1MB,4GB 216,64KB (9)IBM,DOS习题1.4说明微型计算机系统的硬件组成及各部分作用。解答CPU:CPU也称处理器,是微机的核心。它采用大规模集成电路芯片,芯片内集成了控制器、运算器和若干高速存储单元(即寄存器)。处理器及其支持电路构成了微机系统的控制中心,对系统的各个部件进行统一的协调和控制。存储器:存储器是存放程序和数据的部件。外部设备:外部设备是指可与微机进行交互的输入(Input)设备和输出(Output)设备,也称I/O设备。I/O设备通过I/O接口与主机连接。总线:互连各个部件的共用通道,主要含数据总线、地址总线和控制总线信号。习题1.7区别如下概念:助记符、汇编语言、汇编语言程序和汇编程序。解答助记符:人们采用便于记忆、并能描述指令功能的符号来表示机器指令操作码,该符号称为指令助记符。汇编语言:用助记符表示的指令以及使用它们编写程序的规则就形成汇编语言。汇编语言程序:用汇编语言书写的程序就是汇编语言程序,或称汇编语言源程序。汇编程序:汇编语言源程序要翻译成机器语言程序才可以由处理器执行。这个翻译的过程称为“汇编”,完成汇编工作的程序就是汇编程序(Assembler)。第2章 处理器结构习题2.1简答题(1)ALU是什么?(2)8086的取指为什么可以被称为指令预取?(4)堆栈的存取原则是什么?(5)标志寄存器主要保存哪方面的信息?(6)执行了一条加法指令后,发现ZF1,说明结果是什么?(9)汇编语言源程序文件中,END语句后的语句会被汇编吗?解答 ALU是算术逻辑运算单元,负责处理器所能进行的各种运算,主要是算术运算和逻辑运算。 取指是指从主存取出指令代码通过总线传输到处理器内部指令寄存器的过程。8086分成总线接口单元和指令执行单元,可以独立操作。在执行单元执行一条指令的同时,总线接口单元可以读取下一条指令,等到执行时不需要进行取指了,所以称为预取。 堆栈的存取原则是先进后出(也称为后进先出)操作方式存取数据。 标志寄存器主要保存反映指令执行结果和控制指令执行形式的有关状态。 执行了一条加法指令后,发现ZF1,表明运算结果为0。 不会。习题2.3填空题(3)逻辑地址由_和_两部分组成。代码段中下一条要执行的指令由CS和_寄存器指示,后者在实地址模型中起作用的仅有_寄存器部分。(4)进行8位二进制数加法:1011101001101100,8位结果是_,标志PF_。(5)在实地址工作方式下,逻辑地址“7380H400H”表示的物理地址是_,并且该段起始于_物理地址。(9)除外设数据外的数据寻址方式有3类,分别被称为_、_和_。解答 段地址,偏移地址,EIP,IP 00100110,0 73C00H,73800H 立即数寻址、寄存器寻址和存储器寻址习题2.4处理器内部具有哪3个基本部分?8086分为哪两大功能部件?其各自的主要功能是什么?解答处理器内部有ALU、寄存器和指令处理三个基本单元。8086有两大功能部件:总线接口单元和执行单元。总线接口单元:管理着8086与系统总线的接口,负责处理器对存储器和外设进行访问。8086所有对外操作必须通过BIU和这些总线进行。执行单元EU:负责指令译码、数据运算和指令执行。习题2.58086怎样实现了最简单的指令流水线?解答8086中,指令的读取是在BIU单元,而指令的执行是在EU单元。因为BIU和EU两个单元相互独立、分别完成各自操作,所以可以并行操作。也就是说,在EU单元对一个指令进行译码执行时,BIU单元可以同时对后续指令进行读取;这就是最简单的指令流水线技术。习题2.8什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达(均为十六进制形式): FFFF0 4017 20004500 B8214567解答物理地址:在处理器地址总线上输出的地址称为物理地址。每个存储单元有一个唯一的物理地址。逻辑地址:在处理器内部、程序员编程时采用逻辑地址,采用“段地址:偏移地址“形式。某个存储单元可以有多个逻辑地址,即处于不同起点的逻辑段中,但其物理地址是唯一的。逻辑地址转换成物理地址:逻辑地址由处理器在输出之前转换为物理地址。将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址。 FFFFH:0FFFF0H 40H:17H00417H 2000H:4500H24500H B821H:4567HBC777H习题2.12汇编语句有哪两种,每个语句由哪4个部分组成?解答汇编语句有两种:执行性语句(处理器指令)、说明性语句(伪指令)。每个语句有:标号、指令助记符、操作数或参数、注释4个部分组成。习题2.16说明下列指令中源操作数的寻址方式?假设VARD是一个双字变量。(1)mov edx,1234h(2)mov edx,vard(3)mov edx,ebx(4)mov edx,ebx(5)mov edx,ebx+1234h(6)mov edx,vardebx(7)mov edx,ebx+edi(8)mov edx,ebx+edi+1234h(9)mov edx,vardesi+edi(10)mov edx,ebp*4解答 立即数 直接 寄存器 寄存器间接 寄存器相对 寄存器相对 基址变址 相对基址变址 相对基址变址 带比例寻址第3章 数据处理习题3.1简答题(1)使用二进制8位表达无符号整数,257有对应的编码吗?(2)字符“'F'”和数值46H作为MOV指令的源操作数有区别吗?(3)为什么可以把指令“MOV AX, (3467H)*3”中的数值表达式看成是常量?(4)数值500,能够作为字节变量的初值吗?(6)都是获取偏移地址,为什么指令“LEA EBX, ESI”正确,而指令“MOV EBX, OFFSETESI”就错误?(7)INC,DEC,NEG和NOT都是单操作数指令,这个操作数应该是源操作数还是目的操作数?(9)乘除法运算针对无符号数和有符号数,有两种不同的指令。只有一种指令的加减法如何区别无符号数和有符号数运算?(10)逻辑与运算为什么也称为逻辑乘?解答 没有。使用二进制8位表达无符号整数,257没有对应的编码。 字符“'F'”的ASCII码就是数值46H,所以没有区别。 汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,故称数值表达式为常量。 不能。数值500大于一个字节所能表达的数据量,所以不能为字节变量赋值。 前者在指令执行时获得偏移地址,是正确的;但后者的OFFSET只能在汇编阶段获得偏移地址,但此时寄存器内容是不可知的,所以无法获得偏移地址。 INC,DEC,NEG和NOT指令的操作数既是源操作数也是目的操作数。 加减法不区别无符号数和有符号数,但根据运算结果分别设置标志寄存器的CF和OF标志,可利用CF和OF进行区别。 逻辑与运算规则类似二进制的乘法,所以称其为逻辑乘。习题3.3填空题(1)定义字节变量的伪指令助记符是_,获取变量名所具有的偏移地址的操作符是_。(2)计算机中有一个“01100001”编码。如果把它认为是无符号数,它是10进制数_;如果认为它是BCD码,则表示真值_;又如果它是某个ASCII码,则代表字符_。(3)C语言用“n”表示让光标回到下一行首位,在汇编语言中需要输出两个控制字符:一个是回车,其ASCII码是_,它将光标移动到当前所在行的首位;另一个是换行,其ASCII码是_,它将光标移到下一行。(4)数据段有语句“H8843 DWORD 99008843H”,代码段指令“MOV CX, WORD PTR H8843”执行后,CX_。(5)用DWORD定义的一个变量XYZ,它的类型是_,用“TYPE XYZ”会得到数值为_。如果将其以字量使用,应该用_说明。(6)数据段有语句“ABC BYTE 1,2,3”,代码段指令“MOV CL, ABC+2”执行后,CL_。解答 BYTE,OFFSET 97,61,小写字母a 0DH(13),0AH(10) 8843H DWORD,4,WORD PTR XYZ 3习题3.4下列十六进制数表示无符号整数,请转换为十进制形式的真值: FFH 0H 5EH EFH解答 255 0 94 239习题3.5将下列十进制数真值转换为压缩BCD码: 12 24 68 99解答 12H 24H 68H 99H习题3.6将下列压缩BCD码转换为十进制数: 10010001 10001001 00110110 10010000解答 91 89 36 90习题3.7将下列十进制数用8位二进制补码表示: 0 127 127 57解答 00000000 01111111 10000001 11000111习题3.8进行十六进制数据的加减运算,并说明是否有进位或借位: 1234H7802H F034H5AB0H C051H1234H 9876HABCDH解答 1234H7802H8A36H,无进位 F034H5AB0H4AF4H,有进位 C051H1234HBE1DH,无借位 9876HABCDHECA9H,有借位习题3.10设置一个数据段,按照如下要求定义变量或符号常量: my1b为字符串变量:Personal Computer my2b为用十进制数表示的字节变量:20 my3b为用十六进制数表示的字节变量:20 my4b为用二进制数表示的字节变量:20 my5w为20个未赋值的字变量 my6c为100的常量 my7c表示字符串:Personal Computer解答my1bbyte 'Personal Computer'my2bbyte 20my3bbyte 14hmy4bbyte 00010100bmy5wword 20 dup(?)my6c= 100my7cequ <Personal Computer>习题3.11定义常量NUM,其值为5;数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-10,2,5和4,最后1个单元初值不定。解答numequ 5datalistbyte -10,2,5,4,?习题3.12从低地址开始以字节为单位,用十六进制形式给出下列语句依次分配的数值:byte 'ABC',10,10h,'EF',3 dup(-1,?,3 dup(4)word 10h,-5,3 dup(?)解答41 42 43 0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 FF 00 04 04 0410 00 FB FF 00 00 00 00 00 00习题3.19请分别用一条汇编语言指令完成如下功能:(去E)(1)把EBX寄存器和EDX寄存器的内容相加,结果存入EDX寄存器。(2)用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。(3)用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加,并把结果送回存储器中。(4)将32位变量VARD与数3412H相加,并把结果送回该存储单元中。(5)把数0A0H与EAX寄存器的内容相加,并把结果送回EAX中。解答 add edx,ebx add al,ebx+esi add bx+0b2h,cx add varw,3412h add eax,0a0h习题3.20分别执行如下程序片断,说明每条指令的执行结果:(去E)(1)mov eax,80h; EAX_add eax,3; EAX_,CF_,SF_add eax,80h; EAX_,CF_,OF_adc eax,3; EAX_,CF_,ZF_(2)mov eax,100; EAX_add ax,200; EAX_,CF_(3)mov eax,100; EAX_add al,200; EAX_,CF_(4)mov al,7fh; AL_sub al,8; AL_,CF_,SF_sub al,80h; AL_,CF_,OF_sbb al,3; AL_,CF_,ZF_解答(1); EAX80H; EAX83H,CF0,SF0; EAX103H,CF0,OF0; EAX106H,CF0,ZF0(2); EAX100; EAX300,CF0(3); EAX100; EAX44,CF1(包含256的进位含义:25644300)(4)mov al,7fh; AL7FHsub al,8; AL77H,CF0,SF0sub al,80h; ALF7H,CF1,OF1sbb al,3; ALF3H,CF0,ZF0习题3.21(推敲)给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:mov al,89hadd al,aladd al,9dhcmp al,0bchsub al,aldec alinc al解答mov al,89h; AL89HCF ZFSFOFPFadd al,al; AL12H1 0011add al,9dh; AL0AFH0 0101cmp al,0bch; AL0AFH1 0101sub al,al; AL00H0 1001dec al; AL0FFH0 0101inc al; AL00H0 1001习题3.22有两个64位无符号整数存放在变量buffer1和buffer2中,定义数据、编写代码完成EDX.EAXbuffer1buffer2功能。(去E)解答; 数据段buffer1qword 67883000hbuffer2qword 67762000h; 代码段mov eax,dword ptr buffer1mov edx,dword ptr buffer1+4sub eax,dword ptr buffer2sbb edx,dword ptr buffer2+4习题3.23分别执行如下程序片断,说明每条指令的执行结果:(去E)(1)mov esi,10011100b; ESI_Hand esi,80h; ESI_Hor esi,7fh; ESI_Hxor esi,0feh; ESI_H(2)mov eax,1010b; EAX_Bshr eax,2; EAX_B,CF_shl eax,1; EAX_B,CF_and eax,3; EAX_B,CF_(3)mov eax,1011b; EAX_Brol eax,2; EAX_B,CF_rcr eax,1; EAX_B,CF_or eax,3; EAX_B,CF_(4)xor eax,eax; EAX_,CF_,OF_; ZF_,SF_,PF_解答(1); ESI9CH; ESI80H; ESIFFH; ESI01H(2); EAX1010B(可以有前导0,下同); EAX0010B,CF1; EAX0100B,CF0; EAX0000B,CF0(3); EAX1011B(可以有前导0,下同); EAX101100B,CF0; EAX10110B,CF0; EAX10111B,CF0(4); EAX0,CF0,OF0; ZF1,SF0,PF1习题3.243.24 给出下列各条指令执行后AX的结果,以及状态标志CF、OF、SF、ZF、PF的状态。mov ax,1470hand ax,axor ax,axxor ax,axnot axtest ax,0f0f0h解答mov ax,1470h; AX1470HCF OFSFZFPFand ax,ax; AX1470H0 0000or ax,ax; AX1470H0 0000xor ax,ax; AX0000H0 0011not ax; AXFFFFH0 0011test ax,0f0f0h; AX0F0F0H0 0101习题3.25逻辑运算指令怎么实现复位、置位和求反功能?解答AND指令同“0”与实现复位,OR指令同“1”或实现置位,XOR同“1”异或实现求反。习题3.27(去E)编程将一个64位数据逻辑左移3位,假设这个数据已经保存在EDX.EAX寄存器对中。解答; 代码段mov ecx,3again:shl eax,1rcl edx,1loop again习题3.28编程将一个压缩BCD码变量(例如92H)转换为对应的ASCII码,然后调用DISPC子程序(在输入输出子程序库中)显示。解答; 数据段bcdbyte 92h; 代码段mov al,bcdshr al,4add al,30hcall dispcmov al,bcdand al,0fhadd al,30hcall dispc习题3.31下面程序的功能是将数组ARRAY1的每个元素加固定值(8000H),将和保存在数组ARRAY2。在空白处填入适当的语句或语句的一部分。; 数据段array1dword 1,2,3,4,5,6,7,8,9,10array2dword 10 dup(?); 代码段mov ecx,lengthof array1mov ebx,0again:mov eax,array1ebx*4add eax,8000hmov _add ebx,_loop again解答mov array2ebx*4,eaxadd ebx,1第4章 汇编语言程序设计习题4.1简答题(3)为什么判断无符号数大小和有符号大小的条件转移指令不同?(4)双分支结构中两个分支体之间的JMP指令有什么作用?(5)为什么特别强调为子程序加上必要的注释?(6)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?(7)参数传递的“传值”和“传址”有什么区别?(8)INCLUDE语句和INCLUDELIB有什么区别? 解答 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。 双分支结构中两个分支体之间的JMP指令,用于实现结束前一个分支回到共同的出口作用。 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。 子程序保持堆栈平衡,才能保证执行RET指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能就致使堆栈溢出。 “传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;“传址”时,被调用程序可能修改通过地址引用的变量内容。 INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件。习题4.3填空题(1)JMP指令根据目标地址的转移范围和寻址方式,可以分成四种类型:段内转移、_,段内转移、_和段间转移、_,段间转移、_。(2)假设在平展存储模型下,EBX1256H,双字变量TABLE的偏移地址是20A1H,线性地址32F7H处存放3280H,执行指令“JMP EBX” 后EIP_,执行指令“JMP TABLEEBX”后EIP_。 (3)“CMP EAX,3721H”指令之后是JZ指令,发生转移的条件是EAX_,此时ZF_。(去E)(5)循环结构程序一般有三个部分组成,它们是_,循环体和_部分。(7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是_。宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是_。(8)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_。(9)MASM汇编语言中,声明一个共用的变量应使用_伪指令;而使用外部变量要使用_伪指令声明。解答 相对寻址,间接寻址,直接寻址,间接寻址 1256H,3280H 3721H,1 循环初始,循环控制 TEST ENDP,ENDM EBP PUBLIC,EXTERN习题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.8在采用奇偶校验传输数据的接收端应该验证数据传输的正确性。例如,如果采用偶校验,那么在接收到的数据中,其包含“1”的个数应该为0或偶数个,否则说明出现传输错误。现在,在接收端编写一个这样的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在Rdata变量中。解答; 数据段Rdatabyte 57h;保存接收的数据errorbyte 'Error !',0; 代码段mov al,Rdataand al,0ffh;标志PF反映“1”的个数jp done;个数为偶数,正确继续mov eax,offset error;个数为奇数,显示出错call dispmsgdone:习题4.10编程,首先测试双字变量DVAR的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”。解答; 数据段dvardword 57h; 代码段mov eax,dvartest eax,80000000hjnz nextltest eax,1jnz nextrmov al,'M'jmp donenextl:mov al,'L'jmp donenextr:mov al,'R'done: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' 数字 < 0?jb erdispcmp al,'9' 数字 > 9?ja erdispcall dispcrlfcall dispcjmp doneerdisp: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 fun 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,如超过则显示Overflow !。解答; 数据段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”。解答; 数据段stringbyte '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,'Y'jmp L3L2:pop ediinc ediloop L1mov al,'N'L3:call dispc习题4.16主存中有一个8位压缩BCD码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导0。由于位数较多,需要利用循环实现,但如何处理前导0和数据中间的0呢?不妨设置一个标记。编程实现。解答; 数据段bcddword 00371002h; 代码段mov esi,bcdcmp esi,0jnz goonmov al,'0'call 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 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; 显示处理前的字符串call 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: