汇编语言与接口技术答案习题解答.docx

上传人:b****0 文档编号:9755621 上传时间:2023-05-21 格式:DOCX 页数:21 大小:59.10KB
下载 相关 举报
汇编语言与接口技术答案习题解答.docx_第1页
第1页 / 共21页
汇编语言与接口技术答案习题解答.docx_第2页
第2页 / 共21页
汇编语言与接口技术答案习题解答.docx_第3页
第3页 / 共21页
汇编语言与接口技术答案习题解答.docx_第4页
第4页 / 共21页
汇编语言与接口技术答案习题解答.docx_第5页
第5页 / 共21页
汇编语言与接口技术答案习题解答.docx_第6页
第6页 / 共21页
汇编语言与接口技术答案习题解答.docx_第7页
第7页 / 共21页
汇编语言与接口技术答案习题解答.docx_第8页
第8页 / 共21页
汇编语言与接口技术答案习题解答.docx_第9页
第9页 / 共21页
汇编语言与接口技术答案习题解答.docx_第10页
第10页 / 共21页
汇编语言与接口技术答案习题解答.docx_第11页
第11页 / 共21页
汇编语言与接口技术答案习题解答.docx_第12页
第12页 / 共21页
汇编语言与接口技术答案习题解答.docx_第13页
第13页 / 共21页
汇编语言与接口技术答案习题解答.docx_第14页
第14页 / 共21页
汇编语言与接口技术答案习题解答.docx_第15页
第15页 / 共21页
汇编语言与接口技术答案习题解答.docx_第16页
第16页 / 共21页
汇编语言与接口技术答案习题解答.docx_第17页
第17页 / 共21页
汇编语言与接口技术答案习题解答.docx_第18页
第18页 / 共21页
汇编语言与接口技术答案习题解答.docx_第19页
第19页 / 共21页
汇编语言与接口技术答案习题解答.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编语言与接口技术答案习题解答.docx

《汇编语言与接口技术答案习题解答.docx》由会员分享,可在线阅读,更多相关《汇编语言与接口技术答案习题解答.docx(21页珍藏版)》请在冰点文库上搜索。

汇编语言与接口技术答案习题解答.docx

汇编语言与接口技术答案习题解答

解:

movah,1;只允许输入小写字母

int21h

subal,20h;转换为大写字母

movdl,al

movah,2

int21h;显示

解:

movax,bufX

cmpax,bufY

jgedone

movax,bufY

done:

movbufZ,ax

解:

.modelsmall

.stack

.data

bufXdw-7

signXdb

.code

.startup

cmpbufX,0;testbufX,80h

jlnext;jnznext

movsignX,0

jmpdone

next:

movsignX,-1

done:

.exit0

end

解:

movdl,’2’

movax,bufX

cmpax,bufY

jenext1

decdl

next1:

cmpax,bufZ

jenext2

decdl

next2:

movah,2

int21h

编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。

.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

解:

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

习题解答:

参考教材(第60页)

习题

问题:

给出你采用一个源程序格式书写的例题源程序

解答:

.modelsmall

.stack

.data

stringdb’Hello,Assembly!

’,0dh,0ah,’$’

.code

start:

movax,@data

movds,ax

movdx,offsetstring

movah,9

int21h

movax,4c00h

int21h

endstart

习题解答:

ORG伪指令

习题解答:

段地址和偏移地址属性,类型属性

习题

问题:

过程定义的一般格式是怎样的子程序开始为什么常有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=和的高字

(进位部分)

习题

问题:

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

;子程序功能:

把用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

习题-1

问题:

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

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

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

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

传递参数方法自定。

解答:

;数据段

arraydb12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h

countequ$-array;数组元素个数

resultdb;校验和

;代码段(主程序)

movbx,offsetarray;BX←数组的偏移地址

movcx,count;CX←数组的元素个数

callchecksum;调用求和过程

movresult,al;处理出口参数

习题-2

;代码段(子程序)

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

;入口参数:

DS:

BX=数组的段地址:

偏移地址

CX=元素个数

;出口参数:

AL=校验和

;说明:

除AX/BX/CX外,不影响其他寄存器

checksumproc

xoral,al;累加器清0

sum:

addal,[bx];求和

incbx;指向下一个字节

loopsum

ret

checksumendp

〔习题〕

已知用于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显示代码

〔习题〕

例题中,如果要实现所有为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:

〔习题〕

编写计算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:

〔习题〕

编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。

转换算法可以是:

用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和“个位”。

〔解答〕

;

.modelsmall

.stack256

.data

arraydw;源字数据

dbcddb5dup();五位bcd结果,高对高低对低

.code

.startup

movdx,array;取源数据(余数)

movbx,10000;除数

movcx,10;除数系数

movsi,4;目的数据高位位移量

again:

movax,dx;中存放被除数

movdx,0

divbx;除于bx,商ax,余数dx

movdbcd[si],al;商<10,存结果

pushdx;暂存余数

movax,bx;除数除于10

movdx,0

divcx;除于cx,商ax、余数0存在dx

movbx,ax;bx是除数

popdx

decsi;目的数据位移量减1

jnzagain

movdbcd,dl;存个位数(<10)

.exit0

end

〔习题〕

编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。

请调用书中的HTOASC子程序。

〔解答〕

again:

movah,1

int21h

cmpal,1bh;ESC的ASCII码是1bh

jedone

callhtoasc

movah,2

int21h

jmpagain

done:

〔习题〕

调用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个子程序把一个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

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2