第5章-模块化程序设计

上传人:cjc****537 文档编号:35018242 上传时间:2018-03-06 格式:DOC 页数:13 大小:103KB
返回 下载 相关 举报
第5章-模块化程序设计_第1页
第1页 / 共13页
第5章-模块化程序设计_第2页
第2页 / 共13页
第5章-模块化程序设计_第3页
第3页 / 共13页
第5章-模块化程序设计_第4页
第4页 / 共13页
第5章-模块化程序设计_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《第5章-模块化程序设计》由会员分享,可在线阅读,更多相关《第5章-模块化程序设计(13页珍藏版)》请在金锄头文库上搜索。

1、第 5章 模块化程序设计 5.1 简答题 (1)指令“CALL EBX”采用了指令的什么寻址方式? 寄存器间接寻址 (2)为什么MASM要求使用proc定义子程序? (这个问题不好回答,是不是作者写错了?我猜测可能的原因: 在汇编语言中, 函数、子程序等都称为过程,所以使用proc定义子程序 ) (3)为什么特别强调为子程序加上必要的注释? 便于程序员调用时使用,而不必关注子程序的内部实现。 (4)参数传递的“传值”和“传址”有什么区别? 传值是传递参数的拷贝,传址是传递参数的地址 (5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题? 保证正确返回;释放传递参数占用的堆栈空间,避免多次

2、调用可能导致的堆栈溢 出 (6)INCLUDE语句和INCLUDELIB有什么区别? INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含 的是子程序库文件 (7)什么是子程序库? 子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有 关定位信息,便于子程序的管理和调用 (8)调用宏时没有为形参提供实参会怎样? 缺少的实参,形参会做“空”处理。 (9)宏定义体中的标号为什么要用local为指令声明? 为了避免宏展开后出现标示符不唯一的情况,定义为局部。 (10)条件汇编不成立的语句会出现在可执行文件中吗? 不会。 5.2 判断题 (1)过程定

3、义 proc 是一条处理器指令。 错,proc 是伪指令 (2)CALL 指令的执行并不影响堆栈指针 ESP。 错,要改变,因为返回地址要压入堆栈 (3)call 指令本身不能包含子程序的参数。 对。 (4) call 指令用在调用程序中,如果被调用程序中也有 call 指令,说明出现了嵌套。 对。 (5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。 错,不能保护传递出口参数的寄存器 (6)利用 INCLUDE 包含的源文件实际上只是源程序的一部分。 对 (7)宏调用与子程序调用一样都要使用 CALL 指令实现。 错,宏调用是通过宏展开实现的调用,不用 CALL 指令(8

4、)宏定义与子程序一样一般书写与主程序之后。 错,宏需要先定义后调用,一般在源程序开头部分。 (9)重复汇编类似于宏汇编,需要先定义后调用。 错。 (10)条件汇编并不像条件转移指令那样使用标志作为条件 对。 5.3 填空题 (1)指令“RET i16”的功能相当于“RET”指令和“ADD ESP, _”组合。 i16 (2)例 5-1 程序中的 ret 指令,如果用 pop ebp 和 jmp ebp 指令替换,则 ebp 内容是( ) 0000000分 (3)子程序的参数传递主要有 3种,它们是( ) 、 ( )和( ) 。 寄存器传递,共享变量传递,堆栈传递 (4)数值 10在计算机内部用

5、二进制“1010”编码表示,用十六进制表达是:_。如果 将该编码加 37H,则为_,它是字符_的 ASCII 码值。 A,41H,A (5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_。 EBP (6)MASM 汇编语言中,声明一个共用的变量应使用_伪指令;而使用外部变量要使用 _伪指令声明。 PUBLIC,EXTERN (7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是_。宏定义 开始是“DISP MACRO”语句,则宏定义结束的语句是_。 TEST ENDP,ENDM (8)一个宏定义开始语句“WriteChar MACRO CHAR:REQ”

6、,则宏名是( ) ,参数 有 ( ) 个,并且使用“:REQ”说明该参数( ) 。 WriteChar, 1 , 不可缺少 (9)实现“byte 20 dup(20h)”语句的功能也可以使用重复汇编,第 1个语句是( ) ,第 2个语句是“ byte 20h” ,第 3个语句是( ) 。 REPEAT 20, ENDM (10)条件汇编语言语句“IF NUM LT 100”中的 LT 表示( ) ,该语句需要配合( ) 语句结束条件汇编 小于, ENDIF 习题 5.4 如下子程序完成对 ECX 个元素的数组(由 EBX 指向其首地址)的求和,通过 EDX 和 EAX 返回结果,但是程序有错误

7、,请改正。 Crazy proc Pusheax Xor eax,eax Xor edx,edxAgain: Add eax,ebx Adc edx,0 Add ebx,4 Loop again Ret ENDP Crazy 答: Crazy proc Xor eax,eax Xor edx,edx Again: Add eax,ebx Adc edx,0 Add ebx,4 Loop again Ret Crazy ENDP 习题 5.5 请按如下说明编写子程序: 子程序功能:把用 ASCII 码表示的两位十进制数转换为压缩 BCD 码。 入口参数:DH=十位数的 ASCII 码,DL=个位

8、数的 ASCII 码 出口参数:AL=对应的 BCD 码 答: asc2bcd proc shl dh,4 and dl,0fh or dh,dl mov al,dh ret asc2bcd endp 习题 5.6 乘法的非压缩 BCD 码调整指令 AAM 执行的操作是:AH-AL/10 的商,AL-AL/10 的余 数。利用 AAM 可以实现将 AL 中的 100内数据转换为 ASCII 码,程序如下: Xor ah,ah Aam Add ax,3030h 利用这段程序,编写一个显示 AL 中数值(099)的子程序。 答: suba proc aam add ax,3030hxchgah,a

9、l call dispc xchgah,al call dispc ret suba endp 习题 5.7 编写一个源程序,在键盘上按一个键,将其返回的 ASCII 码值显示出来,如果按下退格键 (对应 ASCII 码是 08H)则程序退出。请调用书中的 HTOASC 子程序 答: ;代码段,主程序 again: call readc cmp al,08h ;退格键 BS=08H jz done mov bl,al mov al,: call dispc mov al,bl rol al,4 call htoasc ;调用子程序 call dispc ;显示一个字符 mov al,bl ca

10、ll htoasc ;调用子程序 call dispc ;显示一个字符 call dispcrlf jmp again done: 习题 5.8 编写一个子程序,它以二进制形式显示 EAX 中 32位数据,并设计一个主程序验证。 答: ;代码段,主程序 mov eax,8F98FF00H call dispbd ;调用子程序 ;代码段,子程序 dispbd proc ;32 位二进制数的输出 push ecx mov ecx,32 ;要输出的字符个数 dbd: rol eax,1 ;AL 循环左移一位 push eax and al,01h ;取 AL 最低位 add al,30h ;转化成相

11、应的 ASCLL 码值call dispc ;以二进制的形式显示 pop eax loop dbd pop ecx ret dispbd endp 习题 5.9 将例 5-4 的 32位寄存器改用 16位寄存器,仅实现输出-2 15 +2 15 -1 之间的数据。 答: start: mov ecx,lengthof array mov ebx,0 again: mov ax,arrayebx call write call dispcrlf inc ebx inc ebx loop again exit 0 write proc push ebx push ecx push edx mov

12、ebx,offset writebuf test ax,ax jnz write1 mov byte ptr ebx,30h inc ebx jmp write5 write1: jns write2 mov byte ptr ebx,- inc ebx neg ax write2: mov cx,10 push cx write3: cmp ax,0 jz write4 xor dx,dx div cx add dx,30h push dx jmp write3write4: pop dx cmp dx,cx je write5 mov ebx,dl inc ebx jmp write4 w

13、rite5: mov byte ptr ebx,0 mov eax,offset writebuf call dispmsg pop edx ;恢复寄存器 pop ecx pop ebx ret ;子程序返回 write endp 习题 5.10 参考例 5-6,编写实现 32位无符号整数输入的子程序,并设计一个主程序验证。 答: include io32.inc .data count = 5 array dword count dup(0) tempdword ? ;共享变量 readbuf byte 30 dup(0) .code start: mov ecx,count mov ebx

14、,offset array again: call read ;调用子程序,输入一个数据 mov eax,temp ;获得出口参数 mov ebx,eax ;存放到数据缓冲区 add ebx,4 dec ecx jnz again exit 0 read proc push eax push ebx push ecx push edxread0: mov eax,offset readbuf call readmsg test eax,eax jz readerr cmp eax,10 ja readerr mov edx,offset readbuf xor ebx,ebx read1: m

15、ov al,edx read2: inc edx cmp al,0 jb readerr cmp al,9 ja readerr sub al,30h imul ebx,10 jc readerr movzx eax,al add ebx,eax cmp ebx,0ffffffffh ja readerr dec cx jnz read1 jmp read5 readerr: mov eax,offset errmsg call dispmsg jmp read0 ; read5: mov temp,ebx pop edx pop ecx pop ebx pop eax ret errmsg

16、byte Input error, enter again: ,0 read endp end start 习题 5.11编写一个计算字节校验和的子程序。 (所谓“校验和”是指不记进位的累加,常用于检查信 息的正确性。 )主程序提供入口参数,包括数据个数和数据缓冲区的首地址。子程序回送求 和结果这个出口参数。 答: ;计算字节校验和的通用过程 ;入口参数:DS:EBX数组的段地址:偏移地址 ECX元素个数 ;出口参数:AL校验和 ;说明:除 EAX/EBX/ECX 外,不影响其他寄存器 checksumproc xor al,al ;累加器清 0 sum:add al,ebx ;求和 inc ebx ;指向下一个字节 loop sum ret checksumendp 习题 5.12 编制 3个子程序把一个 32位二进制数用 8位十六进制形式在屏幕上显示出来,分别运

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号