《微机原理与接口技术(第四版)课后习题答案.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术(第四版)课后习题答案.docx(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 1 章 微型计算机系统习题 1.1简答题(2) 总线信号分成哪三组信号?(3) PC 机主存采用 DRAM 组成还是 SRAM 组成?(5) ROM-BIOS 是什么?(6) 中断是什么?(9)处理器的“取指译码执行周期”是指什么?解答 总线信号分成三组,分别是数据总线、地址总线和控制总线。PC机主存采用 DRAM 组成。ROM-BIOS 是“基本输入输出系统”,操作系统通过对 BIOS 的调用驱动各硬件设备,用户也可以在应用程序中调用 BIOS 中的许多功能。 中断是 CPU 正常执行程序的流程被某种原因打断、并暂时停止,转向执行事先安排好的一段处理程序,待该处理程序结束后仍返回被中断的
2、指令继续执行的过程。 指令的处理过程。处理器的“取指译码执行周期” 是指处理器从主存储器读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的操作(简称执行)的过程。习题 1.3填空题(2) Intel 8086 支持 容量主存空间,80486 支持 容量主存空间。(3) 二进制 16 位共有 个编码组合,如果一位对应处理器一个地址信号,16 位地址信号共能寻址 容量主存空间。(9)最初由公司采用 Intel 8088 处理器和()操作系统推出 PC 机。1MB ,4GB2 16,64KB(9)IBM,DOS习题 1.4说明微型计算机系统的硬件组成及各部分作用。解答CPU:
3、CPU 也称处理器,是微机的核心。它采用大规模集成电路芯片,芯片内集成了控制器、运算器和若干高速存储单元(即寄存器)。处理器及其支持电路构成了微机系统的控制中心,对系统的各个部件进行统一的协调和控制。存储器:存储器是存放程序和数据的部件。外部设备:外部设备是指可与微机进行交互的输入(Input)设备和输出(Output)设备,也称 I/O 设备。I/O 设备通过 I/O 接口与主机连接。.总线:互连各个部件的共用通道,主要含数据总线、地址总线和控制总线信号。习题 1.7区别如下概念:助记符、汇编语言、汇编语言程序和汇编程序。解答助记符:人们采用便于记忆、并能描述指令功能的符号来表示机器指令操作
4、码,该符号称为指令助记符。汇编语言:用助记符表示的指令以及使用它们编写程序的规则就形成汇编语言。汇编语言程序:用汇编语言书写的程序就是汇编语言程序,或称汇编语言源程序。汇编程序:汇编语言源程序要翻译成机器语言程序才可以由处理器执行。这个翻译的过程称为“汇编”,完成汇编工作的程序就是汇编程序(Assembler)。第 2 章 处理器结构习题 2.1简答题(1)ALU 是什么?(2)8086 的取指为什么可以被称为指令预取?(4) 堆栈的存取原则是什么?(5) 标志寄存器主要保存哪方面的信息?(6) 执行了一条加法指令后,发现 ZF1,说明结果是什么?(9)汇编语言源程序文件中,END 语句后的语
5、句会被汇编吗?解答ALU 是算术逻辑运算单元,负责处理器所能进行的各种运算,主要是算术运算和逻辑运算。 取指是指从主存取出指令代码通过总线传输到处理器内部指令寄存器的过程。8086 分成总线接口单元和指令执行单元,可以独立操作。在执行单元执行一条指令的同时,总线接口单元可以读取下一条指令,等到执行时不需要进行取指了,所以称为预取。 堆栈的存取原则是先进后出(也称为后进先出)操作方式存取数据。 标志寄存器主要保存反映指令执行结果和控制指令执行形式的有关状态。 执行了一条加法指令后,发现 ZF1,表明运算结果为 0。 不会。word 版本习题 2.3填空题(3)逻辑地址由 和 两部分组成。代码段中
6、下一条要执行的指令由 CS 和 寄存器指示,后者在实地址模型中起作用的仅有 寄存器部分。(4)进行 8 位二进制数加法:1011101001101100,8 位结果是 , 标志 PF 。(5)在实地址工作方式下,逻辑地址“7380H400H”表示的物理地址是 ,并且该段起始于 物理地址。(9)除外设数据外的数据寻址方式有 3 类,分别被称为 、 和 。解答 段地址,偏移地址,EIP,IP00100110 ,073C00H ,73800H 立即数寻址、寄存器寻址和存储器寻址习题 2.4处理器内部具有哪 3 个基本部分?8086 分为哪两大功能部件?其各自的主要功能是什么?解答处理器内部有 ALU
7、、寄存器和指令处理三个基本单元。8086 有两大功能部件:总线接口单元和执行单元。总线接口单元:管理着 8086 与系统总线的接口,负责处理器对存储器和外设进行访问。8086 所有对外操作必须通过 BIU 和这些总线进行。执行单元 EU:负责指令译码、数据运算和指令执行。习题 2.58086 怎样实现了最简单的指令流水线?解答8086 中,指令的读取是在 BIU 单元,而指令的执行是在 EU 单元。因为 BIU 和 EU 两个单元相互独立、分别完成各自操作,所以可以并行操作。也就是说, 在 EU 单元对一个指令进行译码执行时,BIU 单元可以同时对后续指令进行读取; 这就是最简单的指令流水线技
8、术。习题 2.8什么是 8086 中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达(均为十六进制形式):FFFF 040 172000 4500B821 4567解答物理地址:在处理器地址总线上输出的地址称为物理地址。每个存储单元有一个唯一的物理地址。逻辑地址:在处理器内部、程序员编程时采用逻辑地址,采用“段地址:偏移地址“形式。某个存储单元可以有多个逻辑地址,即处于不同起点的逻辑段中, 但其物理地址是唯一的。逻辑地址转换成物理地址:逻辑地址由处理器在输出之前转换为物理地址。将逻辑地址中的段地址左移二进制 4 位(对应 16 进制是一位,即乘以 16),加上偏
9、移地址就得到 20 位物理地址。FFFFH:0 FFFF0H40H:17H 00417H2000H:4500H 24500HB821H:4567H BC777H习题 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
10、(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) 数值 5
11、00,能够作为字节变量的初值吗?(6) 都是获取偏移地址,为什么指令“LEA EBX, ESI”正确,而指令“MOVEBX, OFFSETESI”就错误?(7) INC,DEC,NEG 和 NOT 都是单操作数指令,这个操作数应该是源操作数还是目的操作数?(9) 乘除法运算针对无符号数和有符号数,有两种不同的指令。只有一种指令的加减法如何区别无符号数和有符号数运算?(10) 逻辑与运算为什么也称为逻辑乘?解答 没有。使用二进制 8 位表达无符号整数,257 没有对应的编码。 字符“F”的 ASCII 码就是数值 46H,所以没有区别。 汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,
12、故称数值表达式为常量。 不能。数值 500 大于一个字节所能表达的数据量,所以不能为字节变量赋值。 前者在指令执行时获得偏移地址,是正确的;但后者的 OFFSET 只能在汇编阶段获得偏移地址,但此时寄存器内容是不可知的,所以无法获得偏移地址。INC ,DEC,NEG 和 NOT 指令的操作数既是源操作数也是目的操作数。 加减法不区别无符号数和有符号数,但根据运算结果分别设置标志寄存器的 CF 和 OF 标志,可利用 CF 和 OF 进行区别。 逻辑与运算规则类似二进制的乘法,所以称其为逻辑乘。习题 3.3填空题(1) 定义字节变量的伪指令助记符是 ,获取变量名所具有的偏移地址的操作符是 。(2
13、) 计算机中有一个“01100001”编码。如果把它认为是无符号数,它是10 进制数 ;如果认为它是 BCD 码,则表示真值 ;又如果它是某个 ASCII 码,则代表字符 。(3)C 语言用“n”表示让光标回到下一行首位,在汇编语言中需要输出两个控制字符:一个是回车,其 ASCII 码是 ,它将光标移动到当前所在行的首位;另一个是换行,其 ASCII 码是 ,它将光标移到下一行。(4) 数据段有语句“H8843 DWORD 99008843H”,代码段指令“MOV CX, WORDPTR H8843”执行后,CX 。(5) 用 DWORD 定义的一个变量 XYZ,它的类型是 ,用“TYPE X
14、YZ”会得到数值为 。如果将其以字量使用,应该用 说明。(6) 数据段有语句“ABC BYTE 1,2,3”,代码段指令“MOV CL, ABC+2”执行后,CL 。解答BYTE ,OFFSET97 ,61,小写字母 a0DH (13),0AH(10)8843HDWORD ,4,WORD PTR XYZ3习题 3.4下列十六进制数表示无符号整数,请转换为十进制形式的真值:FFH 0H 5EH EFH解答255094239习题 3.5将下列十进制数真值转换为压缩 BCD 码:12246899解答12H24H68H99H习题 3.6将下列压缩 BCD 码转换为十进制数:10010001100010
15、010011011010010000解答91893690习题 3.7将下列十进制数用 8 位二进制补码表示:0127127 57解答00000000011111111000000111000111习题 3.8进行十六进制数据的加减运算,并说明是否有进位或借位:1234H 7802HF034H 5AB0HC051H 1234H9876H ABCDH解答1234H 7802H8A36H,无进位F034H 5AB0H4AF4H,有进位C051H 1234HBE1DH,无借位9876H ABCDHECA9H,有借位习题 3.10设置一个数据段,按照如下要求定义变量或符号常量:my1b为字符串变量:Pe
16、rsonal Computermy2b为用十进制数表示的字节变量:20my3b为用十六进制数表示的字节变量:20my4b为用二进制数表示的字节变量:20my5w为 20 个未赋值的字变量my6c为 100 的常量my7c表示字符串:Personal Computer解答my1bbyte Personal Computer my2bbyte 20my3b byte 14hmy4b byte 00010100b my5w word 20 dup(?) my6c = 100my7cequ 习题 3.11定义常量 NUM,其值为 5;数据段中定义字数组变量 DATALIST,它的头 5 个字单元中依次
17、存放-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 寄存器
18、和 EDX 寄存器的内容相加,结果存入 EDX 寄存器。(2) 用寄存器 EBX 和 ESI 的基址变址寻址方式把存储器的一个字节与 AL 寄存器的内容相加,并把结果送到 AL 中。(3) 用 EBX 和位移量 0B2H 的寄存器相对寻址方式把存储器中的一个双字和 ECX 寄存器的内容相加,并把结果送回存储器中。(4) 将 32 位变量 VARD 与数 3412H 相加,并把结果送回该存储单元中。(5) 把数 0A0H 与 EAX 寄存器的内容相加,并把结果送回 EAX 中。解答add edx,ebxadd al,ebx+esiadd bx+0b2h,cxadd varw,3412hadd e
19、ax,0a0h习题 3.20分别执行如下程序片断,说明每条指令的执行结果:(去 E)(1)mov eax,80h add eax,3 add eax,80h adc eax,3; EAX ; EAX ,CF ,SF ; EAX ,CF ,OF ; 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 ,
20、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,SF0 sub al,80h ; ALF7H,CF1,OF1 sbb al,3 ; ALF3H,CF0,ZF0习题 3.21(推敲)给出下列各条指令执行后 AL 值,以及 CF、ZF、SF、OF 和 PF 的状态: mov al,89hadd al
21、,al add al,9dh cmp al,0bch sub al,al dec alinc al解答moval,89h;AL89HCFZFSFOFPFaddal,al;AL12H10011addal,9dh;AL0AFH00101cmpal,0bch;AL0AFH10101subal,al;AL00H01001decal;AL0FFH00101incal;AL00H01001习题 3.22有两个 64 位无符号整数存放在变量 buffer1 和 buffer2 中,定义数据、编写代码完成 EDX.EAXbuffer1buffer2 功能。(去 E)解答; 数据段buffer1qword 67
22、883000h buffer2qword 67762000h; 代码段mov eax,dword ptr buffer1 mov edx,dword ptr buffer1+4 sub eax,dword ptr buffer2 sbb edx,dword ptr buffer2+4习题 3.23分别执行如下程序片断,说明每条指令的执行结果:(去 E)(1)mov esi,10011100b; ESI Hand esi,80hor esi,7fh xor esi,0feh(2);ESI HESI H ESI Hmov eax,1010b;EAX Bshr eax,2;EAX B,CF shl
23、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; E
24、AX10110B,CF0; EAX10111B,CF0(4); EAX0,CF0,OF0;ZF1,SF0,PF1习题 3.243.24 给出下列各条指令执行后 AX 的结果,以及状态标志 CF、OF、SF、ZF、PF 的状态。mov ax,1470h and ax,axor ax,ax xor ax,ax not axtest ax,0f0f0h解答mov ax,1470h;AX1470HCFOFSFZFPFand ax,ax;AX1470H00000or ax,ax;AX1470H00000xor ax,ax;AX0000H00011not ax;AXFFFFH00011test ax,0f
25、0f0h;AX 0F0F0H00101习题 3.25逻辑运算指令怎么实现复位、置位和求反功能?解答AND 指令同“0”与实现复位,OR 指令同“1”或实现置位,XOR 同“1”异或实现求反。习题 3.27(去 E)编程将一个 64 位数据逻辑左移 3 位,假设这个数据已经保存在 EDX.EAX 寄存器对中。解答; 代码段mov ecx,3again: shl eax,1rcl edx,1 loop again习题 3.28编程将一个压缩 BCD 码变量(例如 92H)转换为对应的 ASCII 码, 然后调用 DISPC 子程序(在输入输出子程序库中)显示。解答; 数据段bcdbyte 92h;
26、 代码段mov al,bcd shr al,4 add al,30h call dispc mov al,bcd and al,0fh add al,30h call dispc习题 3.31下面程序的功能是将数组 ARRAY1 的每个元素加固定值(8000H), 将和保存在数组 ARRAY2。在空白处填入适当的语句或语句的一部分。; 数据段array1 dword 1,2,3,4,5,6,7,8,9,10 array2 dword 10 dup(?); 代码段mov ecx,lengthof array1 mov ebx,0again: mov eax,array1ebx*4 add eax
27、,8000hmov add ebx, loop again解答mov array2ebx*4,eax add ebx,1第 4 章 汇编语言程序设计习题 4.1简答题(3) 为什么判断无符号数大小和有符号大小的条件转移指令不同?(4) 双分支结构中两个分支体之间的 JMP 指令有什么作用?(5) 为什么特别强调为子程序加上必要的注释?(6) 子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?(7) 参数传递的“传值”和“传址”有什么区别?(8) INCLUDE 语句和 INCLUDELIB 有什么区别?解答 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大
28、小关系要利用不同的标志位组合,所以有对应的两组指令。 双分支结构中两个分支体之间的 JMP 指令,用于实现结束前一个分支回到共同的出口作用。 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。 子程序保持堆栈平衡,才能保证执行 RET 指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间, 否则多次调用该子程序可能就致使堆栈溢出。 “传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;“传址”时,被调用程序可能修改通过地址引用的变量内容。INCLUDE 语句包含的
29、是文本文件、是源程序文件的一部分;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)循环结构程序一般有三个部
30、分组成,它们是 ,循环体和 部分。(7) ) 过程定义开始是“ TEST PROC”语句,则过程定义结束的语句是 。宏定义开始是“ DISP MACRO”语句,则宏定义结束的语句是 。(8) 利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是 。(9) MASM 汇编语言中,声明一个共用的变量应使用 伪指令;而使用外部变量要使用 伪指令声明。解答 相对寻址,间接寻址,直接寻址,间接寻址1256H ,3280H3721H ,1 循环初始,循环控制TEST ENDP ,ENDMEBPPUBLIC ,EXTERN习题 4.6执行如下程序片断后,CMP 指令分别使得 5 个状态标志 C
31、F、ZF、SF、OF 和PF 为 0 还是为 1?它会使得哪些条件转移指令指令 Jcc 的条件成立、发生转移?mov eax,20h cmp eax,80h解答CF1ZF0SF1OF0PF1可以使得条件成立、发生转移的指令有:JCJSJPJNZJNO习题 4.8在采用奇偶校验传输数据的接收端应该验证数据传输的正确性。例如,如果采用偶校验,那么在接收到的数据中,其包含“1”的个数应该为 0 或偶数个,否则说明出现传输错误。现在,在接收端编写一个这样的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在 Rdata 变量中。解答Rdata
32、errordone:; 数据段byte 57h;保存接收的数据byte Error !,0; 代码段mov al,Rdataand al,0ffh;标志 PF 反映“1”的个数jp done;个数为偶数,正确继续mov eax,offset error ;个数为奇数,显示出错call dispmsg习题 4.10编程,首先测试双字变量 DVAR 的最高位,如果为 1,则显示字母“L”;如果最高位不为 1,则继续测试最低位,如果最低位为 1,则显示字母“R”; 如果最低位也不为 1,则显示字母“M”。解答; 数据段dvardword 57h; 代码段mov eax,dvartest eax,80
33、000000h jnz nextltest eax,1 jnz nextr mov al,M jmp donenextl: mov al,Ljmp done nextr: 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
34、inmsg ; 提示输入数字call dispmsgagain: call readc; 等待按键cmp al,0; 数字 9 ? ja erdispcall dispcrlf call dispc jmp doneerdisp:mov eax,offset ermsg call dispmsgjmp againdone:习题 4.12有一个首地址为 ARRAY 的 20 个双字的数组,说明下列程序段的功能。mov ecx,20 mov eax,0 mov esi,eaxsumlp: add eax,arrayesi add esi,4loop sumlp mov total,eax解答求这
35、20 个双字的和,保存在 TOTAL 变量,不关进心进位和溢出。习题 4.13编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在 SPACE 单元。解答; 数据段string byte Do you have fun with Assembly ?,0;以 0 结尾的字符串spacedword ?; 代码段mov esi,offset stringxor ebx,ebx;EBX 用于记录空格数again: mov al,esinext: done:cmp al,0 jz donecmp al,20h;空格的 ASCII 码是 20H jne next;不相等、
36、不是空格,转移inc bx;相等、是空格,空格个数加 1 inc esijmp again;继续循环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,0 mov ecx,100 xor ax,axagain: add a
37、x,arrayebx*2 jc overinc ebx loop againmov wordsum,axover:mov eax,offset error call dispmsg习题 4.15在一个已知长度的字符串中查找是否包含“BUG”子字符串。如果存在,显示“Y”,否则显示“N”。解答; 数据段string byte If you find any error in the program, you can DEBUG it. count= sizeof stringbugbyte BUG; 代码段mov ecx,countL1:LN:L2:L3:mov edi,offset strin
38、g mov esi,offset bug push edimov edx,sizeof bug mov al,esicmp edi,al jne L2inc esi inc edi dec edx jne LN pop edimov al,Y jmp L3pop edi inc edi loop L1 mov al,N call dispc习题 4.16主存中有一个 8 位压缩 BCD 码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导 0。由于位数较多,需要利用循环实现,但如何处理前导 0 和数据中间的 0 呢?不妨设置一个标记。编程实现。解答; 数据段bcddword 003
39、71002h; 代 码 段 mov esi,bcd cmp esi,0 jnz goon mov al,0 call dispc jmp donegoon:mov ecx,8xor ebx,ebx; EBX0,表示可能是前导 0 again: rol esi,4mov eax,esiand eax,0fh; EAX 低 4 位保存当前要显示的 BCD 码disp:next: done:cmp ebx,0 jnz disp cmp eax,0 jz next mov ebx,1 add al,30h call dispc loop again; EBX0,说明不是前导 0,要显示; EBX0,说
40、明可能是前导 0; EAX0,说明是前导 0,不显示; EAX0,没有前导 0 了,令 EBX10习题 4.17已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。解答; 数据段string byte Let us havea try !,0dh,0ah,0; 代码段mov ecx,sizeof string cmp ecx,2jb donelea eax,string; 显示处理前的字符串call dispmsgmov esi,ecx dec esioutlp: cmp stringesi, ; 检测是否是空格jnz next; 不是空格继续循环
41、mov edi,esi; 是空格,进入剔除空格分支dec ecxinlp:inc edimov al,stringedi; 前移一个位置mov stringedi-1,alcmp edi,ecx jb inlpnext:dec esi; 继续进行cmp esi,0jnz outlp; 为 0 结束lea eax,string; 显示处理后的字符串call dispmsgdone:习题 4.19请按如下说明编写子程序:子程序功能:把用 ASCII 码表示的两位十进制数转换为压缩 BCD 码入口参数:DH十位数的 ASCII 码,DL个位数的 ASCII 码出口参数:AL对应 BCD 码解答asc
42、tob procshl dh,4 mov al,dh and dl,0fh or al,dl retasctob endp习题 4.21编写一个源程序,在键盘上按一个键,将其返回的 ASCII 码值显示出来,如果按下ESC 键(对应ASCII 码是1BH)则程序退出。请调用书中的HTOASC子程序。解答; 代码段,主程序again: call readccmp al,1bh jz done mov bl,al mov al,: call dispc mov al,bl rol al,4call htoasc; 调用子程序call dispc; 显示一个字符mov al,blcall htoasc; 调用子程序call dispc; 显示一个字符call dispcrlfjmp againdone:习题 4.22编写一个子程序,它以二进制形