资源描述
.wd.IBM-PC汇编语言程序设计第二版课后习题答案清华大学出版社沈美明,温冬蝉著第二章1.解答:有256个2.解答:如以以下图.第一个络子为000B0H字单元,注意,是字单元,第五个格子为000B3H字单元E51E3C2A3.解答: 30022H字节单元内容: ABH 30024H字节单元内容: EFH 30021H字单元内容: AB34H 30022H字单元内容: CDABH4.解答: 这三个物理地址都是3017AH,说明了不同的段地址和偏移地址对应同一物理地址5.解答: CS+IP 第一个字的物理地址为: 0AAA40H6.解答:条件标志OF,SF,ZF,CF,的值依次为:0,0,0,07.以下操作可使用那些存放器1加法和减法 AX,BX,CX,DX,当然,还有这几个通用存放器的上下位了,如AH ,AL等2循环计数CX3乘法和除法DX,AX,AH,AL4保存段地址 CS ,DS,ES,SS5表示运算结果为O FLAGS6将要执行的指令地址 IP (7) 将要从堆栈取出数据的地址 BP,SP,SS8.可以用来指示存储器地址的存放器有: BX,SP,BP,DI,CS,DS,SI,ES,SS,IP9.一一对应;5-A 4-B 2-C 3-D 12-E 9-F 11-G 10-H 13-I 8-J 7-K 6-L 1-M 15-N 14-O第三章 1.1立即寻址 没有2直接寻址 7237H3使用BX的存放器寻址没有4使用BX的间接寻址637DH5使用BX的存放器相对寻址0D5B4H(6)基址变址寻址 8E18H7相对基址变址 004FH2.根据以下要求,写出相应的汇编指令。1ADD DX,BX(2) ADD AL,BXSI(3)ADD BX0B2H, CX(4) MOV AX,2A59H ADD 0524H ,AX(5) ADD AL ,0B5H3.1存放器间接寻址 MOV BX,OFFSET BLOCK0AH MOV DX ,BX2存放器相对寻址 MOV SI,OAH MOV 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存放器的内容。1MOV AX,1200H 1200H(2) MOV AX,BX0100H(3) MOV AX,12004C2AH 注意,是字单元!4MOV AX,BX 3412H同上5MOV 1100BX 4C2AH(6) MOV AX,BXSI7856H(7) MOV AX,1100BXSI 65B7H5.1 7CD9H(2)0600H (3)098AH6. MOV BX,2000H LESDI,BX MOV AX, ES:DI7.转向地址OBJ的值分别为:1064DH (2)0691H (3)05E0H 注意有符号数的符号位8. 1MOV AX,0ABH 立即数寻址 无物理地址 2MOV AX,BX存放器寻址 同上3MOV AX,100直接寻址 20100H 4MOV AX,VAL 直接寻址 20050H (5) MOV AX,BX存放器间接寻址 20100H (6) MOV AX,ES:BX直接寻址 21100H (7) MOV AX,BP 存放器间接寻址 20010H8MOV AX,SI 同上 200A0H (9) MOV AX,BX+10 存放器相对寻址 20110H10MOV AX,VALBX同上 20150H (11) MOV AX,BXSI基址变址寻址 201A0H (12) MOV AX,VALBXSI相对基相变址寻址 201F0H9.1的指令: MOV AX, BX0CH MOV ZREO ,AX(2)的指令:MOV AX,ARRAYBXMOV ZREO,AX10. MOV AX,TABLE 是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234HLEA AX,TABLE 是把符号地址TABLE 的有效地址这里是偏移量送到指定存放器AX里,指令执行完后,AX=0032H11.执行完指令后,AX=1E00H12. LEA AX,CSTRING MOV DL,AX MOV DH,AX+613.课本上P51-P5314. LES BX,2000MOV AX,ES:BX一条指令的话为MOV AX,ES:8000H 15.运算结果 SF,ZF,CF,OF各位的值从左至右依次往下(174D4H0 0 00(2) A5C1H10 0 1(3)4240H0 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,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 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 00ROL AX,CL 2341H 10 0DEC AX 2340H10 0MOV CX,4 2340H10 0MUL CX 8918H 00 0INT 20H程序完毕后,AX=8918H (DX)=0000H19.指令 执行完后AX的内容 执行完后CF ,SF,ZF和OF的值MOV AX,0 0 0010DEC AX FFFFH0100ADD 7FFEH 0000ADD AX,2 8000H 0101NOT AX 7FFFH 0101SUB AX,0FFFFH 8000H 1101ADD AX,8000H 0000H 1011SUBAX,1FFFFH1101AND AX,58D1H 58D1H0000SAL AX,1 B1A2H 0101SAR AX,1 D8D1H 0100NEG AX272FH 1000ROR AX,19397H 100120.1MOV AX,DATAX ADD DATAY,AX2MOV AX,DATAX ADD DATAY,AX MOV AX,DATAX+2ADD DATAY+2 ,AX3本組指令的作用是:BX -DATAX+DATAY+1(CF的值) 帶進位加法4MOV AX,DATAX MUL DATAY ;結果的高十六位保存在DX裏,低十六位保存在AX裏5MOV AX,DATAX MOV DX,DATAX+2 MUL DWORD DATAY ;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏6MOV AX,DATAXDIV 17H;結果商保存在AL中,余數在AH中7MOV AX,DATAX CDWDIVDATAY21. NEG DX NEG AX SBB DX,022.MOV 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 261H 30FBH 41CH 50 60E3H24.執行指令序列後,BX的內容為:0DAH25.1把53D乘以2的程序:MOV AX,35H ;53D=35HSHL AX ,12把53除以2 的程序:MOV AX,35HSHR AX,126.這段程序完成的功能是:把DX:AX中的雙字數據左移4位相當於乘以16D27.各條指令單獨執行後,DX的值依次為:15CH217H305C8H472H52017H60CDH70172H805CCH90DCH28. 該程序段執行完後,BX存放器的內容是:C02DH29.(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:LEA SI,CONAME ;把CONAME中第一个字节的偏移地址送到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 MOVSB3把CONAME中的第三和第四個字節裝入AX的程序實現:LEA SI ,CONAME+3LODSW 4把AX存放器的內容存入從PRLINE+5開始的字節中的程序實現:LEA DI ,PRLINE+5STOSW5檢查CONAME字符串中有無空格字符,如有把它偉送給BH存放器的程序實現:LEA DI,CONAME ;把CONAME中第一個字符偏移地址放入DI中MOV CX,20 ;把重複次數放到CX中MOV AL,20H ;把空格符的ASCII值放入AL中CLD ;從低到高REPNE SCASB ;比較MOV BH,DI-1R;把檢查到的空格符送到BH中30.MOV CX,12H;把重複次數放到CX中。這裏用十六進制表示 MOV SI,0 ;初始化SIMOV AX,26H ;把&字符的ASCII值放入AXCHECK: CMP AX,STRINGSI ;依次查找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中的字符是否為 “_,找到第一个停下来CHECK:CMP AX ,STUDENT_ADDRSI ;INC SI LOOPNZ CHECK3在STUDENT_ADDR中查找最后一个“_的程序实现:;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9MOV AX,2DHMOV SI ,9MOV CX,9CHECK :CMP AX,STUDENT_ADDRSIDEC SILOOPNZ CHECK4程序實現:MOV AL,2OH ;把空格符的ASCII值放入AL中LEA DI ,STUDENT_NAME ;把STUDENT_NAME中第一个字符偏移地址放到DI中MOV CX,30 ;把重复次数放到CX中CLD ;让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,PRINT_LINE+132MOV CX,9STD REP MOVSB32.程序实现: LEA SI,OLDSLEA DI,NEWSMOV CX,5REPZ CMPSBJNZ NEW_LESS 33.1CMP DX,CX JAEXCEED2CMP BX,AX JG EXCEED3CMP CX,0 JZ ZERO4CMP BX,AX JO OVERFLOW5CMP BX,AX JLE EQ_SMA(6) CMP DX,CX JBE EQ_CX34. (1)跳转到:L12跳转到L13跳转到L2 4跳转到L5 5跳转到L535.1可以引起转移到L1的指令有: NB ,BE ,NL ,LE2可以引起转移到L1的指令有: 同上3可以引起转移到L1的指令有:B,BE ,L , LE 4可以引起转移到L1的指令有: NB ,NBE ,NL ,NLE 5可以引起转移到L1的指令有: 同上6可以引起转移 到L1的指令有:同37可以引起转移 到L1的指令有: 同上 37.MOV AL,STAUSSI ;把要测试的字节放到AL中AND AL,2AH ;把第一,三,五位为一其他位为0的数-2AH,与这个字节对比,结果放到AL中JZ ROUTINE_4;如果结果为0,那么三位都为0XOR AL,2AH ; 前面相与的结果再与2AH异或JZ ROUTINE_1 ;如果结果为0,那么三位都为1BSF BL,AL ;BSR BL ,ALCMP BL,CL;如果向前和向后测试后,第一个1 的位置一样,说明只有一个1,那么异或运算前有AL中有两个1JE ROUTINE_2ROUTINE_138.1当括号内是:LOOP时,循环四次,程序完毕后AX=05 BX=16 CX=0 DX=02 当括号内是: LOOPE 时,不循环,程序完毕后AX=02 BX=04 CX=03 DX=023当括号内是:LOOPNE 时:循环三次,程序完毕后AX=04 BX=11 CX=01 DX=039.P10140.10000 3100H 25100H 37100H41.1目的地址:2004H 内容依次为: 56H F4H 23H 98H2目的地址: 384CH 内容依次为: 91H 34H F2H 01H 3目的地址: 存放器,无物理地址 内容依次为:92H 6DH A2H 4CH42.1PUSH AX(SP)-(SP)-2 (SP+1)-(AH) (SP)-(AL)(2)POP ESI (ESI)-(ESP)+3,(ESP)+2,(ESP)+1, (ESP) (ESP)-(ESP)+4(3)PUSH BX(SP)-(SP)-2 (SP+1)-(BX+1) (SP)-(BX)(4) PUSHAD (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)-325POP DS(DS)-(SP)+1,(SP)(SP)-(SP)+2(6) PUSH 4(SP)-(SP)-2(SP+1)-0SP-443.1 2CE FF93H 2 24B 76A0H3909 0804H4 6F 13ADH44. 10FFFF FFFCH 20FFFF FFF8H30000 0007H 40000 0099H45. EAX=0 EBX=25d46. AX=3dDX=7d47. ADD ECX,EDX ADD ECX,ESI MOV EDI ,ECX48. IMUL BX,DX,100H执行的操作是: BX-(DX)*100H49.程序实现:MOV AL,BLCBW IDIV CLIMUL 2MOV DX,AX50.JMP DI 是直接跳转,执行的操作是: IP-(IP)+(DI)JMP DI是间接跳转,执行的操作是: IP-(IP)+(DI)跳转到DI中所指向的内存单元中的指令地址51.假设数组名为NUMBERS,程序如下MOV BX,0 ;后面用到MOV CX,100H ;把循环次数放入CXMOV AL,42HMOV SI,0 ;初始化SI;CHECK 用来实现查找功能CHECK : CMP AL ,NUMBERSSIINC SIJB STORE1 ;大于42H的数的个数存入UPJA STORE2 ;小于42H的的数的个数存入DOWN中LOOP CHECK ;相等继续循环STORE1 INC BL ;找到一个大于42 的数,BL值增加1 MOV UP,BL LOOP CHECKSTORE2 INC BH MOV DOWN ,BH LOOP CHECK 第四章1.指令以下指令的错误1MOV AH,BX 源操作数与目的操作数长度不一样2MOV BX,SI 这是两个内存单元在传递数据,而这在汇编语言中是不允许的(3)MOV AX,SIDI 不能用两个变址连用,其中一个应为基址4MOV MYDATBXSI,ES:AX 同25MOV BYTE PTRBX,1000 必须有一个为存放器6MOV BX,OFFSET MYDATSI OFFSET 不能与复杂操作数相连7MOV CS,AX 不能对CS赋值8MOV ECX,AX 操作数类型不同2.1合法 2非法 3非法 4非法3.1非法,操作数类型不同 2合法 3非法,不允许两个内存单元直接传递数据4合法 5合法 6合法 7非法,必须有一个存放器 8非法,两个内存单元地址相加没有意义9合法10非法,同34.1两内存单元传递数据 2操作数类型不同 3跳转指令只能跳转到符号地址 4转移指令后不能为变量,只能为标号 5格式不对, 应为 NEAR PTR 6.1DW 5150H2MOV AX,5150H MOV ADDRESS ,AX7. DATASG 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 0FLD6W DW FLD6W-FLD1W-FLD7B-FLD1B8.PLENTH 的值为22,GE表示该数据段的长度9.L的值为710.1MOV AX,OFFSET LNAME 2MOV SI,WORD PTR CODE_LIST 3CODE_LENGHT EQU $-CODE_LIST11.代码如下:DATA_SEG SEGMENT DB 5DATA_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.1100252193254843510360FFFFH718313.分别汇编成为:MOV AX,0AHMOV BL,0AHMOV CL,114.1AX=12AX=23CX=14H4DX=32H5CX=115.1操作符错误 改为: DATA_SEG SEGMENT (2)缺少段名 在前面加个段名 3引用应该从;开场 把那个“/改成“;4构造混乱 改为: MAIN_PROC PROC FAR MAIN_PROC ENDPEND 16.程序框架如下:DATA_SEG SEGMENT ;定義數據段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_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 MOV DS,AX MOV AX,E_SEG MOV ES,AXMOV EAX,DS:AUGEND ADD EAX,ES:ADDEND MOVDS:SUM,EAXC_SEG ENDSEND START ;完毕19.需要加上PTR伪操作的有: 234第五章1.程序實現:經DEBUG調試通過code segment main proc far assume cs:codestart:mov ah,1hint 21h sub al,20h mov ah,2 mov dl,al int 21hmain endpcode endsend start2.程序實現:經DEBUG調試通過code segment assume cs:code mov ah,1hint 21h sub al,1h mov cl,3again: mov dl,al mov ah,2 int 21h inc al loop againcode endsend3.程序實現:經DEBUG調試通過code segment assume cs:code mov ax,0f0feh mov cl,4 ;把AX的最高四位 rol ax,cl ;移到最右面 and al,0fh;再把AL的高四位清0 mov dl,al rol ax,cl and al,0fh mov cl,al rol ax,cl and al,0fh mov bl,al rol ax,cl and al,0fhcode endsend4.程序實現:經DEBUG調試通過data segmentstring1 db 20,0,20 dup (?)string2 db 20,0,20 dup (?)string3 db please input string1!,$ string5 db match!,$ string6 db nomatch!,$data endscode segment MAIN PROC FAR assume cs:code, ds:datastart: push ax ;保護現場 push bx push cx push dx mov ax,datamov ds,axmov dx,offset string3 call info;在屏幕上輸出提示信息 mov dx,offset string1call input;在第一緩衝區輸入字符串 mov dx,offset string4call info;在屏幕上輸出提示信息 mov dx,offset string2call input ;在第二緩衝區輸入字符串call check;比較兩個字符串 pop dx ;存放器出棧pop cx pop bx pop axmain endp ;輸入字符串到緩衝區的過程INPUT PROC NEAR push ax mov ah,0AH int 21h pop ax retINPUT ENDP;在屏幕上輸出提示信息的過程INFO PROC NEAR push ax mov ah,9int 21h call crlf ;回車換行 pop ax retINFO ENDP;回車換行 的過程CRLF PROC NEAR push dx push ax mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2int 21h pop axpop dxretCRLF ENDP;比較兩字符串是否一样並且在屏幕上輸出相應信息的過程CHECK PROC NEAR push ax push cx push sipush di mov ax,0 mov cx,0 mov cl,string1+1 mov si,2 mov di,2re: mov al,string1di cmp al,string2si jnz no inc diinc si dec cx jnz re mov dx ,offset string5 call info jmp exitno: mov dx,offset string6 call infoexit: pop di pop sipop cx pop ax retCHECK ENDPcode endsend start5.程序實現:經DEBUG調試通過data segmentinfo1 db PLEASE INPUT A NUMBER,$;提示信息,下同info2 db WRONG NUMBER! PLEASE INPUT ANOTHER NUMBER!,$ ;如果鍵入非數字值,報錯,並提示輸入新的數字data endscode segmentMAIN PROC FARassume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,offset info1 call info ;提示輸入一個數字 call input ;輸入過程 call check ;檢查是否非數字字符 call bell ;響鈴N次,N為鍵入數字 retMAIN ENDP;在屏幕上輸出提示信息的過程INFO PROC NEAR push axmov ah,9h int 21h call crlf pop ax retINFO ENDP;回車換行的過程CRLF PROC NEARpush ax
展开阅读全文