第5章_模块化程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第5章模块化程序设计

5.1 简答题

(1)指令“CALL EBX”采用了指令的什么寻址方式?

寄存器间接寻址

(2)为什么MASM要求使用proc定义子程序?

(这个问题不好回答,是不是作者写错了?我猜测可能的原因:在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序)

(3)为什么特别强调为子程序加上必要的注释?

便于程序员调用时使用,而不必关注子程序的内部实现。

(4)参数传递的“传值”和“传址”有什么区别?

传值是传递参数的拷贝,传址是传递参数的地址

(5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?

保证正确返回;释放传递参数占用的堆栈空间,避免多次调用可能导致的堆栈溢出(6)INCLUDE语句和INCLUDELIB有什么区别?

INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件

(7)什么是子程序库?

子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用

(8)调用宏时没有为形参提供实参会怎样?

缺少的实参,形参会做“空”处理。

(9)宏定义体中的标号为什么要用local为指令声明?

为了避免宏展开后出现标示符不唯一的情况,定义为局部。

(10)条件汇编不成立的语句会出现在可执行文件中吗?

不会。

5.2 判断题

(1)过程定义proc是一条处理器指令。

错,proc是伪指令

(2)CALL指令的执行并不影响堆栈指针ESP。

错,要改变,因为返回地址要压入堆栈

(3)call指令本身不能包含子程序的参数。

对。

(4) call指令用在调用程序中,如果被调用程序中也有call指令,说明出现了嵌套。对。

(5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。

错,不能保护传递出口参数的寄存器

(6)利用INCLUDE包含的源文件实际上只是源程序的一部分。

(7)宏调用与子程序调用一样都要使用CALL指令实现。

错,宏调用是通过宏展开实现的调用,不用CALL指令

(8)宏定义与子程序一样一般书写与主程序之后。

错,宏需要先定义后调用,一般在源程序开头部分。

(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在计算机内部用二进制“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”,则宏名是(),参数有 ( ) 个,并且使用“: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返回结果,但是程序有错误,请改正。

Crazy proc

Push eax

Xor eax,eax

Xor edx,edx

Again:

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=个位数的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中数值(0~99)的子程序。

答:

suba proc

aam

add ax,3030h

xchg ah,al

call dispc

相关文档
最新文档