16 32位微机原理第3章课后习题答案_第1页
16 32位微机原理第3章课后习题答案_第2页
16 32位微机原理第3章课后习题答案_第3页
16 32位微机原理第3章课后习题答案_第4页
16 32位微机原理第3章课后习题答案_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——1632位微机原理第3章课后习题答案>

第3章

3.1:

汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数,可以直接、有效地控制计算机硬件,因而简单创立代码序列短小、运行快速的可执行程序

3.2解:

(1)完整的汇编语言源程序由段组成

(2)一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列

(3)需独立运行的程序必需包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点

(4)所有的可执行性语句必需位于某一个代码段内,说明性语句可根据需要位于任一段内

(5)寻常,程序还需要一个堆栈段3.3解:存储模式TINYSMALLCOMPACTMEDIUMLARGEHUGEFLAT特点COM类型程序,只有一个小于64KB的规律段(MASM6.x支持)小应用程序,只有一个代码段和一个数据段(含堆栈段),每段不大于64KB代码少、数据多的程序,只有一个代码段,但有多个数据段代码多、数据少的程序,可有多个代码段,只有一个数据段大应用程序,可有多个代码段和多个数据段(静态数据小于64KB)更大应用程序,可有多个代码段和多个数据段(对静态数据没有限制)32位应用程序,运行在32位80x86CPU和Windows9x或NT环境3.4解:

开始位置:用标号指明

返回DOS:利用DOS功能调用的4CH子功能来实现汇编中止:执行到一条END伪指令时,中止汇编

3.5解:

段定位、段组合和段类型。

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

例题3.1:创立一个在屏幕上显示一段信息的程序??解:stacksegmentstackdb1024(0)stackends

41hdatasegment

stringdb'Hello,Assembly!',0dH,0aH,‘$’dataends

codesegment'code'

assumecs:code,ds:data,ss:stackstart:movdx,offsetstringmovah,9int21hcodeends

endstart

3.7DOS支持哪两种可执行程序结构,编写这两种程序时需要注意什么?解:

(1).EXE程序

程序可以有多个代码段和多个数据段,程序长度可以超过64KB寻常生成EXE结构的可执行程序(2).COM程序

只有一个规律段,程序长度不超过64KB

需要满足一定条件才能生成COM结构的可执行程序(MASM6.x需要采用TINY模式)

3.8举例说明等价“EUQ〞伪指令和等号“=〞伪指令的用途解:

符号定义伪指令有“等价EQU〞和“等号=〞:符号名EQU数值表达式符号名EQU符号名=数值表达式

EQU用于数值等价时不能重复定义符号名,但“=〞允许有重复赋值。例如:X=7;等效于:Xequ7X=X+5;“XEQUX+5〞是错误的

3.9解:

(1)al=67h

(2)ax=133h,dx=4h(3)ax=0230h(4)al=41h(4)ax=7654h

3.10解:(1)441145h46h-1?444-1?444-1?442300hhh(2)10h00h0fbh0ffh??????3.11解:.data

my1bdb'PersonalComputer'my2bdb20my3bdb14h

my4bdb00010100b

4my5wdw20dup(?)my6c=100

my7c=

3.12希望控制变量或程序代码在段中的偏移地址,应当使用哪个伪指令?解:

利用定位伪指令控制,如org,even,align

3.13名字和符号有什么属性?解:

包括规律地址和类型两种属性。

3.14解:;数据段

org100h

varwdw1234h,5678hvarbdb3,4varddd12345678hbuffdd10dup(?)messdb'Hello';代码段

movax,offsetvarb+offsetmess

movax,typebuff+typemess+typevardmovax,sizeofvarw+sizeofbuff+sizeofmessmovax,lengthofvarw+lengthofvard

3.15解:

(1)1000超过一个字节所能表达的最大整数(2)SI应为偶数

(3)两个内存单元不能直接运算(4)应改为[al+1]

(5)条件转移指令后面应接标号,而不是变量

3.16编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来

解:movah,1;只允许输入小写字母int21hsubal,20h;转换为大写字母movdl,almovah,2int21h;显示

3.17解:movbx,offsetLEDtablemoval,lednumxlat3.18解:

done:3.19解:bufXsignX

next:done:3.20解:

next1:

next2:

3.21解:

restart:

again:

next:

movax,bufXcmpax,bufYjaedonemovax,bufYmovbufZ,ax

.modelsmall.stack.datadw-7db?.code.startupcmpbufX,0jlnextmovsignX,0jmpdonemovsignX,-1.exit0end

movdl,’2’movax,bufXcmpax,bufYjenext1decdl

cmpax,bufZjenext2decdlmovah,2int21h

;代码段

moval,numbermovbx,0cmpal,0jzdoneshral,1jcnextincbxjmpagainpushaxpushbxshlbx,1

jmpaddrs[bx]

;jnznext

←记录为1的位数=0终止最低位右移进入CF为1,转移不为1,继续

位数乘以2(偏移地址要用2个字节单元)间接转移:IP←[table+BX]

;testbufX,80h;BX;AL;;;;;;以下是各个处理程序段fun0:movdl,'0'jmpdispfun1:movdl,'1'jmpdispfun2:movdl,'2'jmpdispfun3:movdl,'3'jmpdispfun4:movdl,'4'jmpdispfun5:movdl,'5'jmpdispfun6:movdl,'6'jmpdispfun7:movdl,'7'jmpdisp;disp:movah,2;显示一个字符int21hpopbxpopaxjmprestartdone:?3.22

