《汇编语言与接口技术》习题解答第三章.docx
- 文档编号:10536731
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:21
- 大小:59.30KB
《汇编语言与接口技术》习题解答第三章.docx
《《汇编语言与接口技术》习题解答第三章.docx》由会员分享,可在线阅读,更多相关《《汇编语言与接口技术》习题解答第三章.docx(21页珍藏版)》请在冰豆网上搜索。
《汇编语言与接口技术》习题解答第三章
3.16解:
movah,1;只允许输入小写字母
int21h
subal,20h;转换为大写字母
movdl,al
movah,2
int21h;显示
3.18解:
movax,bufX
cmpax,bufY
jgedone
movax,bufY
done:
movbufZ,ax
3.19解:
.modelsmall
.stack
.data
bufXdw-7
signXdb?
.code
.startup
cmpbufX,0;testbufX,80h
jlnext;jnznext
movsignX,0
jmpdone
next:
movsignX,-1
done:
.exit0
end
3.20解:
movdl,’2’
movax,bufX
cmpax,bufY
jenext1
decdl
next1:
cmpax,bufZ
jenext2
decdl
next2:
movah,2
int21h
3.22编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。
;wjxt322.asm
.modelsmall
.stack
.data
b_datadb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始数据
numequ10;数据个数
sumdb?
;预留结果单元
.code
.startup
xorsi,si;位移量清零
xoral,al;取第一个数
movcx,num;累加次数
again:
addal,b_data[si];累加
incsi;指向下一个数
loopagain;如未完,继续累加
movsum,al;完了,存结果
.exit0
end
3.30解:
lucaseproc
pushbx
movbx,offsetstring
cmpal,0
jecase0
cmpal,1
jzcase1
cmpal,2
jzcase2
jmpdone
case0:
cmpbyteptr[bx],0
jedone
cmpbyteptr[bx],’A’
jbnext0
cmpbyteptr[bx],’Z’
janext0
addbyteptr[bx],20h
next0:
incbx
jmpcase0
case1:
cmpbyteptr[bx],0
jedone
cmpbyteptr[bx],’a’
jbnext1
cmpbyteptr[bx],’z’
janext1
subbyteptr[bx],20h
next1:
incbx
jmpcase1
case2:
cmpbyteptr[bx],0
jedone
cmpbyteptr[bx],’A’
jbnext2
cmpbyteptr[bx],’Z’
janext20
addbyteptr[bx],20h
jmpnext2
next20:
cmpbyteptr[bx],’a’
jbnext2
cmpbyteptr[bx],’z’
janext2
subbyteptr[bx],20h
next2:
incbx
jmpcase2
done:
popbx
ret
lucaseendp
习题3.1解答:
参考教材(第60页)
习题3.6
问题:
⏹给出你采用一个源程序格式书写的例题3.1源程序
解答:
.modelsmall
.stack
.data
stringdb’Hello,Assembly!
’,0dh,0ah,’$’
.code
start:
movax,data
movds,ax
movdx,offsetstring
movah,9
int21h
movax,4c00h
int21h
endstart
习题3.12解答:
ORG伪指令
习题3.13解答:
段地址和偏移地址属性,类型属性
习题3.26
问题:
⏹过程定义的一般格式是怎样的?
子程序开始为什么常有PUSH指令、返回前为什么常有POP指令?
下面完成16位无符号数累加的子程序有什么不妥吗?
若有,请改正:
解答:
crazyPROC;crazyPROC
pushax;
xorax,ax;xorax,ax
xordx,dx;xordx,dx
again:
addax,[bx];again:
addax,[bx]
adcdx,0;adcdx,0
incbx;incbx
incbx;incbx
loopagain;loopagain
ret;ret
ENDPcrazy;crazyENDP
字量求和子程序
入口参数:
BX=数据首址
CX=数据个数
出口参数:
AX=和的低字
DX=和的高字
(进位部分)
习题3.28
问题:
⏹请按如下说明编写子程序:
;子程序功能:
把用ASCII码表示的两位十进制数转换为对应二进制数
;入口参数:
DH=十位数的ASCII码,DL=个位数的ASCII码
;出口参数:
AL=对应的二进制数
解答:
asctobproc
pushcx
;先转换十位数
anddh,0fh
shldh,1;乘以10
movch,dh
shldh,1
shldh,1
adddh,ch
;转换个位数
anddl,0fh
;十位数加个位数
adddh,dl
;设置出口参数
moval,dh
popcx
ret
asctobendp
习题3.34-1
问题:
⏹编写一个计算字节校验和的子程序。
所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。
主程序提供入口参数,有数据个数和数据缓冲区的首地址。
子程序回送求和结果这个出口参数。
传递参数方法自定。
解答:
;数据段
arraydb12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h
countequ$-array;数组元素个数
resultdb?
;校验和
;代码段(主程序)
movbx,offsetarray;BX←数组的偏移地址
movcx,count;CX←数组的元素个数
callchecksum;调用求和过程
movresult,al;处理出口参数
习题3.34-2
;代码段(子程序)
;计算字节校验和的通用过程
;入口参数:
DS:
BX=数组的段地址:
偏移地址
CX=元素个数
;出口参数:
AL=校验和
;说明:
除AX/BX/CX外,不影响其他寄存器
checksumproc
xoral,al;累加器清0
sum:
addal,[bx];求和
incbx;指向下一个字节
loopsum
ret
checksumendp
〔习题3.17〕
已知用于LED数码管的显示代码表为:
LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
db80h,90h,88h,83h,0c6h,0c1h,86h,8eh
它依次表示0~9、A~F这16个数码的显示代码。
现编写一个程序实现将lednum中的一个数字(0~9、A~F)转换成对应的LED显示代码。
〔解答〕
;数据段
LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
db80h,90h,88h,83h,0c6h,0clh,86h,8eh
lednumdb0ah
;代码段
movbx,offsetLEDtable
moval,lednum
xlat;al中存有对应的LED显示代码
〔习题3.21〕
例题3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段。
〔解答〕
;代码段
moval,number
movbx,0;BX←记录为1的位数
restart:
cmpal,0;AL=0结束
jzdone
again:
shral,1;最低位右移进入CF
jcnext;为1,转移
incbx;不为1,继续
jmpagain
next:
pushax
pushbx
shlbx,1;位数乘以2(偏移地址要用2个字节单元)
jmpaddrs[bx];间接转移:
IP←[table+BX]
;以下是各个处理程序段
fun0:
movdl,'0'
jmpdisp
fun1:
movdl,'1'
jmpdisp
fun2:
movdl,'2'
jmpdisp
fun3:
movdl,'3'
jmpdisp
fun4:
movdl,'4'
jmpdisp
fun5:
movdl,'5'
jmpdisp
fun6:
movdl,'6'
jmpdisp
fun7:
movdl,'7'
jmpdisp
disp:
movah,2;显示一个字符
int21h
popbx
popax
jmprestart
done:
…
〔习题3.24〕
编写计算100个正整数之和的程序。
如果和不超过16位字的围(65535),则保存其和到wordsum,如超过则显示‘Overflow!
’。
〔解答〕
;数据段
countequ100
parraydwcountdup(?
);假设有100个数据
wordsumdw0
msgdb‘overflow’,’$’
;代码段
movcx,count
movax,0
movbx,offsetparray
again:
addax,[bx]
jncnext
movdx,offsetmsg
movah,9
int21h;显示溢出信息
jmpdone;然后,跳出循环体
next:
addbx,2
loopagain
movwordsum,ax
done:
…
〔习题3.25〕
编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。
转换算法可以是:
用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和“个位”。
〔解答〕
;wjxt325.asm
.modelsmall
.stack256
.data
arraydw?
;源字数据
dbcddb5dup(?
);五位bcd结果,高对高低对低
.code
.startup
movdx,array;取源数据(余数)
movbx,10000;除数
movcx,10;除数系数
movsi,4;目的数据高位位移量
again:
movax,dx;dx.ax中存放被除数
movdx,0
divbx;除于bx,商ax,余数dx
movdbcd[si],al;商<10,存结果
pushdx;暂存余数
movax,bx;除数除于10
movdx,0
divcx;dx.ax除于cx,商ax、余数0存在dx
movbx,ax;bx是除数
popdx
decsi;目的数据位移量减1
jnzagain
movdbcd,dl;存个位数(<10)
.exit0
end
〔习题3.27〕
编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。
请调用书中的HTOASC子程序。
〔解答〕
again:
movah,1
int21h
cmpal,1bh;ESC的ASCII码是1bh
jedone
callhtoasc
movah,2
int21h
jmpagain
done:
〔习题3.29〕
调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。
〔解答〕
DIPASCproc;入口参数:
AL=要显示的一个16进制数
pushcx
pushdx
pushax
movcl,4;转换高位
shral,cl
callHTOASC
movdl,al;显示
movah,2
int21h
popax;转换低位
callHTOASC
movdl,al;显示
movah,2
int21h
movdl,’H’;显示一个字母“H”
movah,2
int21h
popdx
popcx
ret
DIPASCendp
HTOASCproc;将AL低4位表达的一位16进制数转换为ASCII码
andal,0fh
cmpal,9
jbehtoasc1
addal,37h;是0AH~0FH,加37H转换为ASCII码
ret;子程序返回
htoasc1:
addal,30h;是0~9,加30H转换为ASCII码
ret;子程序返回
HTOASCendp
〔习题3.35〕
编制3个子程序把一个16位二进制数用4位16进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。
⑴采用AX寄存器传递这个16位二进制数
⑵采用temp变量传递这个16位二进制数
⑶采用堆栈方法传递这个16位二进制数
〔解答〕
⑴
.modelsmall
.stack
.data
wdatadw34abh
.code
.startup
movax,wdata
calldispa
.exit0
;
dispaproc
pushcx
pushdx
movcl,4
movdl,ah
shrdl,cl
calldldisp
movdl,ah
anddl,0fh
calldldisp
movdl,al
shrdl,cl
calldldisp
movdl,al
anddl,0fh
calldldisp
popdx
popcx
ret
dispaendp
;
dldispproc
pushax
ordl,30h
cmpdl,39h
jbedldisp1
adddl,7
dldisp1:
movah,2
int21h
popax
ret
dldispendp
end
⑵
.modelsmall
.stack
.data
wdatadw34abh
wordtempdw?
.code
.startup
movax,wdata
movwordtemp,ax
calldispa
.exit0
;
dispaproc
pushcx
pushdx
movcl,4
movdl,byteptrwordtemp+1
shrdl,cl
calldldisp
movdl,byteptrwordtemp+1
anddl,0fh
calldldisp
movdl,byteptrwordtemp
shrdl,cl
calldldisp
movdl,byteptrwordtemp
anddl,0fh
calldldisp
popdx
popcx
ret
dispaendp
;
dldispproc
pushax
ordl,30h
cmpdl,39h
jbedldisp1
adddl,7
dldisp1:
movah,2
int21h
popax
ret
dldispendp
end
⑶
.modelsmall
.stack
.data
wdatadw34abh
.code
.startup
pushwdata
calldispa
popax;addsp,2
.exit0
;
dispaproc
pushbp
movbp,sp
pushax
pushcx
pushdx
movax,[bp+4]
movcl,4
movdl,ah
shrdl,cl
calldldisp
movdl,ah
anddl,0fh
calldldisp
movdl,al
shrdl,cl
calldldisp
movdl,al
anddl,0fh
calldldisp
popdx
popcx
popax
popbp
ret
dispaendp
;
dldispproc
pushax
ordl,30h
cmpdl,39h
jbedldisp1
adddl,7
dldisp1:
movah,2
int21h
popax
ret
dldispendp
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言与接口技术 汇编语言 接口 技术 习题 解答 第三