IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc

上传人:本田雅阁 文档编号:2374836 上传时间:2019-03-24 格式:DOC 页数:41 大小:116.51KB
返回 下载 相关 举报
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc_第1页
第1页 / 共41页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc_第2页
第2页 / 共41页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc_第3页
第3页 / 共41页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc_第4页
第4页 / 共41页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc》由会员分享,可在线阅读,更多相关《IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章.doc(41页珍藏版)》请在三一文库上搜索。

1、IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)答案第三章答案1-221.(1)立即寻址 没有(2)直接寻址 7237H(3)使用BX的寄存器寻址没有(4)使用BX的间接寻址 637DH(5)使用BX的寄存器相对寻址0D5F0H(6)基址变址寻址 8E18H(7)相对基址变址004FH2.根据下列要求,写出相应的汇编指令。(1)ADD DX,BX(2) ADD AL,BXSI(3)ADD BX0B2H, CX(4) MOV AX,2A59H ADD 0524H ,AX(5) ADD AL ,0B5H 3.(1)寄存器间接寻址 MOV BX,OFFSET

2、BLOCK0AH MOV DX ,BX(2)寄存器相对寻址 MOV SI,OAHMOV DX,BLOCKSI(3)基址变址寻址MOV BX ,BLOCKMOV SI,OAHMOV DX,BXSI4. 现有(DS)=2000H, (BX)=0100H, (SI)=0002H,(20100)=12H, (20101)=34H,(20102)=56H, (20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。(1)MOV AX,1200H 1200H(2) MOV AX,BX0100H(3)

3、 MOV AX,1200 4C2AH 注意,是字单元!(4)MOV AX,BX同上(5)MOV 1100BX 4C2AH (6) MOV AX,BXSI7856H (7) MOV AX,1100BXSI 65B7H5.(1) 7CD9H(2) 1200H (3) 6319H6. MOV BX,2000H LESDI,BX MOV AX, ES:DI7.转向地址OBJ的值分别为:(1)064DH (2)0691H (3)05E0H 注意有符号数的符号位8.(1) MOV AX,0ABH 立即数寻址 无物理地址(2) MOV AX,BX 寄存器寻址 同上(3) MOV AX,100直接寻址 201

4、00H (4) MOV AX,VAL 直接寻址 20050H (5) MOV AX,BX 寄存器间接寻址 20100H(6) MOV AX,ES:BX 直接寻址21100H (7) MOV AX,BP 寄存器间接寻址 20010H(8)MOV AX,SI 同上 200A0H (9) MOV AX,BX+10 寄存器相对寻址 20110H(10)MOV AX,VALBX同上 20150H(11) MOV AX,BXSI基址变址寻址 201A0H(12) MOV AX,VALBXSI相对基相变址寻址201F0H9.(1)的指令: MOV AX, BX0CH MOV ZREO ,AX (2) 的指令

5、: MOV AX,ARRAYBXMOV ZREO,AX10. MOV AX,TABLE 是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234H LEA AX,TABLE是把符号地址TABLE 的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H11. 执行完指令后,(AX)=1E00H12. LEA AX,CSTRING MOV DL,AX MOV DH,AX+613. 这参考课本P51-P5314LES BX,2000MOV AX,ES:BX15运算结果 SF,ZF,CF,OF各位的值(从左至右依次往下)(1) 74D4H0 0 00 (2

6、) A5C1H 10 0 1(3)4240H 0 0 1 0 (4) 0000H 0 1 1 016接上表(1)5D140000(2)A8701 00 1(3) D870 1000(4) 34E4 0 01017(1).MOV AX,Z ;把Z送到AX SUB AX,X ;Z-X ADD AX,W ;W+(Z-X) MOV Z,AX ;结果保存在Z中(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,

7、AX ; W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和 MOV Z,BX ;最终结果送到Z中(3)MOV AX,W ;把W送到AXIMUL X ;W*X 注意:低十六位保存在AX里,高十六位保存在DX里MOV BX,Y ;把Y送到BX 里ADD BX,6 ;Y+6IDIV BX;(W*X)/(Y+6) 注意:商保存在AX里,余数保存在DX里MOV Z,AX ;把商送到Z中,MOV R,DX ;把余数 送到R中(4)MOV AX,W ;把W送到AX中SUB AX,X;W-XCWD ;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保;在DX中 MOV

8、BX,5 ;把5送到BX中IDIV BX;(W-X)/5被除数为32位,除数为16位商为16位 IMUL Y ;上一步结果再乖以Y,积为32位MOV BX,2;把2送到BX中 IMUL BX ;上一步乘法所得的积再乘以2,各为64位MOV Z,EAX ;把结果中低32位放入Z双字单元中MOV Z+4,EDX;把结果中高32位放入Z+4双字单元中 18指令本条指令执行完后AX的内容执行完后CF,SF,ZF的值MOV AX,1234H 1234H 0 0 0MOV CL,41234H 0 00 ROL AX,CL 2341H 1 0 0DEC AX 2340H1 0 0 MOV CX,4 2340

9、H10 0MUL CX 8918H 00 0INT 20H程序结束后,(AX)=8918H (DX)=0000H19指令执行完后AX的内容执行完后CF ,SF,ZF和OF的值MOV AX,0 0 0010DEC AX FFFFH0100ADD AX,7FFFH 7FFEH 0000ADD AX,2 8000H 0101NOT AX 7FFFH 0101 SUB AX,0FFFFH 8000H 1101ADD AX,8000H0000H 1011SUBAX,1FFFFH1101 AND AX,58D1H 58D1H0000 SAL AX,1 B1A2H 0101SAR AX,1 D8D1H 01

10、00NEG AX272FH1000ROR AX,19397H 1001 20(1)MOV AX,DATAX ADD DATAY,AX(2)MOV AX,DATAX ADD DATAY,AX MOV AX,DATAX+2 ADD DATAY+2 ,AX(3)本組指令的作用是:BX -DATAX+DATAY+1(CF的值) 帶進位加法(4)MOV AX,DATAX MUL DATAY ;結果的高十六位保存在DX裏,低十六位保存在AX裏(5)MOV AX,DATAX MOV DX,DATAX+2MUL DWORD DATAY; ;(6)MOV AX,DATAXDIV 17H;結果商保存在AL中,余數

11、在AH中(7)MOV AX,DATAX CDWDIVDATAY21NEG DX NEG AX SBB DX,022MOV AX,A ;把雙字長數的低字放到AX中MOV DX,A+2 ;把雙字長數的高字放到DX中TEST DX,8000H ;測試雙字長數的符號JZ RIGHT ;如果是非負數,則直接保存NEG DX;如果是負數,則求補 NEG AXSBB DX,0 RIGHT: MOV B ,AX MOV B+2,DX23每條指令單獨執行完後的結果依次為:(1) 9AH (2)61H (3)0FBH (4)1CH (5)0 (6)0E3H24執行指令序列後,BX的內容為:0DAH25(1)把53

12、D乘以2的程序:MOV AX,35H ;53D=35HSHL AX ,1(2)把53除以2 的程序:MOV AX,35HSHR AX,1其他的同理26這段程序完成的功能是:把DX:AX中的雙字數據左移4位(相當於乘以16D)27各條指令單獨執行後,DX的值依次為:(1) 5CH (2)17H (3)05C8H (4)72H (5)2017H (6)0CDH (7)0172H (8)05CCH (9)0DCH28 該程序段執行完後,BX寄存器的內容是:C02DH29(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:LEA SI,CONAME ;把CONAME中第一个字节的偏移地

13、址送到SI中LEA DI,PRLINE ;把PRLINE中第一个字节 的偏移地址送到DI中MOV CX,20 ;把重复次数放到CX里CLD ;让SI DI从低地址指向高地址(即从左到右传送)REP MOVSB ;传送(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:LEA SI ,CONAMELEA DI,PRLINEMOV CX,20STD;和上面唯一不同的就是这次是从右到左,所以要从高地址指向低地址REP MOVSB(3)把CONAME中的第三和第四個字節裝入AX的程序實現:LEA SI ,CONAME+3LODSW (4)把AX寄存器的內容存入從PRLINE+5開始的

14、字節中的程序實現:LEA DI ,PRLINE+5STOSW(5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:LEA DI,CONAME ;把CONAME中第一個字符偏移地址放入DI中MOV CX,20 ;把重複次數放到CX中MOV AL,20H ;把空格符的ASCII值放入AL中CLD ;从低到高REPNE SCASB ;比較MOV BH,DI-1R;把檢查到的空格符送到BH中30MOV CX,12H;把重複次數放到CX中。這裏用十六進制表示 MOV SI,0 ;初始化SIMOV AX,26H ;把&字符的ASCII值放入AXCHECK: CMP AX,STRI

15、NGSI ;依次查找INC SILOOPNE CHECK ;找到了就退出MOV AX,20H ;把空格符的ASCII值勤放入AX中MOV STRINGSI-1,AX ;用空格符代替&31。(1)用空格符清除PRINT_LINE域的程序实现:MOV AL,20HLEA DI ,PRINT_LINEMOV CX,132CLD REP STOSB(2)在STUDENT_ADDR中查找 第一个_的程序实现:MOV AX,2DH ;把“”的ASCII值放入AXMOV SI,0 ;初始化SIMOV CX,9 ;把重複次數放入CX中;依次檢查STUDENT-ADDR中的字符是否為_,找到第一个停下来CHEC

16、K:CMP AX ,STUDENT_ADDRSI ;INC SI; LOOPNZ CHECK;(3)在STUDENT_ADDR中查找最后一个”_“的程序实现:;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9MOV AX,2DH;MOV SI ,9;MOV CX,9;CHECK :CMP AX,STUDENT_ADDRSIDEC SI;LOOPNZ CHECK;(4)程序實現:MOV AL,2OH ;把空格符的ASCII值放入AL中LEA DI ,STUDENT_NAME ;把STUDENT_NAME中第一个字符偏移地址放到DI中MOV CX,30 ;把重复次数放到CX中CLD ;让

17、DI从低位移到高位REPZ SCASB ;如果有不是空格符的,就退出JZ STORE ;如果全是空格符,就转到STORE中;用*代替空格STORE:MOV AL 2AHMOV CX ,30STD ;注意,这里是把前面从低到高移动的DI再从高到低移上去REP STOSB(5)程序实现:;把STUDENT_NAME 移到PRINT_LINE的前30个字节中LEA SI, STUDENT_NAME LEA DI,PRINT_LINEMOV CX ,30CLD REP MOVSB;把STUDENT_ADDR移到PRINT_LINE的后9个字节中LEA SI ,STUDENT_ADDR+9LEA DI,

18、PRINT_LINE+132MOV CX,9STD REP MOVSB32程序实现: 。LEA SI,OLDSLEA DI,NEWSMOV CX,5REPZ CMPSBJNZ NEW_LESS 。33(1)CMP DX,CX JAEXCEED(2)CMP BX,AX JG EXCEED(3)CMP CX,0 JZ ZERO(4)CMP BX,AX JO OVERFLOW(5)CMP BX,AX JLE EQ_SMA(6) CMP DX,CX JBE EQ_CX34(1)跳转到:L1 (2)跳转到L1 (3)跳转到L2 (4)跳转到L5 (5)跳转到L535(1)可以引起转移到L1的指令有: N

19、B ,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 程序流程图就不画了,程序如下MOV AL,STAUSSI ;把要测试的字节放到AL中AND AL,2AH ;把第一,三,五位为一其他位为0的数-2AH,与这个字节比较,结果放到AL中JZ ROUTINE_4;如果结果为0,则三位都为0XOR AL,2AH ; 前面相与

20、的结果再与2AH异或JZ ROUTINE_1 ;如果结果为0,则三位都为1BSF BL,AL ;BSR BL ,ALCMP BL,CL;如果向前和向后测试后,第一个1 的位置相同,说明只有一个1,则异或运算前有AL中有两个1JE ROUTINE_2ROUTINE_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)=0

21、4 (BX)=11 (CX)=01 (DX)=0第四章答案1。下列指令的错误(1) MOV AH,BX 源操作数与目的操作数长度不相同(2) MOV BX,SI 这是两个内存单元在传递数据,而这在汇编语言中是不允许的(3) MOV AX,SIDI 不能用两个变址连用,其中一个应为基址(4) MOV MYDATBXSI,ES:AX 同(2)(5) MOV BYTE PTRBX,1000 必须有一个为寄存器(6)MOV BX,OFFSET MYDATSI OFFSET 不能与复杂操作数相连(7)MOV CS,AX 不能对CS赋值(8)MOV ECX,AX 操作数类型不同2。(1)合法 (2)非法

22、(3)非法 (4)非法3。(1)非法,操作数类型不同 (2)合法(3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?呵 (4)合法 (5)合法 (6)合法 (7) 非法,必须有一个寄存器把CPU放哪了? (8)非法,两个内存单元地址相加没有意义 (9)合法 (10)非法,同(3)4。(1)两内存单元传递数据 (2)操作数类型不同 (3)跳转指令只能跳转到符号地址 (4)转移指令后不能为变量,只能为标号 (5)格式不对, 应为 NEAR PTR 。5。图,就不画了6。(1)DW 5150H(2)MOV AX,5150H MOV ADDRESS ,AX ;等,写出几个就可以7。DAT

23、ASG SEGMENT FLD1B DB personal computer FLD2B DB 10 DUP (32) FLD3B DB 20HFLD4B DB 01011001BFLD5B DB 32654FLD6B DB 10 DUP (0)FLD7B DB PART1,DUP 20 (?),PART2,DUP 50 (?),PART3,DUP 14 (?)FLD1W DW 0FFF0HFLD2W DW 01011001BFLD3W DW FLD7BFLD4W DW 5,6,7,8,9FLD5W DW 5 DUP (0)FLD6W DW (FLD6W-FLD1W)-(FLD7B-FLD1B

24、)8。PLENTH 的值为22,GE表示该数据段的长度9。L的值为710。(1)MOV AX,OFFSET LNAME (2)MOV SI,WORD PTR CODE_LIST (3)CODE_LENGHT EQU $-CODE_LIST11。代码如下:DATA_SEG SEGMENT DB 5 DATA_LIST DW0FFFFH,0,2,5,4, 5 DUP (?)DATA_SEG ENDSCODE_SEG SEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGMOV AX,5MOV MAX,AXMOV AX,0FFFFHMOV MIN,AXCODE_SEG ENDS12

25、。(1)10025 (2)19 (3)2548 (4)3 (5)103 (6)0FFFFH (7)1 (8)313。分别汇编成为:MOV AX,0AHMOV BL,0AHMOV CL,114。(1)(AX)=1 (2)(AX)=2 (3)(CX)=14H (4)(DX)=32H (5)(CX)=115。(1)操作符错误 改为: DATA_SEG SEGMENT (2)缺少段名 在前面加个段名 (3)引用应该从;开始 把那个“/”改成“;” (4)结构混乱 改为: MAIN_PROC PROC FAR 。MAIN_PROC ENDPEND 16。程序框架如下:DATA_SEG SEGMENT ;

26、定義數據段ORG 0E000H ;讓下一字節地址為0E000HFIRST_TYPE EQU THIS WORD;建立一個與下一存儲單元有相同段地址和偏移地址的操作數DATA_GROUP DB 100 DUP(?) ;給DATA_GROUP 分配100個字節的空間DATA_SEG ENDS ;數據段結束STACK_SEG SEGMENT ;定義堆棧段ALIGN 16 ;讓下一字節從小段首地址開始STACK DB 100 DUP (?) ;為堆棧分配空間STACK_SEG ENDS ;CODE_SEG SEGMENTASSUME CS:CODE_SEG,DS:DATA_SEG ,SS:STACK_

27、SEGORG 1000H;讓下條指令的第一個字節從1000H開始START : MOV AX,DATA_SEG MOV DS,AX MOV AX,STACK_SEG MOV SS,AX .CODE_SEG ENDSEND START ;結束17。程序如下:D_SEG SEGMENT ;数据段定义AUGEND DD 99251D_SEG ENDSE_SEG SEGMENT ;附加段定义ADDEND DD -15926E_SEG ENDSC_SEG SEGMENT ;代码段定义ASSUME CS:C_SEG, DS:D_SEG,ES:E_SEGSTART: MOV AX,D_SEG第五章答案5.1

28、 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.model small.stack 100H.codemain proc farStart:push dxmov ax,0push axmov ah,01Hint 21Hcmp al,61Hjl lop1cmp al,7BHjge lop1sub al,20Hmov dl,allop1:mov ah,2int 21HretEnd start5.2 编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符.model small.386.codeMAIN PROC FARstart:push

29、 dssub ax,axpush axinput:mov ah,7Hint 21Hcmpe:cmp al,20HJE exitcmp al,61HJL inputcmp al,7AHJG inputprint:sub al,01Hmov dl,almov ah,02Hint 21Hadd al,01Hmov dl,almov ah,02Hint 21Hadd al,01Hmov dl,almov ah,02Hint 21H;输出换行回车mov dl,0AHmov ah,02Hint 21Hjmp inputexit :retMAIN ENDPEND start5.3 将AX寄存器中的16位数分

30、成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。.model small.datax DB 4 dup(?).stack 100H.codeMAIN PROC FARstart:push dsand ax,00Hpush axmov ax,1234Hmov cx,04Hmov si,00Hlop:push cxmov cl,04Hrol ax,clpush axand al,0FHmov BYTE PTR xsi,alpop axpop cxadd si,2Loop lopmov al,Xmov bl,X+2mov cl,X+4mov dl,X+6print:mov ah,0

31、2Hint 21Hmov dl,almov ah,02Hint 21Hmov dl,blmov ah,02Hint 21Hmov dl,clmov ah,02Hint 21Hexit:retMAIN ENDPEND start5.4 编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示MATCH,若不同在显示:NO MATCH。.model small.dataSTRING1 DB I must study hardSTRING2 DB I must study hardX DB MATCH .$Y DB NO MATCH.$.stack 100H.co

32、demain proc farStart:push dxmov ax,0push axmov ax,datamov ds,axmov es,axlea si,STRING1lea di,STRING2cldmov cx,(string2-string1)/ type STRING2retEnd start5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。model small.codemain proc farstart:push dssub ax,axpush axinput: mov ah,01H int 21H cmp al

33、,20H je exit cmp al,30H jle input cmp al,3AH jge input sub al,30H mov cx,ax and cx,0FFHlop: mov dl,07H mov ah,2H int 21H loop lop jmp inputexit : retmain endpend start5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。.model small.386.dataM DB 1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10P DB 20 dup(?)N DB 20 dup(?).codeMAIN PROC FARstart:PUSH dsAND ax,0PUSH axMOV ax,datamov ds,axMOV bx,0MOV si,0MOV di,0MOV cx,20Dcmpe :CMP Mbx,0JL ifLow

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1