;wjxt322.asm.modelsmall.stack.datab_datadb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始数据numequ10;数据个数sumdb?;预留结果单元.code.startupxorsi,si;位移量清零xoral,al;取第一个数movcx,num;累加次数again:addal,b_data[si];累加incsi;指向下一个数loopagain;如未完,继续累加movsum,al;完了,存结果.exit0end

3.23求主存0040h:0开始的一个64KB物理段中共有多少个空格?

;wjxt323.asm.modelsmall.codestart:movax,0040h;送段地址

movds,axmovsi,0;偏移地址movcx,si;计数(循环次数)xorax,ax;空格计数器清零again:cmpbyteptr[si],20h;与空格的ASCII码比较jnenext;不是空格,转incax;是空格,空格数加1next:incsi;修改地址指针loopagain;cx=cx-1,如cx=0退出循环.exit0endstart

3.24编写计算100个16位正整数之和的程序。假使和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。答:;数据段countequ100parraydwcountdup(?);假设有100个数据wordsumdw0msgdb‘overflow’,’$’;代码段movcx,countmovax,0movbx,offsetparrayagain:addax,[bx]jncnextmovdx,offsetmsgmovah,9int21h;显示溢出信息jmpdone;然后,跳出循环体next:addbx,2loopagainmovwordsum,axdone:?

3.25编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位〞,再用余数除以1000,得到“千位〞;依次用余数除以l00、10和l,得到“百位〞、“十位〞和“个位〞。;wjxt325.asm.modelsmall.stack256.dataarraydw?;源字数据dbcddb5dup(?);五位bcd结果,高对高低对低.code.startupmovdx,array;取源数据(余数)movbx,10000;除数movcx,10;除数系数

movsi,4;目的数据高位位移量again:movax,dx;dx.ax中存放被除数movdx,0divbx;除于bx,商ax,余数dxmovdbcd[si],al;商<10,存结果pushdx;暂存余数movax,bx;除数除于10movdx,0divcx;dx.ax除于cx,商ax、余数0存在dxmovbx,ax;bx是除数popdxdecsi;目的数据位移量减1jnzagainmovdbcd,dl;存个位数(3.34解:

arraycountresult

checksumsum:

checksum3.35解:⑴

wdata

dispa

;数据段

db12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h;数组equ$-array;数组元素个数db?;校验和;代码段

movbx,offsetarray;BX←数组的偏移地址movcx,count;CX←数组的元素个数callchecksum;调用求和过程movresult,al;处理出口参数movax,4c00hint21h

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

;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和

;说明:除AX/BX/CX外,不影响其他寄放器proc

xoral,al;累加器清0addal,[bx];求和incbx;指向下一个字节loopsumretendpend

.modelsmall.stack.datadw34abh.code.startupmovax,wdatacalldispa.exit0;procpushcxpushdxmovcl,4movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,alshrdl,cl

dispa

dldisp

dldisp1:

dldisp⑵

wdatawordtemp

dispa

calldldispmovdl,alanddl,0fhcalldldisppopdxpopcxretendp;procpushaxordl,30hcmpdl,39hjbedldisp1adddl,7movah,2int21hpopaxretendpend

.modelsmall.stack.datadw34abhdw?.code.startupmovax,wdatamovwordtemp,axcalldispa.exit0;procpushcxpushdxmovcl,4

movdl,byteptrwordtemp+1shrdl,clcalldldisp

movdl,byteptrwordtemp+1anddl,0fhcalldldisp

movdl,byteptrwordtempshrdl,clcalldldisp

movdl,byteptrwordtempanddl,0fhcalldldisppopdx

dispa

dldisp

dldisp1:

dldisp⑶

wdata

dispa

popcxretendp;procpushaxordl,30hcmpdl,39hjbedldisp1adddl,7movah,2int21hpopaxretendpend

.modelsmall.stack.datadw34abh.code.startuppushwdatacalldispapopax.exit0;procpushbpmovbp,sppushaxpushcxpushdx

movax,[bp+4]movcl,4movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,alshrdl,clcalldldispmovdl,alanddl,0fhcalldldisppopdxpopcxpopax

;addsp,2

popbpretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:movah,2int21hpopaxretdldispendpend3.36解:

假使利用共享变量传递函数,且变量定义和使用不在同一个源程序中,需要利用PUBLIC、EXTERN声明。

3.37宏是如何定义、调用和展开的?解:

(1)宏定义由一对宏汇编伪指令MACRO和ENDM来完成,格式如下:宏名MACRO[形参表]??;宏定义体ENDM宏定义之后就可以使用它,即宏调用:宏名[实参表]

(2)宏调用的格式同一般指令一样:在使用宏指令的位置写下宏名,后跟实体参数;假使有多个参数,应按形参顺序填入实参,也用逗号分隔

(3)宏展开:在汇编时,宏指令被汇编程序用对应的代码序列替代,这就是宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体完全替代源程序的宏指令,同时用位置匹配的实参对形参进行取代3.38解:

宏调用的参数通过形参、实参结合实现传递,简捷直观、灵活多变。宏汇编的一大特色是它的参数。宏定义时既可以无参数,也可以有一个或多个参数;宏调用时实参的形式也十

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论