清华大学出版社微机原理汇编与接口技术答案Word格式.docx
《清华大学出版社微机原理汇编与接口技术答案Word格式.docx》由会员分享,可在线阅读,更多相关《清华大学出版社微机原理汇编与接口技术答案Word格式.docx(149页珍藏版)》请在冰点文库上搜索。
![清华大学出版社微机原理汇编与接口技术答案Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/a5d78714-ee82-400f-9285-2f782aff8764/a5d78714-ee82-400f-9285-2f782aff87641.gif)
(2)11110000∨01011010
11110000∨01011010=11111010
(3)11000110∨00000000
11000110∨00000000=11000110
1-9
1000011001011010=11011100
1011110010101010=00010110
1101101010011001=01000011
1-10
压缩BCD数
非压缩BCD数
ASCII码
38
38H
0308H
3338H
97
97H
0907H
3937H
105
105H
010005H
313035H
255
255H
020505H
323535H
483
483H
040803H
343833H
764
764H
070604H
373634H
1000
1000H
01000000H
31303030H
1025
1025H
01000205H
31303235H
1-11
43,126,8192,30116
1-12A8H
1-17
0914H:
00F2H,09232H
1-18
DS=2F5FH时,物理地址变为37820H。
不同段地址的数据段示意图如下图2所示。
2.3
BX=5566HAX=3344HCX=5566HDX=1122H
堆栈存储器的逻辑地址、堆栈指示器的指向及栈区的内容如下图所示。
2.40036H,003AH
2.5
程序段
AX
MOVAX,0
0000
DECAX
FFFF
ADDAX,7FFFH
7FFE
ADCAX,1
8000
NEGAX
ORAX,3FDFH
BFDF
ANDAX,0EBEDH
ABCD
XCHGAH,AL
CDAB
SALAX,1
9B56
RCLAX,1
36AD
2.6。
指令
存储器操作数的逻辑地址
注释
SUB[BP],AL
0FC0H:
0000H
段地址在SS
MOV[BX],BH
1000H:
MOV[DI],DL
MOVES:
[SI],BL
2000H:
ADD[BP+500H],AH
0500H
SUB[SI300H],AL
FD00H
300H=FD00H
MOV[DI+1000H],DL
MOV[BX8],CL
FFF8H
8=FFF8H
[DI+1000H],CH
MOV[BP+SI],DH
MOV[BX+DI],DL
2.7
0000H,0880H,0081H,0800H
2.8NEGAX,ANDAX,7FFFH
2.9
(1)MOVCL,4
SHLAX,CL
SHLBL,CL
MOVAL,BL
SHRDH,CL
ORAL,DH
(2)XORCX,0FF0H
(3)MOVAL,[BX]
MOVAH,0
ADDAL,[BX+1]
ADCAH,0
ADDAL,2[BX]
(4)方法1:
MOVAL,[BX]
XCHGAL,[BX+3]
MOV[BX],AL
MOVAL,1[BX]
XCHGAL,2[BX]
MOV1[BX],AL
方法2:
MOVAX,[BX]
XCHGAH,2[BX]
XCHGAL,3[BX]
MOV[BX],AX
(5)XCHGBH,BL
ANDBL,0FH
MOVCL,4
SHRAL,CL
MOVDL,BH
ANDDL,0FH
SHRBH,CL
MOVCL,BH
(6)MOVAH,0;
将AL中的无符号数扩展成16位
MOVCL,2
SHLAX,CL;
将AX乘以4
MOVDX,AX
将AX再乘以4
ADDAX,DX
2.10
数据的存储形式:
(2)
变量名
偏移地址(H)
变量的值(H)
S1
00
S2
0006
31
NB
000B
02
NW
000E
0078
P
0012
(3)
目的寄存器的值
源操作数的寻址方式
MOVBX,OFFSETS1+3
0003
立即寻址
MOVSI,OFFSETS2
MOVCL,COUNT
0B
MOVBP,NW+2
FF00
直接寻址
MOVDX,WORDPTRNB
0202
MOVAL,[SI+3]
34
变址寻址
MOVAH,[SI+BX+1]
35
基址变址寻址
MOVCH,BYTEPTRNW+3
FF
(4)改正下列程序段中不正确指令的错误:
a.MOVAX,S1
b.MOVBP,OFFSETS2
MOVCL,[BP]
c.MOVSI,OFFSETNB
MOV[SI],+
d.MOVDL,NW+2
e.MOVDI,CH
f.MOVBX,OFFSETS1
MOVDH,BX+3
g.INCCOUNT
h.MOVNB,S2
i.MOVAX,[BX+S1]
j.ADDAX,[DX+NW]
a.MOVAX,WORDPTRS1
b.MOVBP,OFFSETS2
MOVCL,DS:
[BP]
c.MOVSI,OFFSETNB
MOVBYTEPTR[SI],+
d.MOVDL,BYTEPTRNW+2
e.XCHGCH,CL
MOVCH,0
MOVDI,CX
f.MOVBX,OFFSETS1
MOVDH,[BX+3]
g.错误指令。
在操作数中直接书写数值表达式COUNT+1
h.MOVAL,S2
MOVNB,AL
i.MOVAX,WORDPTRS1[BX]
jADDAX,[DI+NW]
2.11
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
FIRSTDD0A46E5F90H
SECONDDB5DUP(0)
dataends
codesegment
startprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
movax,data
movds,ax
MOVAX,WORDPTRFIRST
MOVDX,WORDPTRFIRST+2
MOVSECOND+4,0
SHLAX,1
RCLDX,1
RCLSECOND+4,1
RCLSECOND+4,1
MOVWRORDPTRSECOND,AX
MOVWORDPTRSECOND+2,DX
ret
startendp
codeends
endstart
2.12
THIRDDB4DUP(0)
SARDX,1
RCRAX,1
MOVWORDPTRTHIRD,AX
MOVWORDPTRTHIRD+2,DX
2.13
FORTHDB4DUP(0)
MOVAX,WORDPTRFIRST
NOTAX
MOVWORDPTRFORTH,AX
MOVAX,WORDPTRFIRST+2
MOVWORDPTRFIRST+2,AX
ADDWORDPTRFORTH,1
ADCWORDPTRFORTH+2,0
2.14
数据段的内存映象图:
该程序的功能是将字节变量BUF中的两位BCD数以十六进制数形式显示出来。
具体显示是在下一行的行首显示(BUF)=78H。
3-1
1.AX=0048H,AX=0702H
2.AX=0059H,AX=0411H,AX=0107H,DL=04H
3.AX=0011H,AX=0107H
4.AX=005AH,AX=0900H,AX=0908H
5.AL=62H
6.AX=0248H
3-2
stackends
BVARDB99H
beginprocfar
stack,cs:
MOVAL,BVAR
MOVCL,4
SHRAL,CL
MOVAH,10
MULAH
ANDBVAR,0FH
ADDBVAR,AL
ret
beginendp
codeends
endbegin
先将2位压缩BCD数转换为非压缩BCD数,再用AAD指令将非压缩BCD数转换为二进制数:
MOVAL,BVAR
MOVAH,AL
MOVCL,4
SHRAH,CL
ANDAL,0FH
AAD
MOVBVAR,AL
3-3
dw32dup(0)
stackends
datasegment
W1DW0807H
W2DW0609H
B3DB2DUP(0)
dataends
codesegment
beginprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
pushax
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
ret
beginendp
codeends
endbegin
还可以用AAD指令将两个非压缩BCD数转换为二进制数,相减后再用AAM将差转换为非压缩BCD数:
MOVAX,W2
MOVDX,AX
MOVAX,W1
SUBAX,DX
AAM
MOVBYTEPTRB3,AX
3-4
D1DD06070809H
D2DD04050607H
OBFDB6DUP(0)
dataends
pushds
subax,ax
pushax
movax,data
movds,ax
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
MOVBYTEPTR[DI],1
N5:
MOVDX,DI
MOVAH,9
INT21H
3-5
W1DW8931H
W2DW5678H
assumess:
MOVDI,0
MOVAL,BYTEPTRW1;
AL=31H
ADDAL,BYTEPTRW2;
AL=A9H,CF=0,AF=0
DAA;
AL=09H,CF=1
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
MOVDL,0FH
ANDDL,AL
ADDDL,30H
MOV[DI],DL
SHRAX,CL
ANDAX,AX
JNZAGAIN
POPF
JNCOUTPUT
MOVBYTEPTR[DI],1
OUTPUT:
endbegin
3-6
stacksegmentstackstack
dw32dup(0)
stackends
datasegment
BVARDB99H
OBUFDB4DUP(0)
dataends
codesegment
beginprocfar
assumess:
subax,ax
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
beginendp
将8位二进制数转换为十进制数也可以用除10取余法实现。
转换程序段如下:
MOVAL,BVAR
XORAH,AH;
将8位二进制数扩展为16位(无符号数扩展)
MOVDL,10
ADDAH,30H;
将第一个余数即个位变为ASCII码
MOVOBUF+2,AH
将AL中的二进制数扩展为16位
AH为十位,AL为百位
MOVWORDPTROBUF,AX
还可以用左移二进制数的方法将二进制数转换为十进制数:
XORAX,AX;
清0AX
MOVCX,8;
左移二进制数8次
SHLBVAR,1
ADCAL,AL
DAA
ADCAH,0;
AH的值小于等于2不需校正
ADDAH,30H;
百位转换为ASCII码
MOVOBUF,AH
MOVAH,AL;
保存十位和个位
SHRAL,CL;
BCD数十位移至AL低4位
ANDAH,OFH;
BCD数个位在AH低4位
ADDAX,3030H;
个位和十位转换为ASCII码
MOVWORDPTROBUF+1,AX
MOVOBUF+3,$
以二进制数11111101B转换为BCD数0253H为例,说明转换的过程,全过程如下图所示。
3-7
TABDW0
DB0$
DW1
DB1$
DW8
DB8$
┇
DW64000
DB64000$
LFZDW0
IBUFDB3,0,3DUBP(0)
MOVDX,OFFSETIBUF
MOVAH,10
MOVAH,2
MOVDL,0AH
MOVAX,WORDPTRIBUF+2;
个位送AH,十位送AL
XCHGAH,AL;
个位与十位交换
CMPIBUF+1,2;
判别N是一位数还是二位数
JECOM
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码