IBMPC汇编语言程序设计第二版课后习题答案清华大学.docx
《IBMPC汇编语言程序设计第二版课后习题答案清华大学.docx》由会员分享,可在线阅读,更多相关《IBMPC汇编语言程序设计第二版课后习题答案清华大学.docx(36页珍藏版)》请在冰豆网上搜索。
IBMPC汇编语言程序设计第二版课后习题答案清华大学
您正在查看"ibm-pc汇编语言程序设计(第二版课后习题答案"分类下的文章
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第三章答案1-222006-11-0222:
56
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著答案
1。
.(1立即寻址没有
(2直接寻址7237H
(3使用BX的寄存器寻址没有
(4使用BX的间接寻址637DH
(5使用BX的寄存器相对寻址0D5F0H
(6基址变址寻址8E18H
(7相对基址变址004FH
2。
根据下列要求,写出相应的汇编指令。
(1ADDDX,BX
(2ADDAL,[BX][SI]
(3ADD[BX][0B2H],CX
(4MOVAX,2A59HADD[0524H],AX
(5ADDAL,0B5H
3。
(1寄存器间接寻址
MOVBX,OFFSET[BLOCK][0AH]
MOVDX,[BX]
(2寄存器相对寻址
MOVSI,OAH
MOVDX,[BLOCK][SI]
(3基址变址寻址
MOVBX,BLOCK
MOVSI,OAH
MOVDX,[BX][SI]
没人来看,还是要写~~
4。
现有(DS
=2000H,(BX=0100H,(SI=0002H,(20100=12H,(20101=34H,(20102=56H,(20103=78H,(21200=2AH,(20201=4CH,(21202=B7H,(21203=65H,试说明下列各条指令执行完后,AX寄存器的内容。
(1MOVAX,1200H1200H
(2MOVAX,BX0100H
(3MOVAX,[1200]4C2AH注意,是字单元!
!
(4MOVAX,[BX]3412H同上
(5MOV1100[BX]4C2AH
(6MOVAX,[BX][SI]7856H
(7MOVAX,1100[BX][SI]65B7H
5。
(17CD9H(21200H(36319H
6。
MOVBX,2000H
LESDI,[BX]
MOVAX,ES:
DI
7。
转向地址OBJ的值分别为:
(1064DH(20691H(305E0H注意有符号数的符号位~~
8。
(1MOVAX,0ABH立即数寻址
无物理地址
(2MOVAX,BX寄存器寻址
同上
(3MOVAX,[100]直接寻址
20100H
(4MOVAX,VAL直接寻址
20050H
(5MOVAX,[BX]寄存器间接寻址
20100H
(6MOVAX,ES:
[BX]直接寻址
21100H
(7MOVAX,[BP]寄存器间接寻址
20010H
(8MOVAX,[SI]同上
200A0H
(9MOVAX,[BX+10]寄存器相对寻址
20110H
(10MOVAX,VAL[BX]同上
20150H
(11MOVAX,[BX][SI]基址变址寻址
201A0H
(12MOVAX,VAL[BX][SI]相对基相变址寻址
201F0H
9。
(1的指令:
MOVAX,[BX][0CH]MOVZREO,AX
(2的指令:
MOVAX,ARRAY[BX]MOVZREO,AX
10。
MOVAX,TABLE是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX=1234H
LEAAX,TABLE是把符号地址TABLE的有效地址(这里是偏移量送到指定寄存器AX里,指
令执行完后,(AX=0032H
11。
执行完指令后,(AX=1E00H
12。
LEAAX,CSTRING
MOVDL,AX
MOVDH,[AX+6]
13。
这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~
14。
LESBX,[2000]
MOVAX,ES:
[BX]
注意:
一开始我写的是:
MOVAX,ES:
[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~
15。
运算结果SF,ZF,CF,OF各位的值(从左至右依次往下~
(174D4H0000
(2A5C1H1001
(34240H0010
(40000H0110
16。
接上表~
(15D140000
(2A8701001
(3D8701000
(434E40010
17。
(1.MOVAX,Z;把Z送到AX
SUBAX,X;Z-X
ADDAX,W;W+(Z-X
MOVZ,AX;结果保存在Z中
(2.MOVAX,R;R送到AX中
ADDAX,9;R+9
MOVBX,X;X送到BX中
ADDBX,6;X+6
ADDAX,BX;(R+9+(X+6,结果保存在AX中
MOVBX,W;W送到BX中
SUBBX,AX;W-(R+9-(X+6,连续减去两个数,相当于减去这两个数的和~~
MOVZ,BX;最终结果送到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
MOVAX,W;把W送到AX中
SUBAX,X;W-X
CWD;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保
;在DX中
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;把结果中高32位放入Z+4双字单元中
18。
指令本条指令执行完后AX的内容
执行完后CF,SF,ZF的值
MOVAX,1234H1234H000
MOVCL,41234H000
ROLAX,CL2341H100
DECAX2340H100
MOVCX,42340H100
MULCX8918H000
INT20H
程序结束后,(AX=8918H(DX=0000H
19。
指令执行完后AX的内容
执行完后CF,SF,ZF和OF的值
MOVAX,000010
DECAXFFFFH0100
ADDAX,7FFFH7FFEH
0000
ADDAX,28000H0101
NOTAX7FFFH0101
SUBAX,0FFFFH8000H
1101
ADDAX,8000H0000H
1011
SUBAX,1FFFFH1101
ANDAX,58D1H58D1H
0000
SALAX,1B1A2H0101
SARAX,1D8D1H0100
NEGAX272FH1000
RORAX,19397H1001
20。
(1MOVAX,DATAX
ADDDATAY,AX
(2MOVAX,DATAX
ADDDATAY,AX
MOVAX,[DATAX+2]
ADD[DATAY+2],AX
(3本組指令的作用是:
BX<------[DATAX]+[DATAY]+[1](CF的值帶進位加法~
(4MOVAX,DATAX
MULDATAY;結果的高十六位保存在DX裏,低十六位保存在AX裏
(5MOVAX,DATAX
MOVDX,[DATAX+2]
MULDWORDDATAY;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏
;這裏所用的DWORD為一屬性操作符,在第四章會學到~~
(6MOVAX,DATAX
DIV17H;結果商保存在AL中,余數在AH中
(7MOVAX,DATAX
CDW
DIVDATAY
21。
NEGDX
NEGAX
SBBDX,0
22。
MOVAX,A;把雙字長數的低字放到AX中
MOVDX,[A+2];把雙字長數的高字放到DX中
TESTDX,8000H;測試雙字長數的符號
JZRIGHT;如果是非負數,則直接保存
NEGDX;如果是負數,則求補
NEGAX
SBBDX,0
RIGHT:
MOVB,AX
MOV[B+2],DX
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第三章答案23--382006-11-0222:
58IBM-PC汇编语言程序设计(第二版课后习题答案
23。
每條指令單獨執行完後的結果依次為:
(19AH(261H(30FBH(41CH(50(60E3H
24。
執行指令序列後,BX的內容為:
0DAH
25。
(1把53D乘以2的程序:
MOVAX,35H;53D=35H
SHLAX,1
(2把53除以2的程序:
MOVAX,35H
SHRAX,1
其他的同理~~
26。
這段程序完成的功能是:
把DX:
AX中的雙字數據左移4位(相當於乘以16D
27。
各條指令單獨執行後,DX的值依次為:
(15CH(217H(305C8H(472H(52017H(60CDH(70172H(805CCH
(90DCH
28。
該程序段執行完後,BX寄存器的內容是:
C02DH
29。
(1从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:
LEASI,CONAME;把CONAME中第一个字节的偏移地址送到SI中
LEADI,PRLINE;把PRLINE中第一个字节的偏移地址送到DI中
MOVCX,20;把重复次数放到CX里
CLD;让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;從低到高
REPNESCASB;比較
MOVBH,[DI-1]R;把檢查到的空格符送到BH中
30。
MOVCX,12H;把重複次數放到CX中。
這裏用十六進制表示
MOVSI,0;初始化SI
MOVAX,26H;把&字符的ASCII值放入AX
CHECK:
CMPAX,STRING[SI];依次查找
INCSI
LOOPNECHECK;找到了就退出
MOVAX,20H;把空格符的ASCII值勤放入AX中
MOVSTRING[SI-1],AX;用空格符代替&
31。
(1用空格符清除PRINT_LINE域的程序实现:
MOVAL,20H
LEADI,PRINT_LINE
MOVCX,132
CLD
REPSTOSB
(2在STUDENT_ADDR中查找第一个’_‘的程序实现:
MOVAX,2DH;把“—”的ASCII值放入AXMOVSI,0;初始化SI
MOVCX,9;把重複次數放入CX中
;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来
CHECK:
CMPAX,STUDENT_ADDR[SI];
INCSI
LOOPNZCHECK
(3在STUDENT_ADDR中查找最后一个”_“的程序实现:
;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9
MOVAX,2DH
MOVSI,9
MOVCX,9
CHECK:
CMPAX,STUDENT_ADDR[SI]
DECSI
LOOPNZCHECK
(4程序實現:
MOVAL,2OH;把空格符的ASCII值放入AL中
LEADI,STUDENT_NAME;把STUDENT_NAME中第一个字符偏移地址放到DI中
MOVCX,30;把重复次数放到CX中
CLD;让DI从低位移到高位
REPZSCASB;如果有不是空格符的,就退出
JZSTORE;如果全是空格符,就转到STORE中
;用*代替空格
STORE:
MOVAL2AH
MOVCX,30
STD;注意,这里是把前面从低到高移动的DI再从高到低移上去~~
REPSTOSB
(5程序实现:
;把STUDENT_NAME移到PRINT_LINE的前30个字节中
LEASI,STUDENT_NAME
LEADI,PRINT_LINE
MOVCX,30
CLD
REPMOVSB
;把STUDENT_ADDR移到PRINT_LINE的后9个字节中
LEASI,[STUDENT_ADDR+9]LEADI,[PRINT_LINE+132]MOVCX,9
STD
REPMOVSB
32。
程序实现:
。
。
。
LEASI,OLDS
LEADI,NEWS
MOVCX,5
REPZCMPSB
JNZNEW_LESS
。
。
。
33。
(1CMPDX,CX
JAEXCEED(2CMPBX,AX
JGEXCEED
(3CMPCX,0
JZZERO
(4CMPBX,AX
JOOVERFLOW(5CMPBX,AX
JLEEQ_SMA(6CMPDX,CX
JBEEQ_CX
34。
(1跳转到:
L1
(2跳转到L1
(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。
37。
程序流程图就不画了,呵呵,程序如下~~
MOVAL,STAUS[SI];把要测试的字节放到AL中
ANDAL,2AH;把第一,三,五位为一其他位为0的数--2AH,与这个字节比较,结果
;放到AL中
JZROUTINE_4;如果结果为0,则三位都为0
XORAL,2AH;前面相与的结果再与2AH异或
JZROUTINE_1;如果结果为0,则三位都为1
BSFBL,AL;
BSRBL,AL
CMPBL,CL
;如果向前和向后测试后,第一个1的位置相同,说明只有一个1,则异或运算前有AL中有两个1JEROUTINE_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
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第三章答案39--522006-11-0223:
02
39。
图,就不画了,呵呵~~自己看一下课本,P101~~
40.。
(100003100H(25100H(37100H
41。
(1目的地址:
2004H内容依次为:
56HF4H23H98H
(2目的地址:
384CH内容依次为:
91H34HF2H01H
(3目的地址:
寄存器,无物理地址~内容依次为:
92H6DHA2H4CH42。
(1PUSHAX
(SP<------(SP-2
(SP+1<-----(AH(SP<------(AL
(2POPESI
(ESI<-------((ESP+3,(ESP+2,(ESP+1,(ESP
(ESP<-------(ESP+4
(3PUSH[BX]
(SP<------(SP-2
(SP+1<-----([BX+1](SP<------([BX]
(4PUSHAD
(ESP<-------(EAX
(ESP-4<-------(ECX
(ESP-8<-------(EDX
(ESP-12<-------(EBX
(ESP-16<-------(ESP;这里指的是指令执行前的ESP(ESP-20<-------(EBP
(ESP-24<-------(ESI
(ESP-28<-------(EDI
(ESP<-------(ESP-32
(5POPDS
(DS<------((SP+1,(SP
(SP<------(SP+2
(6PUSH4
(SP<-------(SP-2
(SP+1<-----0
(SP<------4
43。
(12CEFF93H(224B76A0H
(39090804H(46F13ADH
44。
(10FFFFFFFCH(20FFFFFFF8H
(300000007H(400000099H45。
(EAX=0(EBX=25d
46。
(AX=3d(DX=7d
47。
ADDECX,EDX
ADDECX,ESI
MOVEDI,ECX
48。
IMULBX,DX,100H执行的操作是:
(BX<-------(DX*100H
49。
程序实现:
MOVAL,BL
CBW
IDIVCL
IMUL2
MOVDX,AX
50。
JMPDI是直接跳转,执行的操作是:
(IP<-----(IP+(DI
JMP[DI]是间接跳转,执行的操作是:
(IP<----(IP+([DI]跳转到DI中所指向的内存单元中的指令地址~
51。
假设数组名为NUMBERS,程序如下~
MOVBX,0;后面用到~
MOVCX,100H;把循环次数放入CX
MOVAL,42H
MOVSI,0;初始化SI
;CHECK用来实现查找功能~
CHECK:
CMPAL,NUMBERS[SI]
INCSI
JBSTORE1;大于42H的数的个数存入UP
JASTORE2;小于42H的的数的个数存入DOWN中~
LOOPCHECK;相等继续循环~
STORE1INCBL;找到一个大于42的数,BL值增加1~
MOVUP,BL
LOOPCHECK
STORE2INCBH
MOVDOWN,BH
LOOPCHECK
52。
图,也不用画了~~呵呵~好了,本章结束
##################################################################
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第四章答案2006-11-0421:
591。
指令下列指令的错误
(1MOVAH,BX源操作数与目的操作数长度不相同~
(2MOV[BX],[SI]这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~
(3MOVAX,[SI][DI]不能用两个变址连用,其中一个应为基址~
(4MOVMYDAT[BX][SI],ES:
AX同(2
(5MOVBYTEPTR[BX],1000必须有一个为寄存器
(6MOVBX,OFFSETMYDAT[SI]OFFSET不能与复杂操作数相连~
(7MOVCS,AX不能对CS赋值~
(8MOVECX,AX操作数类型不同~
2。
(1合法(2非法(3非法(4非法
3。
(1非法,操作数类型不同
(2合法
(3非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?
~~~呵~
(4合法~
(5合法~
(6合法
(7非法~,必须有一个寄存器~~把CPU放哪了?
~~
(8非法,两个内存单元地址相加没有意义~
(9合法
(10非法,同(3
4。
(1两内存单元传递数据
(2操作数类型不同
(3跳转指令只能跳转到符号地址
(4转移指令后不能为变量,只能为标号
(5格式不对,应为NEARPTR。
。
。
5。
图,就不画了~~
6。
(1DW5150H
(2MOVAX,5150H
MOVADDRESS,AX
等,写出几个就可以~~
7。
DATASGSEGMENT
FLD1BDB'personalcomputer'
FLD2BDB10DUP(32
FLD3BDB20H
FLD4BDB01011001B
FLD5BDB'32654'
FLD6BDB10DUP(0
FLD7BDB'PART1',DUP20(?
'PART2',DUP50(?
'PART3',DUP14(?
FLD1WDW0FFF0H
FLD2WDW01011001B
FLD3WDWFLD7B
FLD4WDW5,6,7,8,9
FLD5WDW5DUP(0
FLD6WDW(FLD6W-FLD1W-(FLD7B-FLD1B8。
PLENTH的值为22,GE表示该数据段的长度~
9。
L的值为7
10。
(1MOVAX,OFFSETLNAME
(2MOVSI,WORDPTRCODE_LIST
(3CODE_LENGHTEQU$-CODE_LIST11。
代码如下:
DATA_SEGSEGMENT
DB5
DATA_LISTDW0FFFFH,0,2,5,4,5DUP(?
DATA_SEGENDS
CODE_SEGSEGMENT
ASSUMECS:
CODE_SEG,DS:
DATA_SEG
MOVAX,5
MOVMAX,AX
MOVAX,0FFFFH
MOVMIN,AX
CODE_SEGENDS
12。
(11002