第3章 部分习题参考答案.docx
- 文档编号:2896910
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:41
- 大小:121.07KB
第3章 部分习题参考答案.docx
《第3章 部分习题参考答案.docx》由会员分享,可在线阅读,更多相关《第3章 部分习题参考答案.docx(41页珍藏版)》请在冰点文库上搜索。
第3章部分习题参考答案
第3章课后习题参考答案
3-1写出执行下列程序段的中间结果和结果
(1)MOVAX,0809H
MULAH;AX=AL*AH=48H
AAM;AX=0702H
(2)题目略
●AX=0059H
(BCD除之前,先用AAD是将BCD数先转换为二进制<十六进制>数,非压缩BCD码0809H表示的数值89,转换为十六进制数为59H)
●DIVDL;AX=0411H;商89/5=17=11H保存在AL,余数=4保存在AH,故AX=411H
MOVDL,AH;余数送DL,DL=04H
●AAM;乘法调整,将AL中的二进制转换为非压缩BCD码AX,AX=0107H,;
;最后AX=0107和,DL=04H
(3)AX=0011H,AX=0107H
(4)AX=005AH(MULAH;AL=09,AH=10=0Ah,9*0AH=5AH),
AX=0900H(调整后变为BCD数,5AH=90),
AX=0908H(xchgAH,DL将AH中的08H交换到DL,执行ADDAL,DL,AL=00+08=08H,故AX=0908H)
(5)AL=62H
(6)AX=0248H(该程序段:
将AX先初始化为0,然后将CL的最高位移到进位位C,利用字节加法分两次进行AX*2+C,并进行压缩的BCD加法调整,分析代码可知该段代码是将CL中的二进制数转换为BCD码并保存在AX中。
程序代码MOVCL,248经汇编,CL中存放的是十进制数248对应的二进制数CL=11111000B,因此程序执行完毕,AX=0248H)
3-2题目略
一个压缩的BCD数,0~99.转换方法:
十位*10+个位。
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
BVARDB99H
dataends
codesegment
assumess:
stack,cs:
code,ds:
data
BEGIN:
MOVAX,DATA;将数据段首地址送AX
MOVDS,AX;将数据段首地址送DS
MOVAL,BVAR;取出待转换BCD数
MOVCL,4
SHRAL,CL;右移4位,得到BCD数的十位(右移时,高四位补0)
MOVAH,10;
MULAH;十位数*10
ANDBVAR,0FH;BCD数高四位清0,得到个位数
ADDBVAR,AL;加个位数,得到转换结果,直接存放到BVAR存储单元
MOVAH,4CH;返回操作系统的功能编号
INT21H;执行操作系统功能调用,当AH=4cH时,返回操作系统
CODEENDS
END
3-3题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
W1DW0807H
W2DW0609H
B3DB2DUP(0)
dataends
codesegment
assumess:
stack,cs:
code,ds:
data
START:
MOVAX,DATA
MOVDS,AX
MOVAX,W1;AX=0807H
SUBAL,BYTEPTRW2;AL=FEH,CF=1
AAS;AL=08H,AH=07H
MOVB3,AL
MOVAL,AH
SUBAL,W2+1
MOVB3+1,AL
MOVAH,4CH
INT21H
CODEENDS
END
3-4题目略
使用另一种返回操作系统的方法:
在对汇编源程序进行汇编/链接生成可执行的.EXE程序时,操作系统自动在数据段最开始DS:
0000H处放置一条返回操作系统的指令,因此,只要将DS和0000压入堆栈,并将程序编写为远过程(远调用的子程序),然后在执行完程序规定的功能后,在程序的最后用一条RET指令,RET自动将DS弹出送到CS,将0000弹出送到IP,就会转到数据段开始执行返回操作系统的指令,使程序能够返回操作系统。
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
D1DD06070809H
D2DD04050607H
OBFDB6DUP(0)
dataends
codesegment
beginprocfar;远过程,返回时,从堆栈弹出四字节送CS:
IP
assumess:
stack,cs:
code,ds:
data
PUSHDS;压栈DS
SUBAX,AX;ax=0
PUSHAX;0000压入堆栈
MOVAX,DATA
MOVDS,AX;数据段段基址DS
MOVSI,0
MOVDI,OFFSETOBF+5
MOVBYTEPTR[DI],$
MOVCX,4
XORAH,AH
AGAIN:
MOVAL,BYTEPTRD1[SI]
ADDAL,BYTEPTRD2[SI]
ADDAL,AH
MOVAH,0
AAA
ADDAL,30H
DECDI
MOV[DI],AL
INCSI
LOOPAGAIN
ANDAH,AH
JZN5
DECDI
MOVBYTEPTR[DI],1
N5:
MOVDX,DI
MOVAH,9
INT21H
ret
beginendp
codeends
endbegin
3-5题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
W1DW8931H
W2DW5678H
OBFDB6DUP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
MOVDI,0
MOVAL,BYTEPTRW1;AL=31H
ADDAL,BYTEPTRW2;AL=A9H,CF=0,AF=0
DAA;AL=09H,CF=1
MOVAH,AL
MOVAL,BYTEPTRW1+1;AL=89H
ADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1
DAA;AL=46H,CF=1
PUSHF
MOVDIOFFSETOBF+5
MOVBYTEPTR[DI],$
MOVCL,4
XCHGAH,AL
AGAIN:
MOVDL,0FH
ANDDL,AL
ADDDL,30H
DECDI
MOV[DI],DL
SHRAX,CL
ANDAX,AX
JNZAGAIN
POPF
JNCOUTPUT
DECDI
MOVBYTEPTR[DI],1
OUTPUT:
MOVDX,DI
MOVAH,9
INT21H
beginendp
codeends
endbegin
3-6题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
BVARDB99H
OBUFDB4DUP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
MOVAL,BVAR;二进制数送AL
MOVAH,0;二进制数扩展为16位(无符号数扩展)
MOVDL,100
DIVDL
ADDAL,30H;将百位变为ASCII码
MOVOBUF,AL;存百位
MOVAL,AH;将十位和个位的二进制数即余数送AL
AAM;将AL中的二进制数转换为ASCIIBCD数
ADDAX,3030H;将AX中的ASCIIBCD数变为ASCII码
MOVOBUF+1,AH
MOVOBUF+2,AL
MOVOBUF+3,$
MOVDX,OFFSETOBUF
MOVAH,9
INT21H
ret
beginendp
codeends
endbegin
*****************************************************************************
将8位二进制数转换为十进制数也可以用除10取余法实现。
转换程序段如下:
MOVAL,BVAR
XORAH,AH;将8位二进制数扩展为16位(无符号数扩展)
MOVDL,10
DIVDL
ADDAH,30H;将第一个余数即个位变为ASCII码
MOVOBUF+2,AH
XORAH,AH;将AL中的二进制数扩展为16位
DIVDL
ADDAX,3030H;AH为十位,AL为百位
MOVWORDPTROBUF,AX
MOVOBUF+3,$
还可以用左移二进制数的方法将二进制数转换为十进制数:
XORAX,AX;清0AX
MOVCX,8;左移二进制数8次
AGAIN:
SHLBVAR,1
ADCAL,AL
DAA
ADCAH,0;AH的值小于等于2不需校正
LOOPAGAIN
ADDAH,30H;百位转换为ASCII码
MOVOBUF,AH
MOVAH,AL;保存十位和个位
MOVCL,4
SHRAL,CL;BCD数十位移至AL低4位
ANDAH,OFH;BCD数个位在AH低4位
ADDAX,3030H;个位和十位转换为ASCII码
MOVWORDPTROBUF+1,AX
MOVOBUF+3,$
以二进制数11111101B转换为BCD数0253H为例,说明转换的过程,全过程如下图所示。
3-7题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
TABDW0
DB0$
DW1
DB1$
DW8
DB8$
┇
DW64000
DB64000$
LFZDW0
IBUFDB3,0,3DUBP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
MOVDX,OFFSETIBUF
MOVAH,10
INT21H
MOVAH,2
MOVDL,0AH
INT21H
MOVAX,WORDPTRIBUF+2;个位送AH,十位送AL
XCHGAH,AL;个位与十位交换
CMPIBUF+1,2;判别N是一位数还是二位数
JECOM
MOVAL,AH
XORAH,AH;;若N为一位数,则要清AH
COM:
ANDAX,0F0FH;将AX中的ASCII码变为ASCIIBCD数
AAD;将AX中的ASCIIBCD数变为二进制数
MOVCL,3
SHLAX,CL;将AX中的二进制数乘以8
MOVBX,AX
MOVAX,TAB[BX]
MOVLFZ,AX
MOVDX,OFFSETTAB+2;DX指向立方值的ASCII码
ADDDX,BX;将DX下移8N,指向N的ASCII码
MOVAH,9
INT21H
ret
beginendp
codeends
endbegin
3-8题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
WADW0ABCDH
BADB0
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
MOVAH,1;1号功能调用,键入i(i=0~3)
INT21H
MOVDX,WA
TESTAL,1;判别键入数i是奇数还是偶数,D0位为0则为偶数
JZNRS
MOVCL,4;i为奇数将a3、a1移至各自字节的低4位
SHRDX,CL
NRS:
TESTAL,2;判别键入数i的D1位是0还是1?
JZHNSL
MOVDL,DH;i的D1位为1则是取a3或a2,将其送DL
HNSL:
ANDDL,0FH;取低4位
MOVBA,DL
ret
beginendp
codeends
endbegin
*******************************
本题还可以将键入值乘以4得到将ai移到WA的低4位的移位次数,对WA执行移位操作即可将ai移到WA的低4位。
取WA的低4位送入BA中。
即将分支程序设计成较简单的顺序程序。
用此方法的编制的程序段如下:
MOVAH,1
INT21H
MOVCL,AL;将键入数(ASCII码)送移位次数寄存器CL
ANDCL,0FH;将移位次数的ASCII码变为二进制数
SHLCL,1;将键入i值乘以4
SHLCL,1
MOVAX,WA
SHRAX,CL;右移4i次,将ai移到最低4位
ANDAL,0FH;取ai
MOVBA,AL
3-9题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
W2DD8920B094H
dataends
codesegment
startprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
TESTWORDPTRW2+2,8000H;检测原码数的符号
JZBAK;正数的原码与补码相同不用再求
ANDWORDPTRW2+2,7FFFH;求负数的绝对值
NOTWORDPTRW2+2;双字求补
NOTWORDPTRW2
ADDWORDPTRW2,1
ADCWORTPTRW2+2,0
BAK:
ret
startendp
codeends
endstart
3-10题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
XDW8100H
YDW9420H
KDB0
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
ANDX,0FFFFH;根据X是否为0置ZF
JZK0
ANDY,0FFFFH;根据Y是否为0置ZF
JZK0
TESTX,8000H;测试X的符号
JZK14;X>0去K14
TESTY,8000H;X<0测试Y的符号
JZK2;Y>0去K2
MOVK,3
RET
K2:
MOVK,2
RET
K0:
MOVK,0
RET
K14:
TESTY,8000H;X>0测试Y的符号
JZK1;Y>0去K1
MOVK,4
RET
K1:
MOVK,1
ret
beginendp
codeends
endbegin
先赋值再作判别可以减少分支。
第一次判X、Y是否为0,为0落在数轴上K=0;不为0作第二次和第三次判别。
第二次判X、Y是否异号,异号落在2、4象限K=2,同号落在1、3象限K=1,再作第三次判别,判Y是正数还是负数,Y>0,则落在1、2象限;若Y<0,则落在3、4象限,将K加上2。
根据该方法编写的程序段如下:
MOVK,0
ANDX,0FFFFH
JZBACK;X=0去BACK
ANDY,0FFFFH
JZBACK;Y=0去BACK
MOVK,2
MOVAX,X
XORAX,Y
JSK24;XY异号,落在2,4象限
MOVK,1;XY同号,K=1,落在1,3象限
K24:
CMPY,0
JNSBACK;Y>0,落在1、2象限
ADDK,2;Y<0,落在3、4象限K+2
BACKret
3-11题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
IBUFDB9,0,9DUP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
movax,0
pushax
movax,data
movds,ax
MOVDX,OFFSETIBUF
MOVAH,10
INT21H
MOVCX,
MOVSI,2
AG:
SHRIBUF[SI],1
RCLDH,1
INCSI
LOOPAG
MOVDL,DH
MOVCL,4
SHRDL,CL
CMPDL,39H
JBENAD71
ADDDL,7
NAD71:
MOVAH,2
INT21H
MOVDL,DH
ANDDL,0FH
CMPDL,39H
JBENAD72
ADDDL,7
NAD72:
MOVAH,2
INT21H
ret
beginendp
codeends
endbegi
3-12题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
IBUFDB5,0,5DUP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
movax,0
pushax
movax,data
movds,ax
MOVDX,OFFSETIBUF
MOVAH,10
INT21H
MOVCL,IBUF+1
MOVCH,0
MOVSI,OFFSETIBUF+2;指向键入的第一个字符
CMPBYTEPTR[SI],;判是否为负数
PUSHF;保护零标志,供转换之后再判别
JNESININC;正数跳转,去SININC
INCSI;越过“”号指向数字
DECCX;实际字符数少1(“”号)
SININC:
MOVAL,0;开始将十进制数转换为二进制数
AGAIN:
MOVAH,10;((0×10+a4)×10+…)×10+a0
MULAH
ANDBYTEPTR[SI],0FH;将十进制数的ASCII码转换为BCD数
ADDAL,[SI]
INCSI
LOOPAGAIN
POPF;恢复判断是否为负数时的零标志ZF
JNZNNEG;非0即为正数,则不求补
NEGAL
MOVDL,AL
MOVDH,AL
MOVCL,4
SHRDL,CL
CMPDL,39H
JBENAD71
ADDDL,7
NAD71:
MOVAH,2
INT21H
MOVDL,DH
ANDDL,0FH
CMPDL,39H
JBENAD72
ADDDL,7
NAD72:
MOVAH,2
INT21H
ret
beginendp
codeends
endbegi
3-13题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
SWDW1234H
OBUFDB5DUP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
movax,0
pushax
movax,data
movds,ax
MOVBX,5
MOVOBUF[BX],$
MOVCX,10
MOVAX,SW
AG:
MOVDX,0
ANDAX,AX
JZSC
DIVCX
ADDDL,30H
DECBX
MOVOBUF[BX],DL;ASCII码送输出数据区
JMPAG
SC:
MOVDX,OFFSETOBUF
ADDDX,BX
MOVAH,9
INT21H
ret
beginendp
codeends
endbegin
3-14题目略
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
ARRAYWDW56,56,80,80,128,128,0,512,……
NEQU($ARRAYW)/2
PLUSDWNDUP(0)
MINUSDWNDUP(0)
ZERONDW0
dataends
codesegment
startprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushxa
movax,data
movds,a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 部分习题参考答案 部分 习题 参考答案
![提示](https://static.bingdoc.com/images/bang_tan.gif)