• 149.00 KB
  • 2022-04-22 11:38:15 发布

《汇编语言程序设计》习题答案(第二版,沈美明,温冬婵,清华大学出版社).doc

  • 41页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'汇编语言程序设计(第二版)第二章1、     答:直接由指令指定的I/O端口数为256个。2、答:3、答:字节单元:(30022H)=ABH,(30024H)=EFH字单元:(30021H)=AB34H,(30022H)=CDABH。4、答:3017:000A的存储单元的物理地址是3017AH,3015:002A的存储单元的物理地址是3017AH,3010:007A的存储单元的物理地址是3017AH。5、答:该程序的第一个字的物理地址是0AAA40H。6、答:条件标志OF、SF、ZF、CF的值依次分别为0、0、0、0。7、答:(1)AX、BX、CX、DX、AH、AL、BH、BL、CH、CL、DH、DL、SP、BP、DI、SI(注意:学生尽量不要用SP参与加减运算)(2)CX(3)DX、AX、AH、AL(4)CS、DS、ES、SS(5)FLAGS(6)IP(7)SS、SP、BP8、答:可以用来指示存储器地址的寄存器有BX、SP、BP、DI、SI、IP、CS、DS、ES、SS。9、答:唯一正确的是D。第三章 1。.(1)立即寻址   没有 (2)直接寻址   7237H(3)使用BX的寄存器寻址     没有 (4)使用BX的间接寻址      637DH(5)使用BX的寄存器相对寻址     0D5F0H(6)    基址变址寻址    8E18H(7)相对基址变址     004FH41Page41of41 2。根据下列要求,写出相应的汇编指令。(1)ADD DX,BX (2)  ADDAL,[BX][SI] (3)  ADD[BX][0B2H],CX (4) MOV AX,2A59H           ADD[0524H],AX(5)ADDAL,0B5H  3。(1)寄存器间接寻址    MOVBX,OFFSET[BLOCK][0AH] MOV DX ,[BX](2)寄存器相对寻址 MOV SI,OAH MOVDX,[BLOCK][SI] (3)基址变址寻址MOVBX,BLOCK MOVSI,OAHMOVDX,[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寄存器的内容。(1)MOV   AX,1200H      1200H (2)  MOV   AX,BX     0100H  (3) MOV   AX,[1200]                                               4C2AH     注意,是字单元!!(4)MOV  AX,[BX]    3412H   同上(5)MOV  1100[BX]       4C2AH      (6)  MOV  AX,[BX][SI]   7856H   (7)  MOV AX,1100[BX][SI]      65B7H   5。(1)7CD9H    (2) 1200H    (3)6319H6。   MOV BX,2000H          LES   DI ,[BX]         MOV AX,ES:DI 7。转向地址OBJ的值分别为:(1)064DH    (2)0691H  (3)05E0H           注意有符号数的符号位~~8。(1)MOV AX,0ABH     立即数寻址     无物理地址     (2)MOV  AX,BX   寄存器寻址     同上      (3)MOV AX,[100]    直接寻址     20100H     (4)MOVAX,VAL    直接寻址     20050H      (5)  MOVAX,[BX]    寄存器间接寻址   20100H      (6)   MOV AX,ES:[BX]    直接寻址   21100H      (7)  MOVAX,[BP]     寄存器间接寻址   20010H41Page41of41      (8)MOVAX,[SI]   同上      200A0H     (9)  MOVAX,[BX+10]    寄存器相对寻址   20110H    (10)MOVAX,VAL[BX]    同上     20150H   (11)  MOVAX,[BX][SI]     基址变址寻址    201A0H   (12)  MOVAX,VAL[BX][SI]    相对基相变址寻址  201F0H 9。的指令: MOVAX,[BX][0CH]          MOV ZREO,AX (2)  的指令: MOV AX,ARRAY[BX]                  MOVZREO,AX10。 MOVAX,TABLE      是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234H      LEAAX,TABLE       是把符号地址TABLE的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H11。执行完指令后,(AX)=1E00H12。LEAAX,CSTRING           MOVDL,AX        MOVDH,[AX+6]13。这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~14。LESBX,[2000]  MOVAX,ES:[BX]    注意:一开始我写的是:MOVAX,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~ 15。 运算结果 :SF,ZF,CF,OF各位的值(从左至右依次往下~)(1)74D4H        0   0   0   0 (2) A5C1H       1    0   0   1 (3) 4240 H      0   0   1   0 (4)0000 H      0   1   1   0     16。    接上表~ (1) 5D14         0    0    0    0(2)  A870         1   0    0   1(3) D870        1    0    0    0(4)34E4     0   0    1    017。(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    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),连续减去两个数,相当于减去这两个数的和~~41Page41of41  MOV  Z,BX     ;最终结果送到Z中(3)MOVAX,W                     ;把W送到AXIMULX                            ;W*X     注意:低十六位保存在AX里,高十六位保存在DX里MOVBX,Y                      ;把Y送到BX里ADDBX,6                       ;Y+6IDIVBX       ;(W*X)/(Y+6)   注意:商保存在AX里,余数保存在DX里MOVZ,AX                       ;把商送到Z中,MOVR,DX                      ;把余数送到R中(4)MOVAX,W                   ;把W送到AX中SUBAX,X                       ;W-XCWD    ;把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,1234H      1234H    0    0     0MOVCL,4      1234H    0    0      0  ROLAX,CL   2341H         1     0     0DECAX     2340H             1     0      0  MOVCX,4     2340H          1      0      0 MULCX     8918H           0       0      0INT20H 程序结束后,(AX)=8918H    (DX)=0000H19。指令执行完后AX的内容执行完后CF,SF,ZF和OF的值MOVAX,0     0       0010DECAX      FFFFH      0100ADDAX,7FFFH    7FFEH     0000ADDAX,2    8000H        0101NOTAX    7FFFH          0101  SUB AX,0FFFFH       8000H     1101ADDAX,8000H     0000H       1011SUB  AX,1         FFFFH        1101                                                                  ANDAX,58D1H     58D1H      0000SALAX,1     B1A2H       0101SARAX,1       D8D1H      0100NEGAX         272FH      1000 RORAX,1      9397H     1001  20。(1)MOVAX,DATAX         ADDDATAY,AX(2)MOVAX,DATAX        ADDDATAY,AX       MOV AX,[DATAX+2]        ADD[DATAY+2],AX41Page41of41 (3)本组指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF的值) 带进位加法~ (4)MOV AX,DATAX         MUL DATAY             ;结果的高十六位保存在DX里,低十六位保存在AX里 (5)MOVAX,DATAX         MOVDX,[DATAX+2]         MUL DWORDDATAY    ;结果的高三十二位保存在EDX里,低三十二位保存在EAX里   ;这里所用的DWORD为一属性操作符,在第四章会学到~~ (6)MOVAX,DATAX          DIV  17H       ;结果商保存在AL中,余数在AH中 (7)MOVAX,DATAX         CDW                                            DIV  DATAY 21。NEGDX        NEGAX        SBBDX,022。MOVAX,A                            ;把双字长数的低字放到AX中MOVDX,[A+2]                      ;把双字长数的高字放到DX中TESTDX,8000H                    ;测试双字长数的符号JZ  RIGHT                              ;如果是非负数,则直接保存NEGDX                                   ;如果是负数,则求补 NEGAXSBBDX,0                              RIGHT:MOVB,AX               MOV[B+2],DX23。每条指令单独执行完后的结果依次为:(1)9AH  (2)61H (3)0FBH(4)1CH (5)0 (6)0E3H24。执行指令序列后,BX的内容为:0DAH25。(1)把53D乘以2的程序:MOVAX,35H                    ;53D=35HSHLAX,1(2)把53除以2的程序:MOVAX,35HSHRAX,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的程序实现:LEASI,CONAME       ;把CONAME中第一个字节的偏移地址送到SI中41Page41of41 LEADI,PRLINE          ;把PRLINE中第一个字节的偏移地址送到DI中MOVCX,20                ;把重复次数放到CX里CLD                             ;让SIDI从低地址指向高地址(即从左到右传送)REP MOVSB                ;传送(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:LEASI,CONAMELEADI,PRLINEMOVCX,20STD                              ;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址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,[DI-1]R                       ;把检查到的空格符送到BH中30。MOVCX,12H                            ;把重复次数放到CX中。这里用十六进制表示  MOVSI,0                                ;初始化SIMOVAX,26H                          ;把&字符的ASCII值放入AXCHECK:CMPAX,STRING[SI]  ;依次查找INCSILOOPNE CHECK                          ;找到了就退出MOVAX,20H                              ;把空格符的ASCII值勤放入AX中MOVSTRING[SI-1],AX               ;用空格符代替&31。(1)用空格符清除PRINT_LINE域的程序实现:MOVAL,20HLEADI,PRINT_LINEMOV CX,132CLDREPSTOSB(2)在STUDENT_ADDR中查找第一个’_‘的程序实现:MOVAX,2DH                                           ;把“—”的ASCII值放入AX MOVSI,0                                                 ;初始化SIMOVCX,9                                               ;把重复次数放入CX中;依次检查STUDENT-ADDR中的字符是否为"_",找到第一个停下来41Page41of41 CHECK:CMPAX,STUDENT_ADDR[SI] ;INCSILOOPNZCHECK (3)在STUDENT_ADDR中查找最后一个”_“的程序实现:;和第二题不同的就是这次是从右到左查询,所以SI的初始化为9MOVAX,2DHMOVSI,9MOVCX,9CHECK:CMPAX,STUDENT_ADDR[SI]DECSILOOPNZCHECK(4)程序实现:MOVAL,2OH                          ;把空格符的ASCII值放入AL中LEADI,STUDENT_NAME        ;把STUDENT_NAME中第一个字符偏移地址放到DI中MOVCX,30                              ;把重复次数放到CX中CLD                                         ;让DI从低位移到高位REPZSCASB                            ;如果有不是空格符的,就退出JZ STORE                               ;如果全是空格符,就转到STORE中;用*代替空格STORE:MOVAL2AHMOVCX,30STD                                ;注意,这里是把前面从低到高移动的DI再从高到低移上去~~REPSTOSB(5)程序实现:;把STUDENT_NAME移到PRINT_LINE的前30个字节中LEASI,STUDENT_NAMELEADI,PRINT_LINEMOVCX,30CLDREPMOVSB;把STUDENT_ADDR移到PRINT_LINE的后9个字节中LEASI,[STUDENT_ADDR+9]LEADI,[PRINT_LINE+132]MOVCX,9STDREPMOVSB32。程序实现:   。。。LEA SI,OLDSLEADI,NEWSMOVCX,5REPZ CMPSBJNZ NEW_LESS41Page41of41     。。。33。(1)CMP DX,CX       JA       EXCEED(2)CMPBX,AX      JG  EXCEED (3)CMPCX,0     JZ ZERO(4)CMPBX,AX        JO OVERFLOW(5)CMPBX,AX        JLE EQ_SMA(6)   CMPDX,CX      JBE  EQ_CX34。(1)跳转到:L1      (2)跳转到L1        (3)跳转到L2       (4)跳转到L5       (5)跳转到L535。(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,则三位都为0XORAL,2AH                          ;前面相与的结果再与2AH异或JZROUTINE_1                      ;如果结果为0,则三位都为1BSFBL,AL                            ;BSRBL,ALCMPBL,CL;如果向前和向后测试后,第一个1的位置相同,说明只有一个1,则异或运算前有AL中有两个1JEROUTINE_2ROUTINE_1注:本题还有其他解法,请大家自己试试~~41Page41of41 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)=0IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案39--5239。图,就不画了,呵呵~~自己看一下课本,P101~~40.。(1)00003100H  (2)5100H   (3)7100H41。(1)目的地址:2004H 内容依次为:56H F4H  23H   98H       (2)目的地址:384CH   内容依次为:91H 34H  F2H   01H      (3)目的地址:  寄存器,无物理地址~    内容依次为:92H  6DH  A2H 4CH42。 (1)PUSHAX  (SP)<------(SP)-2      (SP+1)<-----(AH)   (SP)<------(AL)(2)POPESI    (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)-32(5)POPDS(DS)<------((SP)+1,(SP))(SP)<------(SP)+2(6)PUSH4(SP)<-------(SP)-2(SP+1)<-----0(SP)<------4 43。(1)   2CEFF93H      (2)24B 76A0H         (3)9090804H           (4) 6F13ADH44。(1)0FFFFFFFCH           (2)0FFFFFFF8H       (3)0000 0007H                 (4)0000 0099H45。(EAX)=0    (EBX)=25d46。(AX)=3d       (DX)=7d47。ADDECX,EDX       ADDECX,ESI      MOV EDI ,ECX48。IMULBX,DX,100H执行的操作是:   (BX)<-------(DX)*100H49。程序实现:41Page41of41 MOVAL,BLCBWIDIV CLIMUL2MOVDX,AX50。 JMPDI是直接跳转,执行的操作是:(IP)<-----(IP)+(DI)JMP[DI]是间接跳转,执行的操作是:  (IP)<----(IP)+([DI])跳转到DI中所指向的内存单元中的指令地址~51。假设数组名为NUMBERS,程序如下~MOVBX,0            ;后面用到~MOVCX,100H     ;把循环次数放入CXMOVAL,42HMOVSI,0           ;初始化SI;CHECK用来实现查找功能~CHECK: CMPAL,NUMBERS[SI]INCSIJB STORE1        ;大于42H的数的个数存入UPJA STORE2        ;小于42H的的数的个数存入DOWN中~LOOPCHECK     ;相等继续循环~STORE1    INC BL  ;找到一个大于42的数,BL值增加1~                  MOVUP,BL                 LOOPCHECKSTORE2    INCBH                      MOVDOWN,BH                LOOPCHECK 52。图,也不用画了~~呵呵~好了,本章结束第四章1。指令下列指令的错误(1)MOVAH,BX    源操作数与目的操作数长度不相同~(2) MOV[BX],[SI]  这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~ (3)    MOVAX,[SI][DI]   不能用两个变址连用,其中一个应为基址~(4)MOVMYDAT[BX][SI],ES:AX    同(2)(5)MOVBYTEPTR[BX],1000 必须有一个为寄存器(6)MOVBX,OFFSETMYDAT[SI]    OFFSET不能与复杂操作数相连~(7)MOVCS,AX   不能对CS赋值~(8)MOVECX,AX    操作数类型不同~2。(1)合法  (2)非法   (3)非法  (4)非法3。(1)非法,操作数类型不同     (2)合法     (3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~      (4)合法~    (5)合法~41Page41of41    (6)合法 (7)非法~,必须有一个寄存器~~把CPU放哪了?~~ (8)非法,两个内存单元地址相加没有意义~  (9)合法  (10)非法,同(3) 4。(1)两内存单元传递数据    (2)操作数类型不同    (3)跳转指令只能跳转到符号地址    (4)转移指令后不能为变量,只能为标号    (5)格式不对, 应为  NEARPTR。。。5。图,就不画了~~6。(1)DW 5150H(2)MOVAX,5150H        MOV ADDRESS  ,AX等,写出几个就可以~~7。DATASG   SEGMENT   FLD1B DB  "personalcomputer"  FLD2B  DB 10DUP(32) FLD3B   DB 20H FLD4B   DB 01011001B FLD5B DB "32654" FLD6B DB 10DUP(0) FLD7B  DB "PART1",DUP20 (?),"PART2",DUP50(?),"PART3",DUP14(?)FLD1W  DW 0FFF0HFLD2W  DW 01011001BFLD3W DW  FLD7BFLD4W  DW   5,6,7,8,9FLD5W  DW 5DUP(0)FLD6W DW   (FLD6W-FLD1W)-(FLD7B-FLD1B)8。PLENTH的值为22,GE表示该数据段的长度~9。L的值为710。(1)MOVAX,OFFSET LNAME       (2)MOVSI,WORDPTRCODE_LIST        (3)CODE_LENGHT  EQU  $-CODE_LIST11。代码如下:DATA_SEG SEGMENT  DB 5 DATA_LIST DW 0FFFFH,0,2,5,4,5DUP(?)DATA_SEG ENDSCODE_SEG SEGMENTASSUME CS:CODE_SEG,DS:DATA_SEGMOVAX,5MOVMAX,AXMOVAX,0FFFFHMOVMIN,AX CODE_SEG  ENDS12。(1)10025  (2)19  (3)2548   (4)341Page41of41    (5)103   (6)0FFFFH   (7)1    (8)3 13。分别汇编成为:MOVAX,0AHMOVBL,0AHMOV CL,114。(1)(AX)=1    (2)(AX)=2   (3)(CX)=14H (4)(DX)=32H  (5)(CX)=1]15。(1)操作符错误    改为: DATA_SEG  SEGMENT     (2)缺少段名       在前面加个段名   (3)引用应该从;开始      把那个“/”改成“;”   (4)结构混乱  改为:  MAIN_PROCPROCFAR     。。。。MAIN_PROC   ENDPEND  16。程序框架如下:DATA_SEG  SEGMENT                             ;定义数据段ORG0E000H                                              ;让下一字节地址为0E000HFIRST_TYPE EQUTHISWORD          ;建立一个与下一存储单元有相同段地址和偏移地址的操作数DATA_GROUPDB100DUP(?)                 ;给DATA_GROUP分配100个字节的空间DATA_SEG ENDS                                      ;数据段结束STACK_SEG SEGMENT                           ;定义堆栈段ALIGN16                                                     ;让下一字节从小段首地址开始STACKDB100DUP(?)                               ;为堆栈分配空间STACK_SEG  ENDS                                     ;CODE_SEGSEGMENTASSUME CS:CODE_SEG ,DS:DATA_SEG,SS:STACK_SEGORG1000H                                                     ;让下条指令的第一个字节从1000H开始START: MOVAX,DATA_SEG               MOVDS,AX             MOVAX,STACK_SEG               MOVSS,AX             .......CODE_SEG ENDSENDSTART                                                  ;结束~17。程序如下:D_SEG   SEGMENT                              ;数据段定义 AUGEND  DD 99251D_SEG ENDSE_SEG SEGMENT                                   ;附加段定义ADDEND DD-1592641Page41of41 E_SEG  ENDSC_SEG   SEGMENT                                  ;代码段定义ASSUME  CS:C_SEG , DS:D_SEG,ES:E_SEGSTART: MOVAX,D_SEG              MOVDS,AX              MOVAX,E_SEG              MOVES,AX              MOVEAX,DS:AUGEND            ADDEAX,ES:ADDEND             MOV  DS:SUM,EAXC_SEG ENDSEND START                                            ;结束18。 19。需要加上PTR伪操作的有: (2)(3)(4)第五章5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart: pushdx movax,0 pushax  movah,01H int21H  cmpal,61H  jllop1  cmpal,7BH jgelop1  subal,20H movdl,al  lop1:movah,2 int21H  retEndstart41Page41of41 5.2编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符..modelsmall.386.codeMAINPROCFARstart: pushds subax,ax pushax input: movah,7H int21Hcmpe:  cmpal,20H JE exit  cmpal,61H JL input  cmpal,7AH JG inputprint: subal,01H movdl,al movah,02H int21H  addal,01H movdl,al movah,02H int21H  addal,01H movdl,al movah,02H int21H  ;输出换行回车 movdl,0AH movah,02H int21H41Page41of41  jmpinputexit: retMAINENDPENDstart5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。.modelsmall.dataxDB4dup(?).stack100H.codeMAINPROCFARstart: pushds andax,00H pushax  movax,1234H  movcx,04H movsi,00Hlop: pushcx mov cl,04H rolax,cl pushax andal,0FH movBYTEPTRx[si],al popax popcx addsi,2 Looplop moval,[X] movbl,[X+2] movcl,[X+4] movdl,[X+6]print: movah,02H int21H  movdl,al movah,02H int41Page41of41 21H  movdl,bl movah,02H int21H movdl,cl movah,02H int21Hexit: retMAINENDPENDstart5.4编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NOMATCH"。.modelsmall.dataSTRING1DB"Imuststudyhard"STRING2DB"Imuststudyhard"X      DB"MATCH.$"Y      DB"NOMATCH.$".stack100H.codemainprocfarStart: pushdx movax,0 pushax  movax,@data movds,ax moves,ax  leasi,STRING1 leadi,STRING2 cld  movcx,(string2-string1)/typeSTRING2 retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。modelsmall.codemainproc41Page41of41 farstart: pushds subax,ax pushaxinput:        movah,01H        int21H        cmpal,20H        je exit        cmpal,30H        jleinput        cmpal,3AH        jgeinput        subal,30H        movcx,ax        andcx,0FFHlop:        movdl,07H        movah,2H        int21H        looplop        jmpinputexit:        retmainendpendstart5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。.modelsmall.386.dataMDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10PDB20dup(?)NDB20dup(?).codeMAINPROCFARstart:  PUSHds  AND ax,0  PUSHax    MOV ax,@data  mov ds,ax  MOV 41Page41of41 bx,0  MOV si,0  MOV di,0  MOV cx,20D  cmpe :  CMP M[bx],0  JL ifLowhight:  MOV al,byteptrM[bx]  MOV byteptrP[si],al  inc si  JMP commonContrlifLow:  MOV al,byteptrM[bx]  MOV byteptrN[di],al  INC dicommonContrl:  INC bx  loopcmpe  mov ax,si  callshowNumber  callprintCR  mov ax,di  callshowNumberexit: retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOV dx,ax  MOV cl,2Hshow:  ROL dl,4H  pushdx  AND dl,0fH  ADD dl,30H  MOV ah,02H  int 21H  pop dx  loopshow  retshowNumber41Page41of41 ENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;printCRPROCNEAR  movdl,0aH  movah,02H  int21H  movdl,0dH  movah,02H  int21H  retprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。    此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....dataaresegmentDATADW3322H,4555H,200H,3544H,1245Hnum DB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dataareMAINPROCFARstart:  pushds  mov ax,0H  pushax    mov ax,dataare  mov ds,ax  mov dx,0H              ;偶数数量计数  mov cx,Wordptr[num]  mov si,0HisO:  mov bx,WORDPTRDATA[si]  shr bx,1H  jnc addDX  jmp commonControladdDX:  ADD dx,1H  cmp dx,1H  je  firstAXValuecompare:  mov bx,WORDPTRDATA[si]  cmp bx,ax  jge commonControl  mov 41Page41of41 ax,bxcommonControl:  ADD si,2H  loopisO  jmp exitfirstAXvalue:  movax,WORDPTRDATA[si]  jmpcompareexit:  retMAINENDPcodeendsENDstart5.8没有做。。5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。.modelsmall.386.codemainprocfarstart: pushds mov ax,0 pushax  mov ax,0 mov cx,4 mov dx,0input: mov ah,1H int 21H cmp al,30H jl  input   cmp al,39H   jle s cmp al,61H jl  input cmp al,66H jg  input sub al,27Hs: sub al,30H add dl,al cmp cx,1H je  f rol 41Page41of41 dx,4 f: loopinputexit: callprint retmainendpprintprocnear movcx,10Hp:            rol dx,1 pushdx and dx,1 add dx,30H mov ah,2 int 21H pop dx looppretprintendpendstart 5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUNXXXX"显示出次数。.modelsmall.386.data ENG    db"SUN"sSUNJAVA",24H ;;;;24H=$ MESSAGEdb"SUN:","$".stack100H.codeMAINPROCFARstart:  PUSHDS  AND AX,0  PUSHAX    MOV AX,@data  MOV DS,AX  ;------------------------  MOV AX,0H  MOV SI,1HsubSI1:  SUB 41Page41of41 SI,1HsubSI2:  SUB SI,1HcompareS:  ADD SI,1H  MOV DL,ENG[SI]  CMP DL,24H  JE  print  CMP DL,53H  JNE compareScompareU:  ADD SI,1H  MOV DL,ENG[SI]  CMP DL,55H  JNE subSI2compareN:  ADD SI,1H  MOV DL,ENG[SI]  CMP DL,4EH  JNE subSI1  INC AX  JMP comparesprint:  LEA DX,MESSAGE  PUSHAX  MOV AH,09H  INT 21H  POP AX  callshowNumberexit:  retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOV dx,ax  MOV cl,4Hshow:  ROL dx,4H  pushdx  AND dx,0fH  ADD dx,30H  MOV ah,02H  int 41Page41of41 21H  pop dx  loopshow  retshowNumberENDPENDstart 5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。.modelsmall.386.codeMAINPROCFARstart:  pushds  mov ax,0  pushax    mov cx,0input:  mov ah,1H  int 21Hcompare:  cmp al,24H  je  print  cmp al,30H  jl  addCount  cmp al,39H  jg  addCountaddCount:  add ax,1H  jmp inputprint:  callshowNumberexit: retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOV dx,ax  MOV cl,2Hshow:  ROL dl,4H  pushdx  AND 41Page41of41 dl,0fH  ADD dl,30H  MOV ah,02H  int 21H  pop dx  loopshow  retshowNumberENDPENDstart5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。.modelsmall.386.stack100H.datamemdw12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2.codeMAINPROCFARstart:  pushds  and ax,0  pushax    mov ax,@data  mov ds,ax;----------------------  mov ax,0H  mov bx,64H  mov cx,64H  mov si,0FFFEHrepeat:  ADD si,2H  cmp MEM[si],0H  JE  calls  looprepeatcalls:  INC ax  callsort  cmp ax,1H  JE  lastValue  DEC cx  jmp 41Page41of41 repeatexit:  retlastValue:  mov mem[bx],0H  DEC cx  jmp repeat  MAINENDPsortPROCNEAR pushcx pushsi sub si,2Hs: add si,2H mov dx,mem[si] mov mem[si+2],dx loopsreturn: popsi popcx retsortENDPENDstart第六章2、答:(1)NAME1NAMELIST<>(2)MOVAX,DATA;假设结构变量NAME1定义在数据段DATA中MOVDS,AXMOVES,AX;MOVAH,10LEADX,NAME1INT21H;MOVCL,NAME1.ACTLENMOVCH,0LEASI,NAME1.NAMEINLEADI,DISPFILECLDREPMOVSB6、答:SKIPLINESPROCNEARPUSHCX41Page41of41 PUSHDXMOVCX,AXNEXT:MOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HLOOPNEXTPOPDXPOPCXRETSKIPLINESENDP7、答:dsegsegmentnumdw76,69,84,90,73,88,99,63,100,80ndw10s6dw0s7dw0s8dw0s9dw0s10dw0dsegendscodesegmentmainprocfarassumecs:code,ds:dsegstart:pushdssubax,axpushaxmovax,dsegmovds,axcallsub1retmainendpsub1procnearpushaxpushbxpushcx41Page41of41 pushsimovsi,0movcx,nnext:movax,num[si]movbx,10divblmovbl,alcbwsubbx,6salbx,1incs6[bx]addsi,2loopnextpopsipopcxpopbxpopaxretsub1endpcodeendsendstart8、答:datasegmentmaxlendb40ndb?tabledb40dup(?)chardb"a";查找字符’a’evenaddrdw3dup(?)dataendscodesegmentassumecs:code,ds:datamainprocfarstart:pushdsmovax,0pushaxmovax,datamovds,ax41Page41of41 leadx,maxlenmovah,0ahint21h;从键盘接收字符串movaddr,offsettablemovaddr+2,offsetnmovaddr+4,offsetcharmovbx,offsetaddr;通过地址表传送变量地址callcount;计算CHAR的出现次数calldisplay;显示retmainendpcountprocnear;count子程序pushsipushdipushaxpushcxmovdi,[bx]movsi,[bx+2]movcl,byteptr[si]movch,0movsi,[bx+4]moval,byteptr[si]movbx,0again:cmpal,byteptr[di]jnel1incbxl1:incdiloopagainpopcxpopaxpopdipopsiretcountendp41Page41of41 displayprocnear;display子程序callcrlf;显示回车和换行movdl,charmovah,2int21hmovdl,20hmovah,2int21hmoval,blandal,0fhaddal,30hcmpal,3ahjlprintaddal,7print:movdl,alint21hcallcrlfretdisplayendpcrlfprocnear;crlf子程序movdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendpcodeendsendstart第七章1、     答:CLRBMACRON,ARRAYCLDMOVCX,NMOVAL,20HLEADI,ARRAYREPSTOSBENDM41Page41of41 2、答:WAGESMACRORATE,HOURMOVAL,RATEMOVBL,HOURMULBL;计算周工资;ADDAX,AXADDAX,AX;一个月有4周MOVWAG,AX;暂存中间结果ADDBL,BLADDBL,BL;计算月出工小时数MOVAL,BLMOVAH,0MOVBL,10DIVBLMOVBL,3MULBL;计算奖金ADDWAG,AX;计算工资总数ENDM宏展开:1MOVAL,R11MOVBL,421MULBL1ADDAX,AX1ADDAX,AX1MOVWAG,AX1ADDBL,BL1ADDBL,BL1MOVAL,BL1MOVAH,01MOVBL,101DIVBL1MOVBL,31MULBL1ADDWAG,AX3、答:(1)调用有效1PUSHAX2MOVAX,P141Page41of41 2SUBAX,P21CMPAX,01JGE??00001NEGAX1??0000:MOVDISTANCE,AX1POPAX(2)调用有效1PUSHAX2MOVAX,[BX]2SUBAX,[SI]1CMPAX,01JGE??00011NEGAX1??0001:MOVX[DI],AX1POPAX(3)调用无效,有错误指令1??0002:MOV240H,AX(4)调用有效,但无意义宏展开略。4、答:SENDMACROSCHARS,DCHARSLOCALNEXT,EXITPUSHAXPUSHSIMOVSI,0NEXT:MOVAL,SCHARS[SI]MOVDCHARS[SI],ALCMPAL,24HJZEXITINCSIJMPNEXTEXIT:POPSIPOPAXENDM5、答:BIN_SUBMACROOPERAND,COUNT,RESULTLOCALNEXTLEABX,OPERANDMOVCX,COUNTDECCXMOVAL,[BX]41Page41of41 NEXT:INCBXSUBAL,[BX]LOOPNEXTMOVRESULT,ALENDM7、答:宏展开:2DATA0DW?2DATA1DW?9、答:1MOVTAB,01MOVTAB+1,11MOVTAB+2,21MOVTAB+3,31MOVTAB+4,41MOVTAB+5,51MOVTAB+6,610、答:STOREMACROXIRPCX,0123456MOVTAB+&X,XENDMENDM12、答:FINSUMMACROX,Y,SUMMOVAX,XMOVBX,Y.IFAX>BXADDBX,BXADDAX,BXMOVSUM,AX.ELSEADDAX,AXADDAX,BXMOVSUM,AX.ENDIFENDM41Page41of41 14、答:DOS21MACRODOSFUNC,BUFFIFNBáBUFF?MOVAH,DOSFUNCMOVDX,OFFSETBUFFINT21HELSEMOVAH,DOSFUNCINT21HENDIFENDM展开宏调用:1MOVAH,011INT21H1MOVAH,0AH1MOVDX,OFFSETIPFIELD1INT21H       第八章1、     答:(1)00048H(2)00020H2、答:movah,02movdl,‘T’movbx,0movds,bxmovbx,21h*4callfarptr[bx]3、答:moval,12hout25h,al4、答:movdx,1000hinax,dx8、答:(SP)=00FA(SS)=0300(IP)=0040(FLAGS)=004041Page41of41 9、答:14H*4=50H,∴(00050H)=偏移地址,(00052H)=段地址10、答:pushdsmovax,segint_routmovds,axmovdx,offsetint_routmoval,09movah,25hint21hpopds12、答:D3→D2→D3→D4→D5→D1→D3→D513、答:D3→D2→D4→D5→D1→D3→D5第九章1、     答:二者不同点是功能1输入字符可回显,功能8输入字符不回显。2、答:dsegsegmentscodedb7,5,9,1,3,6,8,0,2,4bufferdb10dup(?)dsegends;--------------------------------------------------------------------csegsegmentmainprocfarmovax,dsegmovds,axmovsi,0movcx,10leabx,scodeinput:movah,01;键盘输入int21handal,0fh;ASCII→数字xlat;换码movbuffer[si],al;存入缓冲区incsi;修改地址指针loopinput;输入下一个数字41Page41of41 movax,4c00h;返回DOSint21hmainendpcsegendsendmain3、答:((24行×80)+40列)×2=3920=0F50H4、答:movdh,0ch;第12行movdl,08h;第8列movbh,0;0页movah,2;置光标int10h;BIOS调用5、答:movah,7;屏幕初始化moval,0;全屏为空格movbh,07h;正常属性movch,12;左上行movcl,0;左上列movdh,22;右下行movdl,39;右下列int10h;BIOS调用6、答:(1)movah,3;读光标位置movbh,0;页号int10h;BIOS调用(2)movdh,18h;第25行movdl,0;第0列movbh,0;0页movah,2;置光标位置int10h;BIOS调用(3)movah,2;置光标位置movbh,0;0页movdx,0;0行0列int10h;BIOS调用movah,9;显示字符及属性moval,‘M’;字符movbh,0;0页movbl,7;正常属性movcx,1;显示次数41Page41of41 int10h;BIOS调用7、答:messagedb‘Tryagain,youhave’Countdb‘n’db‘starfightersleft.$’;……addcl,30h;二进制数→ASCIImovcount,cl;存入COUNTleadx,message;字符串地址movah,09;显示字符串int21h;DOS调用9、答:messdb‘Whatisthedate(mm/dd/yy)’,07,‘$’datedb10,0,10dup(‘‘)…movah,09;显示字符串leadx,mess;字符串地址int21hmovah,0ah;键盘输入leadx,date;缓冲区地址int21h11、答:MODECOM2:12,N,8,1第十章1。答:(1)EXYRNSUBPRO:FAR(2)PUBLICSUBPRO2、答:(1)PUBLICQTY,VALUE,PRICE(2)EXTRNQTY:BYTE,VALUE:WORD,PRICE:WORD3、答:模块1:PUBLICVAR1,VAR2,LAB3模块2:PUBLICVAR3,LAB2EXTRNVAR1:DWORD,VAR2:BYTE,LAB1:NEAR,LAB3:FAR模块3:PUBLICLAB3EXTRNVAR1:DWORD,VAR2:BYTE,LAB1:NEAR,LAB2:FAR41Page41of41 4、答:EXTRNSUBMUL:FARSSEGSEGMENTDW64DUP(?)SSEGENDS;--------------------------------------------DSEGSEGMENTQTYDW?PRICEDW?DSEGENDS;---------------------------------------------CSEG1SEGMENTASSUMECS:CSEG1,DS:DSEG,SS:SSEGCALLMULPROCFARMOVAX,DSEGMOVDS,AXMOVAX,PRICEMOVBX,QTYCALLFARPTRSUBMUL…CALLMULENDPCSEG1ENDSENDCALLMUL;------------------------------------------------PUBLICSUBMULCSEG2SEGMENTASSUMECS:CSEG2SUBMULPROCFARMULBXRETSUBMULENDPCSEG2ENDSEND;--------------------------------------------------5、答:1D_SEGSEGMENT2XDW16DUP(?)3YDW16DUP(?)41Page41of41 4D_SEGENDS;--------------------------------------------5E_SEGSEGMENT6RDW16DUP(?)7E_SEGENDS;---------------------------------------------8C_SEGSEGMENT9ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEG10MAINPROCFAR11MOVAX,D_SEG12MOVDS,AX13MOVAX,E_SEG14MOVES,AX15CALLCOMPUTE16…17MAINENDP;------------------------------------------------18COMPUTEPROCNEAR19MOVCX,1620MOVSI,021MOVDI,022MOVBX,023NEXT:MOVAX,X[SI]24ADDAX,Y[DI]25SUBAX,326MOVES:R[BX],AX27INCSI28INCDI29INCBX30LOOPNEXT31RET32COMPUTEENDP33C_SEGENDS;---------------------------------------------------34ENDMAIN(1)D_SEGSEGMENT…D_SEGENDS;----------------------------------------E_SEGSEGMENT…E_SEGENDS;---------------------------------------41Page41of41 C_SEG1SEGMENTASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGMAINPROCFARMOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AXCALLFARPTRCOMPUTE…MAINENDPC_SEG1ENDS;------------------------------------------------C_SEG2SEGMENTASSUMECS:C_SEG2,DS:D_SEG,ES:E_SEGCOMPUTEPROCFAR…COMPUTEENDPC_SEG2ENDS;--------------------------------------------------ENDMAIN(2)D_SEGSEGMENT…D_SEGENDS;----------------------------------------E_SEGSEGMENT…E_SEGENDS;---------------------------------------EXTRNCOMPUTE:FARPUBLICX,Y,RC_SEG1SEGMENTASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGMAINPROCFARMOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AXCALLFARPTRCOMPUTE…MAINENDPC_SEG1ENDSENDMAIN;--------------------------------------------------41Page41of41 EXTRNX:WORD,Y:WORD,R:WORDPUBLICCOMPUTEC_SEG2SEGMENTASSUMECS:C_SEG2,DS:D_SEG,ES:E_SEGCOMPUTEPROCFARMOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AX…COMPUTEENDPC_SEG2ENDSEND;--------------------------------------------------6、答:.modelsmall.stack100h.datapublicdata1dw1228data2dw52400resultdd?quotientdw?remainderdw?.codeextrndmul:far,ddiv:farstart:movax,@datamovds,axmovdx,data1movax,data2pushaxpushdxcallfarptrdmulcallfarptrddivmovah,4chint21hendstart;----------------------------------------------.modelsmallextrnresult:dword.codepublicdmul41Page41of41 dmulprocfar__pushbpmovbp,spmovax,[bp+6]movbx,[bp+8]mulbxmovwordptrresult,axmovwordptrresult+2,dxpopbpretdmulendpend;---------------------------------------------------.modelsmallextrnquotient:word,remainder:word.codepublicddivddivprocfar__pushbpmovbp,spmovbx,[bp+6]movax,[bp+8]movdx,0divbxmovquotient,axmovremainder,dxpopbpretdmulendpend41Page41of41'