完整word版第5章模块化程序设计Word下载.docx

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

完整word版第5章模块化程序设计Word下载.docx

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

完整word版第5章模块化程序设计Word下载.docx

(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"

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

说明该参数()。

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

答:

Xoreax,eax

Addeax,[ebx]

Adcedx,0

CrazyENDP

习题5.5

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

子程序功能:

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

入口参数:

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

出口参数:

AL=对应的BCD码

答:

asc2bcdproc

shldh,4

anddl,0fh

ordh,dl

moval,dh

ret

asc2bcdendp

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

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码值

以二进制的形式显示

popeax

loopdbd

popecx

dispbdendp

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

cmpal,'

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

编写一个计算字节校验和的子程序。

(所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。

)主程序提供入口参数,包括数据个数和数据缓冲区的首地址。

子程序回送求和结果这个出口参数。

计算字节校验和的通用过程

入口参数:

DS:

EBX=数组的段地址:

偏移地址

ECX=元素个数

出口参数:

AL=校验和

说明:

除EAX/EBX/ECX外,不影响其他寄存器

checksumproc

xoral,al;

累加器清0

sum:

addal,[ebx];

求和

incebx;

指向下一个字节

loopsum

checksumendp

习题5.12

编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。

(1)采用EAX寄存器传递这个32位二进制数。

(2)采用temp变量传递这个32位二进制数。

(3)采用堆栈方法传递这个32位二进制数。

(1)

.code

start:

moveax,1234abcdh;

假设一个要显示的数据

callBin2Hex

Bin2Hexproc

movecx,8;

8位十六进制数

roleax,4;

高4位循环移位进入低4位

pusheax;

子程序利用AL返回结果,所以需要保存EAX中的数据

popeax;

恢复保存的数据

htoascproc;

将AL低4位表达的一位十六进制数转换为ASCII码

andal,0fh;

只取AL的低4位

oral,30h;

AL高4位变成3,实现加30H

cmpal,39h;

是0~9,还是A~F

jbehtoend

addal,7;

是A~F,其ASCII码再加上7

htoend:

htoascendp

Bin2Hexendp

13

利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。

其入口参数:

EAX=主存偏移地址,ECX=字节个数(主存区域的长度)。

同时编写一个主程序进行验证.

;

数据段

varbyte'

Thisisatest!

主程序

moveax,offsetvar

movecx,sizeofvar

calldispmem

;

子程序

dispmemproc

pushebx

movebx,eax

dispm1:

cmpecx,0

jzdispm2

moval,[ebx]

calldisphb

moval,'

'

incebx

jmpdispm1

dispm2:

dispmemendp

习题5.14

数据输入输出程序.使用有符号十进制数据输入(例5-6)、求平均值(例5-7)以及输出子程序(例5—4),编程实现从键盘输入10个数据,并输出它们的平均值。

(1)编写主程序文件:

定义必要的变量和交互信息,调用子程序输入10个数据,求平均值然后输出。

(2)编写子程序文件:

包括3个子程序的过程定义。

(3)说明进行模块连接的开发过程,并上机实现。

(4)将子程序文件形成一个子程序库,说明开发过程并上机实现。

数据定义

count=10

writebufbyte12dup(0);

显示缓冲区

主程序

again:

callread;

mov[ebx],eax;

pushlengthofarray;

压入数据个数

pushoffsetarray;

压数组的偏移地址

callmean;

调用求平均值子程序,出口参数:

EAX=平均值(整数部分)

addesp,8;

平衡堆栈(压入了8个字节数据)

callwrite

习题5.18

编写一个宏swap,参数是两个32位寄存器或存储器操作数,宏定义体实现两个操作数位置交换,包括两个都是存储器操作数的情况。

SWAPMACROop1,op2

PUSHOP1

PUSHOP2

POPOP1

POPOP2

ENDM

19

定义一个使用逻辑指令的宏LOGICAL。

(1)用它代表4条逻辑运算指令:

AND/OR/XOR/TEST,可以使用3个形式参数,并给出一个宏调用以及对应宏展开的例子.

(2)必要时做一点修改,使该宏能够把NOT指令包括进去,给出一个使用NOT指令的宏调用以及对应宏展开的例子。

LOGICALMACROop,dst,src

opdst,src

ENDM

LOGICALand,eax,1

0000000083E0011andeax,1

LOGICALor,eax,1

0000000383C8011oreax,1

LOGICALxor,eax,1

0000000683F0011xoreax,1

LOGICALtest,eax,1

00000009A9000000011testeax,1

(2)

IFB<

src〉

opdst

ELSE

opdst,src

ENDIF

LOGICALnot,eax

00000000F7D01noteax

习题5.20

有一个宏定义:

Defstrmacroname,num,string

Name&numbyte‘&

string&

‘,0

Endm

给出如下宏调用的宏展开:

(1)defstrmsg,4,<

Chapter4:

ProgramStructure〉

(2)defstrmsg,5,〈Chapter5:

ProcedureProgramming>

Msg4byte‘Chapter4:

ProgramStructure’,0

Msg5byte‘Chapter5:

ProcedureProgramming'

,0

习题5.21

定义一个宏“movestrstrN,,dstr,sstr"

,它将strN个字符从一个字符区sstr传送到另一个字符区dstr。

假设数据段定义如下缓冲区,请使用上述宏的调用实现STRING1到STRING2的传送。

String1byte‘Inamajormatter,nodetailaresmall.’,0

String2bytesizeofstring1dup(0)

movestrMACROstrN,dstr,sstr

pushesi

pushedi

movecx,strN

leaesi,sstr

leaedi,dstr

cld

repmovsb

popedi

popesi

习题5.22

利用重复汇编定义一个数据区,数据区有100个双字,每个双子的高字部分依次是2,4,6,...,200,低字部分都是0。

num=0

REPEAT100

num=num+2

word0,num

23

利用宏结构完成以下功能:

如果名为count的数大于5,指令“ADDEAX,EAX”将汇编10次,否则什么也不汇编。

IFcountGT5

REPEAT10

ADDEAX,EAX

ENDM

24

用宏结构实现宏指令FINSUM,它比较两个数varx和vary,若varx〉=vary,则执行sum=varx+8*vary,否则执行sum=4*varx+vary。

FINSUMMACROvarx,vary

IFvarxGEvary

sum=varx+8*vary

sum=4*varx+vary

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

当前位置:首页 > 工程科技 > 能源化工

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

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