好文档 - 专业文书写作范文服务资料分享网站

第5章_模块化程序设计

天下 分享 时间: 加入收藏 我要投稿 点赞

第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

suba

xchg call ret endp

ah,al dispc

习题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

call 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 ;转化成相应的ASCLL码值 call dispc ;以二进制的形式显示 pop eax

loop dbd pop ecx ret

dispbd endp

习题5.9

将例5-4的32位寄存器改用16位寄存器,仅实现输出-2 ~ +2-1之间的数据。 答: start:

mov ecx,lengthof array mov ebx,0

again: mov ax,array[ebx] call write call dispcrlf inc ebx inc ebx loop again exit 0

write proc push ebx push ecx push edx

mov 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 write3 write4: pop dx cmp dx,cx

15

15

第5章_模块化程序设计

第5章模块化程序设计5.1简答题(1)指令“CALLEBX”采用了指令的什么寻址方式?寄存器间接寻址(2)为什么MASM要求使用proc定义子程序?(这个问题不好回答,是不是作者写错了?我猜测可能的原因:在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序)(3)为什么特
推荐度:
点击下载文档文档为doc格式
6jmic6jxyo44p5c1cp2i5zpak1cssx00dbw
领取福利

微信扫码领取福利

微信扫码分享