第5章模块化程序设计.docx

上传人:b****4 文档编号:2974913 上传时间:2022-11-16 格式:DOCX 页数:17 大小:21.81KB
下载 相关 举报
第5章模块化程序设计.docx_第1页
第1页 / 共17页
第5章模块化程序设计.docx_第2页
第2页 / 共17页
第5章模块化程序设计.docx_第3页
第3页 / 共17页
第5章模块化程序设计.docx_第4页
第4页 / 共17页
第5章模块化程序设计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第5章模块化程序设计.docx

《第5章模块化程序设计.docx》由会员分享,可在线阅读,更多相关《第5章模块化程序设计.docx(17页珍藏版)》请在冰豆网上搜索。

第5章模块化程序设计.docx

第5章模块化程序设计

第5章模块化程序设计

5.1简答题

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

寄存器间接寻址

(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)指令“RETi16”的功能相当于“RET”指令和“ADDESP,__________”组合。

i16

(2)例5-1程序中的ret指令,如果用popebp和jmpebp指令替换,则ebp内容是()

0000000分

(3)子程序的参数传递主要有3种,它们是()、()和()。

寄存器传递,共享变量传递,堆栈传递

(4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:

____。

如果将该编码加37H,则为_____,它是字符______的ASCII码值。

A,41H,A

(5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_____。

EBP

(6)MASM汇编语言中,声明一个共用的变量应使用___伪指令;而使用外部变量要使用___伪指令声明。

PUBLIC,EXTERN

(7)过程定义开始是“TESTPROC”语句,则过程定义结束的语句是________。

宏定义开始是“DISPMACRO”语句,则宏定义结束的语句是________。

TESTENDP,ENDM

(8)一个宏定义开始语句“WriteCharMACROCHAR:

REQ”,则宏名是(),参数有()个,并且使用“:

REQ”说明该参数()。

WriteChar,1,不可缺少

(9)实现“byte20dup(20h)”语句的功能也可以使用重复汇编,第1个语句是(),第2个语句是“byte20h”,第3个语句是()。

REPEAT20,ENDM

(10)条件汇编语言语句“IFNUMLT100”中的LT表示(),该语句需要配合()语句结束条件汇编

小于,ENDIF

习题5.4

如下子程序完成对ECX个元素的数组(由EBX指向其首地址)的求和,通过EDX和EAX返回结果,但是程序有错误,请改正。

Crazyproc

Pusheax

Xoreax,eax

Xoredx,edx

Again:

Addeax,[ebx]

Adcedx,0

Addebx,4

Loopagain

Ret

ENDPCrazy

答:

Crazyproc

Xoreax,eax

Xoredx,edx

Again:

Addeax,[ebx]

Adcedx,0

Addebx,4

Loopagain

Ret

CrazyENDP

习题5.5

请按如下说明编写子程序:

子程序功能:

把用ASCII码表示的两位十进制数转换为压缩BCD码。

入口参数:

DH=十位数的ASCII码,DL=个位数的ASCII码

出口参数:

AL=对应的BCD码

答:

asc2bcdproc

shldh,4

anddl,0fh

ordh,dl

moval,dh

ret

asc2bcdendp

习题5.6

乘法的非压缩BCD码调整指令AAM执行的操作是:

AH<-AL/10的商,AL<-AL/10的余数。

利用AAM可以实现将AL中的100内数据转换为ASCII码,程序如下:

Xorah,ah

Aam

Addax,3030h

利用这段程序,编写一个显示AL中数值(0~99)的子程序。

答:

subaproc

aam

addax,3030h

xchgah,al

calldispc

xchgah,al

calldispc

ret

subaendp

习题5.7

编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下退格键(对应ASCII码是08H)则程序退出。

请调用书中的HTOASC子程序

答:

;代码段,主程序

again:

callreadc

cmpal,08h;退格键BS=08H

jzdone

movbl,al

moval,':

'

calldispc

moval,bl

rolal,4

callhtoasc;调用子程序

calldispc;显示一个字符

moval,bl

callhtoasc;调用子程序

calldispc;显示一个字符

calldispcrlf

jmpagain

done:

习题5.8

编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。

答:

;代码段,主程序

moveax,8F98FF00H

calldispbd;调用子程序

;代码段,子程序

dispbdproc;32位二进制数的输出

pushecx

movecx,32;要输出的字符个数

dbd:

roleax,1;AL循环左移一位

pusheax

andal,01h;取AL最低位

addal,30h;转化成相应的ASCLL码值

calldispc;以二进制的形式显示

popeax

loopdbd

popecx

ret

dispbdendp

习题5.9

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

答:

start:

movecx,lengthofarray

movebx,0

again:

movax,array[ebx]

callwrite

calldispcrlf

incebx

incebx

loopagain

exit0

writeproc

pushebx

pushecx

pushedx

movebx,offsetwritebuf

testax,ax

jnzwrite1

movbyteptr[ebx],30h

incebx

jmpwrite5

write1:

jnswrite2

movbyteptr[ebx],'-'

incebx

negax

write2:

movcx,10

pushcx

write3:

cmpax,0

jzwrite4

xordx,dx

divcx

adddx,30h

pushdx

jmpwrite3

write4:

popdx

cmpdx,cx

jewrite5

mov[ebx],dl

incebx

jmpwrite4

write5:

movbyteptr[ebx],0

moveax,offsetwritebuf

calldispmsg

popedx;恢复寄存器

popecx

popebx

ret;子程序返回

writeendp

习题5.10

参考例5-6,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。

答:

includeio32.inc

.data

count=5

arraydwordcountdup(0)

tempdword?

;共享变量

readbufbyte30dup(0)

.code

start:

movecx,count

movebx,offsetarray

again:

callread;调用子程序,输入一个数据

moveax,temp;获得出口参数

mov[ebx],eax;存放到数据缓冲区

addebx,4

dececx

jnzagain

exit0

readproc

pusheax

pushebx

pushecx

pushedx

read0:

moveax,offsetreadbuf

callreadmsg

testeax,eax

jzreaderr

cmpeax,10

jareaderr

movedx,offsetreadbuf

xorebx,ebx

read1:

moval,[edx]

read2:

incedx

cmpal,'0'

jbreaderr

cmpal,'9'

jareaderr

subal,30h

imulebx,10

jcreaderr

movzxeax,al

addebx,eax

cmpebx,0ffffffffh

jareaderr

deccx

jnzread1

jmpread5

readerr:

moveax,offseterrmsg

calldispmsg

jmpread0

;

read5:

movtemp,ebx

popedx

popecx

popebx

popeax

ret

errmsgbyte'Inputerror,enteragain:

',0

readendp

endstart

习题5.11

编写一个计算字节校验

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1