汇编语言CH3练习参考答案.docx
《汇编语言CH3练习参考答案.docx》由会员分享,可在线阅读,更多相关《汇编语言CH3练习参考答案.docx(30页珍藏版)》请在冰点文库上搜索。
![汇编语言CH3练习参考答案.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/3c28b19b-f177-443a-8af4-fa1964f32c92/3c28b19b-f177-443a-8af4-fa1964f32c921.gif)
汇编语言CH3练习参考答案
汇编语言程序设计练习参考答案
(第三章80x86的指令系统与寻址方式)
1.
(1)立即寻址-
(2)直接寻址7237H
(3)使用BX的寄存器寻址-
(4)使用BX的间接寻址637DH
(5)使用BX的寄存器相对寻址0D5B4H
(6)基址变址寻址8E18H
(7)相对基址变址004FH
2.
(1)ADDDX,BX
(2)ADDAL,[BX][SI]
(3)ADD[BX+0B2H],CX
(4)ADDWORDPTR[0524H],2A59H
(5)ADDAL,0B5H
3.
(1)MOVBX,OFFSETBLOCK+0AH
MOVDX,[BX]
(2)MOVSI,OAH
MOVDX,BLOCK[SI]或MOVDX,SI+BLOCK
(3)MOVBX,OFFSETBLOCK或LEABX,BLOCK
MOVSI,OAH
MOVDX,[BX][SI]
4.
(1)MOVAX,1200H1200H=>AX=1200H
(2)MOVAX,BXBX=0100H=>AX=0100H
(3)MOVAX,[1200H]((ds)*10h+1200h)=(21200h)=4C2AH=>AX=4C2AH
(4)MOVAX,[BX]((ds)*10h+(bx))=(20199H)=3412H=>AX=3412H
(5)MOV1100H[BX]((ds)*10h+(bx)+1100h)=(21200H)=4C2AH=>AX=4C2AH
(6)MOVAX,[BX][SI]((ds)*10h+(si)+(bx))=(20102H)=7856H=>AX=7856H
(7)MOVAX,1100H[BX][SI]((ds)*10h+(si)+(bx)+1100h)=(21202hH)=65B7H=>AX=65B7H
注:
原题(5)和题(7)中的1100后面漏了十六进制说明符“H”
5.
(1)当前指令的IP为2BC0H,段内直接转移指令占3个字节,因此下一条指令的地址(IP)值应该为2BC2H,于是转移的偏移地址为:
2BC2H+5119H=7CDCH
(2)按题意,该指令为JMPWORDPTR[BX]
((DS)*10H+(BX))=(212A*10H+1200H)=(224A0H)=0600H,所以转移的偏移地址为0600H
(3)按题意,该指令为JMPWORDPTRD[BX]
((DS)*10H+(BX)+D)=(212A*10H+1200H+5119H)=(275B9H)=098AH,所以转移的偏移地址为098AH
6.
LDSBX,[2000H]
MOVAX,[BX]
图示如图3.1
注:
为了只改变AX,不影响其它寄存器,本题可以做如下完善处理:
PUSHDS
PUSHBX
LDSBX,[2000H]
MOVAX,[BX]
POPBX
POPDS
段值(DS):
段内偏移->物理地址
1B00H:
0000H->1B000H
┇
1B00H:
2000H->1D000H
10
LDSBX,[2000H]
FF
=>BX=0FF10H
00
=>DS=8000H
80
┇
8000H:
0FF10H->8FF10H
MOVAX,[BX]
AX
图3.1
7.JMPSHORTOBJ指令占两个字节,存放在偏移地址为0624H的连续两单元中,因此这条指令执行完后下一条指令的偏移地址(即IP值)为0626H,因此转向地址OBJ的值分别为:
(1)0626H+0027H=064DH
(2)0626H+006BH=0691H
(3)0626H+0FFC6=05ECH
8.指令源操作数的寻址方式物理地址
(1)MOVAX,0ABH立即数寻址-
(2)MOVAX,BX寄存器寻址-
(3)MOVAX,[100H]存储器直接寻址(ds)*10H+0100H=20100H
(4)MOVAX,VAL存储器直接寻址(ds)*10H+0050H=20050H
(5)MOVAX,[BX]寄存器间接寻址(ds)*10H+(bx)=20100H
(6)MOVAX,ES:
[BX]存储器直接寻址(es)*10H+(bx)=21100H
(7)MOVAX,[BP]寄存器间接寻址(ss)*10H+(bp)=15010H
(8)MOVAX,[SI]寄存器间接寻址(ds)*10H+(si)=200A0H
(9)MOVAX,[BX+10]寄存器相对寻址(ds)*10H+(bx)+10=2010AH
(10)MOVAX,VAL[BX]寄存器相对寻址(ds)*10H+(bx)+0050H=20150H
(11)MOVAX,[BX][SI]基址变址寻址(ds)*10H+(bx)+(si)=201A0H
(12)MOVAX,VAL[BX][SI]相对基相变址寻址(ds)*10H+(bx)+(si)+0050H=201F0H
9.
(1)MOVAX,[BX+0CH]
MOVZREO,AX
(2)MOVAX,ARRAY[BX]
MOVZREO,AX
10.
MOVAX,TABLE把符号地址TABLE所给出的字存储单元中的内容送给AX,指令执行完后,(AX)=1234H
LEAAX,TABLE把符号地址TABLE的有效地址(这里是TABLE的偏移量)送给指定寄存器AX,指
令执行完后,(AX)=0032H
11.
分配的存储单元如图3.2所示。
指令执行完后,(AX)=1E00H
TABLE->
0A
<-BX(MOVBX,OFFSETTABLE)
00
14
00
<-BX(ADDBX,ENTRY)
1E
AX=1E00H(MOVAX,[BX])
00
28
00
32
ENTRY->
03
00
图3.2
12.
MOVBX,OFFSETCSTRING或LEABX,CSTRING
MOVDL,[BX]
MOVDH,[BX+6]
13.
开始第一次PUSH操作第二次PUSH操作POP操作
图3.3
14.
LESBX,[2000H]
MOVAX,ES:
[BX]
15.
运算结果SF,ZF,CF,OF
(1)74D4H0000
(2)A5C1H1001
(3)4240H0010
(4)0000H0110
16.
运算结果SF,ZF,CF,OF
(1)C7541010
(2)12B00000
(3)45B00001
(4)9F241000
17.
(1).
MOVAX,Z;把Z送AX
SUBAX,X;Z-X
ADDAX,W;W+(Z-X)
MOVZ,AX;结果保存在Z中
(2).
MOVAX,X;X送AX
ADDAX,6;X+6
NEGAX;-(X+6)
ADDAX,W;W-(X+6)
SUBAX,R;W-(X+6)-R
SUBAX,9;W-(X+6)-R-9=W–(X+6)–(R+9)
MOVZ,AX;最终结果送Z中
(3)
MOVAX,W;把W送到AX
IMULX;W*X,积的低十六位在AX中,高十六位在DX中
MOVBX,Y;把Y送BX
ADDBX,6;Y+6
IDIVBX;(W*X)/(Y+6),商在AX中,余数在DX中
MOVZ,AX;商送Z,
MOVR,DX;余数送R
(4)
本题运算结果可能超出字数据Z范围,而运算还将产生余数,题意不够明确。
考虑舍去除法过程中的余数部分,并将Z单元向后扩展形成双字数据,参考代码如下:
MOVAX,W;把W送到AX中
SUBAX,X;W-X
MOVBL,5
IDIVBL;(W-X)/5,商在AL中,余数在AH中
MOVBL,2
IMULBL;2*(W-X)/5,积在AX中(将舍去前面除法得到的余数)
IMULY;(2*(W-X)/5)*Y = (((W-X)/5*Y)*2,积的高16位在DX中,低
;16位在AX中
MOVZ,AX;把结果中低32位放入Z双字单元中
MOVZ+2,DX;把结果中高32位放入Z+4双字单元中
18.
指令本条指令执行完后AX的内容执行完后CF,SF,ZF的值
MOVAX,1234H1234H?
?
?
MOVCL,41234H?
?
?
ROLAX,CL2341H100
DECAX2340H100
MOVCX,42340H100
MULCX8D00H000
INT20H
程序结束后,(AX)=8D00H(DX)=0000H
19.
指令执行完后AX的内容执行完后CF,SF,ZF和OF的值
MOVAX,00?
?
?
?
;MOV指令不影响标志位
DECAXFFFFH?
100;DEC/INC指令不影响CF标志
ADDAX,7FFFH7FFEH1000
ADDAX,28000H0101
NOTAX7FFFH0101;NOT指令不影响标志位
SUBAX,0FFFFH8000H1101
ADDAX,8000H0000H1011
SUBAX,1FFFFH1100
ANDAX,58D1H58D1H0000;AND指令将CF和OF清零
SALAX,1B1A2H0101
SARAX,1D8D1H0100
NEGAX272FH1000
RORAX,19397H1001;循环移位指令只影响CF和OF
20.
(1)MOVAX,DATAX
ADDDATAY,AX
(2)MOVAX,DATAX
ADDDATAY,AX
MOVAX,DATAX+2
ADDDATAY+2,AX
(3)本组指令的作用是:
将和DATAX+DATAY]+1=0480H给了BX
(4)MOVAX,DATAX
MULDATAY;结果在DX:
AX中
(5)使用32位寄存器的80x86指令:
MOVAX,DATAX
MOVDX,[DATAX+2]
MULDWORDPTRDATAY;结果在EDX:
EAX中
仅使用8086指令:
MOVAX,X
MULY+2
MOVCX,DX
MOVBX,AX
MOVAX,X+2
MULY
ADDBX,AX
ADCCX,DX
PUSHF
MOVAX,X+2
MULY+2
ADDCX,AX
ADCDX,0
POPF
ADCDX,0
PUSHDX
MOVAX,X
MULY
ADDBX,DX
ADCCX,0
POPDX
ADCDX,0;结果DX:
CX:
BX:
AX四寄存器组成的64位二进制保存了乘积
(6)MOVAX,DATAX
MOVBL,23
DIVBL;商在AL中,余数在AH中
(7)MOVAX,DATAX
MOVDX,DATAX+2
DIVDATAY;商在AX中,余数在DX中
21.NEGDX
NEGAX
SBBDX,0
或
NOTDX
NOTAX
ADDAX,1
ADCDX,0
22.
MOVAX,A;把双字长数的低字送AX
MOVDX,A+2;把双字长数的高字送DX
TESTDX,8000H;测试双字长数的符号位
JZRIGHT;符号位为0,说明是非负数,转DONE直接保存结果
NEGDX;对负数,进行求补(方法同上题)
NEGAX
SBBDX,0
DONE:
MOVBX,AX
MOVB+2,DX
23.
每条指令单独执行后的结果分别是:
(1)009AH
(2)0061H(3)00FBH(4)0001CH(5)0000H(6)00E3H
24.
(BX)=6D16H=0110110100010110B=>00000000110110100010110B=0000000011011010B=0DAH
25.
乘2采用算术左移(或逻辑左移)指令、除2使用算术右移指令
(1)把53D乘以2:
MOVAL,53
SHLAL,1或SHLAL,1
结果为106
(2)把-49乘以2:
MOVAL,-49
SALAL,1或SHLAL,1
结果为-98
(3)把53除以2的程序:
MOVAX,53
SHRAX,1
结果为26
(4)把-49除以2:
MOVAL,-49
SARAL,1
结果为-25
26.
设指令执行前AX和DX的4位十六进制数分别位AX=a1a2a3a4和DX=d1d2d3d4,则各指令执行后的寄存器变化情况如下:
MOVCL,04;AX=a1a2a3a4DX=d1d2d3d4
SHLDX,CL;AX=a1a2a3a4DX=d2d3d40
MOVBL,AH;AX=a1a2a3a4DX=d1d2d30,BL=a1a2
SHLAX,CL;AX=a2a3a40DX=d1d2d30,BL=a1a2
SHRBL,CL;AX=a2a3a40DX=d1d2d30,BL=0a1
ORDL,BL;AX=a2a3a40DX=d1d2d3a1,BL=0a1
以上指令序列执行完后,DX=d1d2d3a1,AX=a2a3a40,可见,本程序段的功能是:
把保存在DX:
AX中的双字数据左移4位
27.
各指令单独执行后,DX的值分别为:
(1)005CH
(2)0017H(3)05C8H(4)0072H(5)2017H
(6)00CDH(7)00B9H(8)05CCH(9)00DCH
28.
(BX)=00B7H=0000000010110111B=>0000000101100110B=>1100000000101101B=0C02DH
29.
(1)
MOVAX,SEGCONAME
MOVDS,AX;把CONAME所在段的段值送DS
MOVSI,OFFSETCONAME;把CONAME首地址送SI
MOVAX,SEGPRLINE
MOVES,AX;把PRLINE所在段的段值送ES
MOVDI,OFFSETPRLINE;把PRLINE首地址送DI
MOVCX,20;把传送字节数放在CX中
CLD;从左到右传送
REPMOVSB
(2)
MOVAX,SEGCONAME
MOVDS,AX;把CONAME所在段的段值送DS
LEASI,CONAME+20;把CONAME末首地址送SI
MOVAX,SEGPRLINE
MOVES,AX;把PRLINE所在段的段值送ES
LEADI,PRLINE+20;把PRLINE末地址送DI
MOVCX,20;;把传送字节数放在CX中
STD;从右到左传送
REPMOVSB
(3)
MOVAX,SEGCONAME
MOVDS,AX;把CONAME所在段的段值送DS
LEASI,CONAME+2;把CONAME中的第三字节地址送SI
LODSW
(4)
MOVAX,SEGPRLINE
MOVES,AX;把PRLINE所在段的段值送ES
LEADI,PRLINE+5
STOSW
(5)
MOVAX,SEGPRLINE
MOVES,AX;把PRLINE所在段的段值送ES
MOVSI,OFFSETCONAME;把CONAME首地址送SI
MOVCX,20
MOVAL,’’
CLD
LAHF
ANDAH,10111111B
SAHF;以上3条指令将ZF标志清零
REPNESCASB
JNZQUIT;没找到空格,直接退出
DECDI;找到空格,DI是所在空格位置的下一单元地址
MOVBH,[DI];把找到的空格送给BH
QUIT:
30.
STRINGDB’ThedateisFEB&03’
不使用串操作指令,可以把STRING中所有的&字符都用空格替换:
…
MOVCX,18
MOVAX,SEGSTRING
MOVDS,AX;把STRING所在段的段值送DS
MOVSI,0
MOVAL,’&’;把&字符的ASCII码送AL
LOP:
CMPAL,STRING[SI];依次查找
JNZNEXT;没找到准备下一次查找
MOVSTRING[SI],’’;找到则用空格替换&
NEXT:
INCSI
LOOPCX
…
使用串操作指令,只替换STRING中第一个找到的&字符:
…
MOVCX,18
MOVAX,SEGSTRING
MOVES,AX;把STRING所在段的段值送ES
MOVDI,OFFSETSTRING;把STRING首地址送DI
MOVAL,’&’;把&字符的ASCII码送AL
CLD
LAHF
ANDAH,10111111B
SAHF;以上3条指令将ZF标志清零
REPNZSCASB;依次查找
JNZEXIT;没找到,退出
DECDI
MOV[DI],’’;找到则用空格替换&
NEXT:
INCSI
LOOPCX
…
31.
STUDENT_NAMEDB30DUP(?
)
STUDENT_ADDRDB9DUP(?
)
PRINT_LINEDB132DUP(?
)
(1)
…
MOVAX,SEGPRINT_LINE
MOVES,AX;把PRINT_LINE所在段的段值送ES
LEADI,PRINT_LINE;把PRINT_LINE首地址送DI
MOVAL,’’
MOVCX,132
CLD
REPSTOSB
…
(2)
…
MOVAX,STUDENT_ADDR
MOVES,AX;把STUDENT_ADDR所在段的段值送ES
LEADI,STUDENT_ADDR;把STUDENT_ADDR首地址送DI
MOVAL,’-’
MOVCX,9
LAHF
ANDAH,10111111B
SAHF;以上3条指令将ZF标志清零
CLD
REPNZSCASB
JNZQUIT;没找到,则退出
DECDI;找到,DI-1后,保存了其偏移地址
QUIT:
…
(3)
…
MOVAX,STUDENT_ADDR
MOVES,AX;把STUDENT_ADDR所在段的段值送ES
LEADI,STUDENT_ADDR+8;把STUDENT_ADDR末地址送DI
MOVAL,’-’
MOVCX,9
LAHF
ANDAH,10111111B
SAHF;以上3条指令将ZF标志清零
STD
REPNZSCASB
JNZQUIT;没找到,则退出
INCDI;找到,DI+1后,存了其偏移地址
QUIT:
…
(4)
MOVAX,STUDENT_NAME
MOVES,AX;把STUDENT_NAME所在段的段值送ES
LEADI,STUDENT_NAME+29;把STUDENT_NAME末地址放到DI中
MOVAL,’’;把空格符的ASCII值放入AL中
MOVCX,30;把重复次数放到CX中
STD;让DI从低位移到高位
XORAH,AH;将ZF置1
REPZSCASB;如果有不是空格符的,就退出
JNZREPLACE;如果全是空格符,就转到STORE中
JMPQUIT;否则,直接退出
REPLACE:
INCDI;全是空格时,DI已经为-1
MOVCX,30
CLD
MOVAL,’*’
REPSTOSB
(5)
;把STUDENT_NAME移到PRINT_LINE的前30个字节中
MOVAX,SEGSTUDENT_NAME
MOVDS,AX
LEASI,STUDENT_NAME
MOVAX,SEGPRINT_LINT
MOVES,AX
LEADI,PRINT_LINE
MOVCX,30
CLD
REPMOVSB
;把STUDENT_ADDR移到PRINT_LINE的后9个字节中
MOVAX,SEGSTUDENT_ADDR
MOVDS,AX
LEASI,STUDENT_ADDR+8
LEADI,PRINT_LINE+131
MOVCX,9
STD
REPMOVSB
32.
...
MOVAX,SEGOLDS
MOVDS,AX
LEASI,OLDS
MOVAX,AXSEGNEWS
MOVES,AX,
LEADI,NEWS
MOVCX,5
XORAX,AX;将ZF标志置1
REPZCMPSB
JNZNEW_LESS;两串出现不同就转移
...
NEW_LESS:
…
33.
(1)CMPDX,CX
JAEXCEED
(2)CMPBX,AX
JGEXCEED
(3)CMPCX,0
JZZERO
(4)CMPBX,AX
JOOVERFLOW
(5)CMPBX,AX
JLEEQ_SMA
(6)CMPDX,CX
JBEEQ_CX
34.
(以下寄存器及其运算数据都是十六进制数)
AXBX和差OFCF转向
(1)147B80DC9557-00L1
(2)B5685