版课后习题答案清华大学出版社著答案doc.docx
- 文档编号:14643104
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:51
- 大小:85.17KB
版课后习题答案清华大学出版社著答案doc.docx
《版课后习题答案清华大学出版社著答案doc.docx》由会员分享,可在线阅读,更多相关《版课后习题答案清华大学出版社著答案doc.docx(51页珍藏版)》请在冰点文库上搜索。
版课后习题答案清华大学出版社著答案doc
IEM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出
版社)(沈美明,温冬蝉著)答案
第三章答案1-22
1.
(1)
立即寻址
没有
(2)
直接寻址
7237H
(3)
使用BX的寄存器寻址
没有
(4)
使用BX的间接寻址
637DH
(5)
使用BX的寄存器相对寻址
0D5F0H
⑹
基址变址寻址
8E18H
(7)
相对基址变址
004FH
2.根据下列要求,写出相应的沢编指令。
(1)ADDDX,BX
(2)ADDAL,[BX][SI]
(3)ADD[BX][0B2H],CX
(4)MOVAX,2A59HADD[0524H],AX
(5)ADDAL,0B5H
3.
(1)寄存器间接寻址
MOVBX,OFFSET[BLOCK][OAH]
MOVDX,[BX]
(2)寄存器相对寻址
MOVSI,OAH
MOVDX,[BLOCK][SI]
(3)基址变址寻址
MOVBX,BLOCK
MOVSI,OAH
MOVDX,[BX][SI]
4.现有(DS)=2000H,(BX)=O1OOH,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。
(1)MOVAX,1200H1200H
(2)MOVAX,BX01OOH
LESDI,[BX]
MOVAX,ES:
DI
(2)0691H(3)05E0H
7.转向地址OBJ的值分别为:
(1)064DH
注意有符号数的符号位
8.
(1)
MOVAX,OABH
立即数寻址
无物理地址
(2)
MOVAX,BX
寄存器寻址
同上
(3)
MOVAX,[100]
直接寻址
20100H
(4)
MOVAX,VAL
直接寻址
20050H
(5)
MOVAX,[BX]
寄存器间接寻址
20100H
(6)
MOVAX,ES:
[BX]
直接寻址
21100H
(7)
MOVAX,[BP]
寄存器间接寻址
20010H
(8)
MOVAX,[S叮
同上
200A0H
(9)
MOVAX,[BX+10]
寄存器相对寻址
20110H
(10)
MOVAX,VAL[BX]
同上
20150H
(11)
MOVAX,[BX][SI]
基址变址寻址
201A0H
(12)MOVAX,VAL[BX][SI]相对基相变址寻址201F0H
9.
(1)的指令:
MOVAX,[BX][OCH]
(2)的指令:
MOVAX,ARRAY[BX]
10.MOVAX,TABLE是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234H
LEAAX,TABLE是把符号地址TABLE的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H
11.执行完指令后,(AX)=1EOOH
12.LEAAX,CSTRING
MOVDL,AX
MOVDH,[AX+6]
13.这参考课本P51—P53
14.LESBX,[2000]
MOVAX,ES:
[BX]
15.运算结果SF,ZF,CF,OF各位的值(从左至右依次往下
(1)
74D4H
0
0
0
0
(2)
A5C1H
1
0
0
1
(3)
4240H
0
0
1
0
(4)
0000H
0
1
1
0
16.
接上表、
⑴
5D14
0
0
0
0
(2)
A870
1
0
0
1
⑶
D870
1
0
0
0
(4)
34E4
0
0
1
0
17.
(1).MOVAX,Z;
把Z送到AX
z-x
w+(z-x)
结果保存在z中
SUBAX,X;
ADDAX,W;
MOVZ,AX;
(2).
MOV
AX,R;
R送到AX中
ADD
AX,9
;R+9
MOV
BX,X
;X送到BX中
ADD
BX,6
;X+6
ADD
AX,BX
;(R+9)+(X+6),结果保存在AX中
MOV
BX,W
;W送到BX中
SUB
BX,AX
;W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和
MOV
Z,BX
;最终结果送到z中
⑶
MOV
AX,W
;把W送到AX
IMULX
;w*x
注意:
低十六位保存在AX里,高十六位保存在DX里
MOV
BX,Y
;把Y送到BX里
ADD
BX,6
;Y+6
IDIVBX
;(W*X)
/(Y+6)注意:
商保存在AX里,余数保存在DX里
MOV
Z,AX
;把商送到Z中,
MOV
R,DX
;把余数送到R屮
⑷
MOVAX,W
;把W送到AX中
SUBAX,X
;w-x
MOVAX,1234H1234H
CWD:
把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位
保
;在。
乂屮
MOVBX,5
;把5送到BX中
IDIVBX
;(W-x)/5被除数为32位,除数为16位商为16位
IMULY
;上一步结果再乖以Y,积为32位
MOVBX,2
;把2送到BX中
IMULBX;上一步乘法所得的积再乘以2,各为64位
MOVZ,EAX
;把结果中低32位放入Z双字单兀中
MOV[Z+4],EDX
18.
;把结果中高32位放入Z+4双字单元中
指令本条指令执彳丁完后AX的内容执彳丁完后CF,SF,ZF的值
(1)MOVAX,DATAX
ADDDATAY,AX
(2)MOVAX,DATAX
ADDDATAY,AX
MOVAX,[DATAX+2]
ADD[DATAY+2],AX
(3)本組指令的作用是:
BX<[DATAX]+[DATAY]+[1](CF的值)帶進位加法~
22.
MOV
AX,
A
MOV
DX,
[A+2]
TESTDX,
8000H
JZ
RIGHT
NEG
DX
NEG
AX
SBB
DX,
0
RIGHT:
MOVB
MULDATAY;結果的高十六位保存在DX裏,低十六位保存在AX裏
(5)MOVAX,DATAX
MOVDX,[DATAX+2]
MULDWORDDATAY;;
(6)MOVAX,DATAX
DIV17H;結果商保存在AL中,余數在AH中
(7)MOVAX,DATAX
CDW
DIVDATAY
21・NEGDX
NEGAX
SBBDX,0
;把雙字長數的低字放到AX中
;把雙字長數的高字放到DX中
;測試雙字長數的符號
;如果是非負數,則直接保存
;如果是負數,則求補
MOV[B+2],DX
23.每條指令單獨執行完後的結果依次為:
(1)9AH
(2)61H(3)OFBH(4)1CH(5)0(6)0E3H
24.執行指令序列後,BX的內容為:
ODAH
25.
(1)把53D乘以2的程序:
MOVAX,35H;53D=35H
SHLAX,1
(2)把53除以2的程序:
MOVAX,35H
SHRAX,1
其他的同理s
25.這段程序完成的功能是:
把DX:
AX中的雙字數據左移4位(相當於乘以16D)
26.各條指令單獨執行後,DX的值依次為:
(1)5CH
(2)17H(3)05C8H(4)72H(5)2017H(6)OCDH(7)0172H(8)O5CCH(9)
ODCH
27.該程序段執行完後,BX寄存器的內容是:
C02DH
28.
(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:
LEASI,CONAME;把CONAME屮第一个字节的偏移地址送到SI屮
LEADI,PRLINE;把PRLINE中第一个字节的偏移地址送到DI中
MOVCX,20;把重复次数放到CX里
CLD;II:
SIDI从低地址指向高地址(即从左到右传送)
REPMOVSB;传送
(2)从右到左把CONMAE屮的字符串传送到PRLINE屮的程序实现:
LEASI,CONAME
LEADI,PRLINE
MOVCX,20
STD;和上面唯一不同的就是这次是从右到左,所以要从高地址指向低地址
REPMOVSB
(3)把CONAME屮的第三和第四個字節裝入AX的程序實現:
LEASI,[CONAME+3]
LODSW
(4)把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:
LEADI,[PRLINE+5]
STOSW
(5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:
LEADI,CONAME;把CONAME中第一個字符偏移地址放入DI中
MOVCX,
20;
把重複次數放到cx中
MOVAL,
20H;
把空格符的ASCII值放入AL屮
CLD
;从低到咼
REPNE
SCASB
;比較
MOVBH,
30.
[DI-1]R
;把檢查到的空格符送到BH屮
MOVCX,
12H
;把重複次數放到CX中。
這裏用十六進制表示
MOVSI,
0
;初始化SI
MOVAX,
26H
;把&字符的ASCII值放入AX
CHECK:
INCSI
CMPAX,
STRINGESI];依次查找
LOOPNE
CHECK
;找到了就退出
MOVAX,
20H
;把空格符的ASCII值勤放入AX屮
MOVSTRING[SI-1],AX;用空格符代替&
31„
(1)用空格符清除PRINTLINE域的程序实现:
MOVAL,2OH
LEADI,PRINTLINE
MOVCX,132
CLD
REPSTOSB
(2)在STUDENT_ADDR屮查找第一个’_'的程序实现:
MOVAX,2DH;把“一”的ASCII值放入AX
MOVSI,0;初始化SI
MOVCX,9;把重複次數放入CX屮
;依次檢查STUDENT-ADDR中的字符是否為找到第一个停下来
CHECK:
CMPAX,STUDENT_ADDR[S叮;
INCSI;
LOOPNZCHECK;
(3)在STUDENT_ADDR屮查找最后一个”_“的程序实现:
;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9
MOVAX,2DH;
MOVSI,9;
MOVCX,9;
CHECK:
CMPAX,STUDENTADDR[S叮
DECSI;
LOOPNZCHECK;
(4)程序實現:
MOVAL,20H;把空格符的ASCII值放入AL中
LEADI,STUDENT_NAME;把STUDENT_NAME中第一个字符偏移地址放到DI中
MOVCX,30;把重复次数放到CX中
CLD;让DI从低位移到高位
REPZSCASB;如果有不是空格符的,就退出
JZSTORE;如果全是空格符,就转到STORE中
;用*代替空格
STORE:
MOVAL2AH
MOVCX,30
STD;注意,这里是把前面从低到高移动的DI再从高到低移上去s
REPSTOSB
(5)程序实现:
;把STUDENT_NAME移到PRINTLINE的前30个字节中
LEASI,STUDENT_NAME
LEADI,PRINTLINE
MOVCX,30
CLD
REPMOVSB;把STUDENT_ADDR移到PRINTLINE的后9个字节中
LEASI,[STUDENT_ADDR+9]
LEADI,[PRINT丄INE+132]
MOVCX,9
STD
REPMOVSB
32.程序实现:
LEASI,OLDS
LEADI,NEWS
MOVCX,5
REPZCMPSB
JNZNEW_LESS
33.
(1)CMPDX,CX
JAEXCEED
(2)CMPBX,AX
JGEXCEED
(3)CMPCX,0
JZ
ZERO
(4)
CMP
BX,
AX
J0
OVERFLOW
(5)
CMP
BX,
AX
JLE
EQ_SMA
(6)CMPDX,CX
JBEEQ_CX
34.
(1)跳转到:
LI
(2)跳转到LI
(3)跳转到L2
(4)跳转到L5
(5)跳转到L5
35.
(1)可以引起转移到L1的指令有:
NB,BE,NL,LE
(2)町以引起转移到L1的指令有:
同上
(3)可以引起转移到L1的指令有:
B,BE,L,LE
(4)可以引起转移到L1的指令有:
NB,NBE,NL,NLE
(5)可以引起转移到L1的指令有:
同上
(6)可以引起转移到L1的指令有:
同(3)
(7)可以引起转移到L1的指令有:
同上
36.
35.程序流程图就不画了,程序如下~~
MOVAL,STAUSESI];把要测试的字节放到AL中
放到AL
ANDAL,2AH;把第一,三,五位为一其他位为0的数一2AH,与这个字节比较,结果
中
JZR0UTINE_4;如果结果为0,则三位都为0
;如果结果为0,则三位都为1
XORAL,2AH;前面相与的结果再与2AH异或
JZROUTINE_1
BSFBL,AL;
BSRBL,AL
CMPBL,CL
;如果向前和向后测试后,第一个1的位置相同,说明只有一个1,则异或运算前有AL中有两个1
JER0UTINE_2
ROUTINE_1
注:
本题还有其他解法,请大家自己试试~~
38.
(1)当括号内是:
LOOP时,循环四次,程序结束后
(AX)=05(BX)=16(CX)=0(DX)二0
(2)当括号内是:
LOOPE时,不循环,程序结束后
(AX)=02(BX)二04(CX)二03(DX)二02
(3)当括号内是:
LOOPNE时:
循环三次,程序结束后
(AX)二04(BX)=11(CX)二01(DX)二0
第四章答案
1。
下列指令的错误
(1)MOVAH,BX源操作数与目的操作数长度不相同~
(2)MOV[BX],[S叮这是两个内存单元在传递数据,而这在汇编语言中是不允许的
(3)MOVAX,[SI][D叮不能用两个变址连用,其中一个应为基址'
(4)MOVMYDAT[BX][SI],ES:
AX同
(2)
(5)MOVBYTEPTR[BX],1000必须有一个为寄存器
(6)MOVBX,OFFSETMYDAT[S叮OFFSET不能与复杂操作数相连~
(7)MOVCS,AX不能对CS赋值~
(8)MOVECX,AX操作数类型不同'
2o
(1)合法
(2)非法(3)非法(4)非法
3。
(1)非法,操作数类型不同
(2)合法
(3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?
~"呵~
(4)合法~
(5)合法'
(6)合法
(7)非法必须有一个寄存器s把CPU放哪了?
s
(8)非法,两个内存单元地址相加没有意义~
(9)合法
(10)非法,同(3)
4。
(1)两内存单兀传递数据
(2)操作数类型不同
(3)跳转指令只能跳转到符号地址
(4)转移指令后不能为变量,只能为标号
(5)格式不对,应为NEARPTR。
。
。
5o图,就不画了s
6o
(1)DW5150H
(2)MOVAX,5150H
MOVADDRESS,AX;等,写出几个就可以
7oDATASGSEGMENT
FLD1BDB,personalcomputer,
FLD2BDB10DUP(32)
FLD3BDB20H
FLD5B
DB
'32654'
FLD6B
DB
10DUP(0)
FLD7B
DB
'PARTI',DUP20
(?
),'PART2',DUP50(?
),'PART3',DUP14
FLD1W
DW
OFFFOH
FLD2W
DW
01011001B
FLD3W
DW
FLD7B
FLD4W
DW
5,6,7,8,9
FLD5W
DW
5DUP(0)
FLD6W
DW
(FLD6W-FLD1W)-
-(FLD7B-FLD1B)
FLD4B
DB0101100IB
80PLENTH的值为22,GE表示该数据段的长度~
9oL的值为7
10o
(1)MOVAX,OFFSETLNAME
(2)MOVSI,WORDPTRCODE_LIST
(3)CODE_LENGHTEQU$-CODE丄1ST
llo代码如下:
DATA_SEGSEGMENT
DB5
DATA_LISTDWOFFFFH,0,2,5,4,5DUP(?
)
DATA_SEGENDS
CODE_SEGSEGMENT
ASSUMECS:
CODE_SEG,DS:
DATA_SEG
MOVAX,5
MOVMAX,AX
MOVAX,OFFFFH
MOVMIN,AX
CODE_SEGENDS
12o
(1)10025
(2)19
(3)2548
(4)3
(5)103
(6)OFFFFH
(7)1
MAIN_PROCENDP
END
16o程序框架如下:
DATA_SEGSEGMENT;定義數據段
ORGOEOOOH;讓下一字節地址為OEOOOH
FIRST_TYPEEQUTHISWORD;建立一個與下一存儲單元有相同段地址和偏移地址的操作
數
DATA_GROUPDB100DUPO?
);給DATA_GROUP分配100個字節的空間
DATA_SEGENDS;數據段結束
STACK_SEGSEGMENT;定義堆棧段
ALIGN16;讓下一字節從小段首地址開始
STACKDB100DUP(?
);為堆棧分配空間
STACK_SEGENDS;
CODE_SEGSEGMENT
ASSUMECS:
CODE_SEG,DS:
DATA_SEG,SS:
STACK_SEG
ORG1000H;讓下條指令的第一個字節從1000H開始
START:
MOVAX,DATA_SEG
MOVDS,AX
MOVAX,STACK_SEG
MOVSS,AX
CODE_SEGENDS
17。
程序如下:
D_SEG
SEGMENT
;数据段定义
AUGENE
IDD99251
D_SEG
ENDS
E_SEG
SEGMENT
;附加段定义
ADDEND
DD-15926
E_SEG
ENDS
C_SEG
SEGMENT
;代码段定义
ASSUME
CS:
C_SEG,DS:
D_SEG,ES:
E_SEG
START:
MOVAX,D_SEG
第五章答案
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
.modelsmall
.stack100H
.code
mainprocfar
Start:
pushdx
movax,0
pushax
movah,01H
int21H
cmpal,61H
jllopl
cmpal,7BH
jgelopl
subal,20H
movdl,al
lopl:
movah,2
int21H
ret
Endstort
5.2编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符.
.modelsmall
.386
.code
MAINPROCFAR
start:
pushds
subax,ax
pushax
input:
movah,7H
int21Hcmpe:
cmpal,20H
JEexit
cmpal,61H
JLinput
cmpal,7AH
JGinput
print:
subal,01H
movdl,al
movah,02H
int21H
addal,01H
movdl,al
movah,02H
int21H
addal,01H
movdl,al
movah,02H
int21H
;输出换行回车
movdl,OAH
movah,02H
int21H
jmpinput
exit:
ret
MAINENDP
ENDstart
5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。
.modelsmall
.data
xDB4dup(?
).stack100H
.code
MAINPROCFAR
start:
pushds
andax,OOH
pushax
movax,1234H
movex,04H
movsi,OOH
lop:
pushex
movcl,04H
rolax,cl
pushax
andal,OFH
movBYTEPTRx[si],al
popax
popex
addsi,2
Looplop
moval,[X]
movbl,[X+2]
movcl,[X+4]
movdl,[X+6]
print:
movah,02H
int21H
mov
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课后 习题 答案 清华大学出版社 doc