_模块化程序设计
第第 5 5 章章 模块化程序设计模块化程序设计 5.15.1 简答题简答题 (1)指令“CALL EBX”采用了指令的什么寻址方式 寄存器间接寻址 (2)为什么 MASM 要求使用 proc 定义子程序 (这个问题不好回答,是不是作者写错了我猜测可能的原因 在汇编语言中, 函数、子程序等都称为过程,所以使用proc 定义子程序 ) (3)为什么特别强调为子程序加上必要的注释 便于程序员调用时使用,而不必关注子程序的内部实现。 (4)参数传递的“传值”和“传址”有什么区别 传值是传递参数的拷贝,传址是传递参数的地址 (5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题 保证正确返回;释放传递参数占用的堆栈空间,避免多次调用可能导致的堆栈溢出 (6)INCLUDE 语句和 INCLUDELIB 有什么区别 INCLUDE 语句包含的是文本文件、是源程序文件的一部分; INCLUDELIB 语句包含的 是子程序库文件 (7)什么是子程序库 子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关 定位信息,便于子程序的管理和调用 (8)调用宏时没有为形参提供实参会怎样 缺少的实参,形参会做“空”处理。 (9)宏定义体中的标号为什么要用 local 为指令声明 为了避免宏展开后出现标示符不唯一的情况,定义为局部。 (10)条件汇编不成立的语句会出现在可执行文件中吗 不会。 5.25.2 判断题判断题 (1)过程定义 proc 是一条处理器指令。 错,proc 是伪指令 (2)CALL 指令的执行并不影响堆栈指针ESP。 错,要改变,因为返回地址要压入堆栈 (3)call 指令本身不能包含子程序的参数。 对。 4 call 指令用在调用程序中,如果被调用程序中也有call 指令,说明出现了嵌套。 对。 (5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。 错,不能保护传递出口参数的寄存器 (6)利用 INCLUDE 包含的源文件实际上只是源程序的一部分。 对 (7)宏调用与子程序调用一样都要使用CALL 指令实现。 错,宏调用是通过宏展开实现的调用,不用CALL 指令 (8)宏定义与子程序一样一般书写与主程序之后。 错,宏需要先定义后调用,一般在源程序开头部分。 (9)重复汇编类似于宏汇编,需要先定义后调用。 错。 (10)条件汇编并不像条件转移指令那样使用标志作为条件 对。 5.35.3 填空题填空题 (1)指令“RET i16”的功能相当于“RET”指令和“ADD ESP, __________”组合。 i16 (2)例5-1 程序中的 ret 指令,如果用pop ebp 和 jmp ebp 指令替换,则ebp 内容是() 0000000 分 (3)子程序的参数传递主要有3 种,它们是() 、 ()和() 。 寄存器传递,共享变量传递,堆栈传递 (4)数值10 在计算机内部用二进制“1010”编码表示,用十六进制表达是 ____。如果将 该编码加 37H,则为_____,它是字符______的 ASCII 码值。 A,41H,A (5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_____。 EBP (6)MASM 汇编语言中,声明一个共用的变量应使用___伪指令;而使用外部变量要使用 ___伪指令声明。 PUBLIC,EXTERN (7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是________。宏定义开 始是“DISP MACRO”语句,则宏定义结束的语句是________。 TEST ENDP,ENDM (8)一个宏定义开始语句“WriteCharMACROCHARREQ” ,则宏名是() ,参数 有 个,并且使用“REQ”说明该参数() 。 WriteChar, 1 , 不可缺少 (9)实现“byte 20 dup20h”语句的功能也可以使用重复汇编,第1 个语句是() ,第 2 个语句是“ byte 20h” ,第 3 个语句是() 。 REPEAT 20, ENDM (10)条件汇编语言语句“IF NUM LT 100”中的LT 表示() ,该语句需要配合()语 句结束条件汇编 小于, ENDIF 习题习题 5.45.4 如下子程序完成对 ECX 个元素的数组(由EBX 指向其首地址)的求和,通过EDX 和 EAX 返回结果,但是程序有错误,请改正。 Crazyproc Pusheax Xor eax,eax Xor edx,edx Again Add eax,[ebx] Adc edx,0 Add ebx,4 Loopagain Ret ENDP Crazy 答 Crazyproc Xor eax,eax Xor edx,edx Again Add eax,[ebx] Adc edx,0 Add ebx,4 Loopagain Ret Crazy ENDP 习题习题 5.55.5 请按如下说明编写子程序 子程序功能把用 ASCII 码表示的两位十进制数转换为压缩BCD 码。 入口参数DH十位数的 ASCII 码,DL个位数的 ASCII 码 出口参数AL对应的 BCD 码 答 asc2bcd proc shldh,4 and dl,0fh ordh,dl mov al,dh ret asc2bcd endp 习题习题 5.65.6 乘法的非压缩 BCD 码调整指令 AAM 执行的操作是 AHvary,则执行 sumvarx8*vary,否则执行 sum4*varxvary。 答 FINSUM MACRO varx,vary IF varx GE vary sum varx 8 * vary ELSE sum 4*varxvary ENDIF ENDM