第5章模块化程序设计Word格式文档下载.docx
《第5章模块化程序设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第5章模块化程序设计Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
(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
答:
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
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
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码值
以二进制的形式显示
popeax
loopdbd
popecx
dispbdendp
习题5.9
将例5-4的32位寄存器改用16位寄存器,仅实现输出-215~+215-1之间的数据。
start:
movecx,lengthofarray
movebx,0
movax,array[ebx]
callwrite
calldispcrlf
incebx
loopagain
exit0
writeproc
pushebx
pushedx
movebx,offsetwritebuf
testax,ax
jnzwrite1
movbyteptr[ebx],30h
jmpwrite5
write1:
jnswrite2
movbyteptr[ebx],'
-'
negax
write2:
movcx,10
pushcx
write3:
cmpax,0
jzwrite4
xordx,dx
divcx
adddx,30h
pushdx
jmpwrite3
write4:
popdx
cmpdx,cx
jewrite5
mov[ebx],dl
jmpwrite4
write5:
movbyteptr[ebx],0
moveax,offsetwritebuf
calldispmsg
popedx;
恢复寄存器
popebx
ret;
子程序返回
writeendp
习题5.10
参考例5-6,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。
includeio32.inc
.data
count=5
arraydwordcountdup(0)
tempdword?
共享变量
readbufbyte30dup(0)
.code
movecx,count
movebx,offsetarray
callread;
调用子程序,输入一个数据
moveax,temp;
获得出口参数
mov[ebx],eax;
存放到数据缓冲区
addebx,4
dececx
jnzagain
readproc
pusheax
read0:
moveax,offsetreadbuf
callreadmsg
testeax,eax
jzreaderr
cmpeax,10
jareaderr
movedx,offsetreadbuf
xorebx,ebx
read1:
moval,[edx]
read2:
incedx
cmpal,'
0'
jbreaderr
9'
jareaderr
subal,30h
imulebx,10
jcreaderr
movzxeax,al
addebx,eax
cmpebx,0ffffffffh
jareaderr
deccx
jnzread1
jmpread5
readerr:
moveax,offseterrmsg
jmpread0
read5:
movtemp,ebx
popedx
ret
errmsgbyte'
Inputerror,enteragain:
'
0
readendp
endstart
习题5.11
编写一个计算字节校验