IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章-精选资料_第1页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章-精选资料_第2页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章-精选资料_第3页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章-精选资料_第4页
IBMPC汇编语言程序设计第二版课后习题答案清华大学出版社着答案38章-精选资料_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

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

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

6、000H0 1 1016接上表 (1)5D140 0 0 0(2)A8701 0 0 1(3)D87010 0 0(4)34E400 1 017(1).MOV AX,Z;把Z 送到 AXSUB AX,X;Z-XADD AX,W;W+(Z-X)MOV Z,AX;结果保存在Z中(2).MOV AX,R;R送到AX中ADD AX,9; R+9MOV BX,X;X送到BX中ADD BX,6ADD AX,BXMOV BX,W; X+6;(R+9 +(X+6),结果保存在AX中;W送到BX中SUBBX,AX ; W- (R+9)-(X+6), 连续减去两个数,相当于减去这两个数的和(3)MOV AX, W

7、;把W送到AXIMUL X; W*X注意:低十六位保存在 AX里,高十六位保存在 DX里MOV BX, Y;把Y送到BX里MOV Z,BX;最终结果送到 Z 中ADD BX, 6IDIV BX;( W*X) /(Y+6)MOV Z, AXMOV R, DX(4); Y+6注意:商保存在 AX里,余数保存在 DX里;把商送到 Z 中,;把余数 送到 R 中MOV AX,W;把W送至U AX中SUB AX,X; W-XCWD;把AX中的十六位带符号数扩展成为32位,低十六位保存在 AX中,高十六位保;在DX中MOV BX,5;把5送到BX中IDIV BX;(W-X)/5被除数为 32位,除数为 1

8、6 位 商为 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,1234H1234H000MOVCL,41234H000ROLAX,CL2341H100DECAX2340H100MOV CX,42340H100MULCX8918H000INT 20H程序结束后,( AX) =8918H(DX)=0000H

9、19指令执行完后AX的内容 执行完后CF ,SF,ZF和OF的值MOV AX,0 00010DEC AX FFFFH 0100ADD AX,7FFFH 7FFEH 0000ADD AX,2 8000H0101NOT AX7FFFH0101SUB AX,0FFFFH 8000H1101SUB AX,1 FFFFH 1101AND AX,58D1H58D1H0000SAL AX,1B1A2H0101SAR AX,1D8D1H0100NEG AX272FH1000ROR AX,19397H100120ADD AX,8000H0000H10111)MOV AX,DATAXADD DATAY, AX2)

10、MOV AX,DATAXADD DATAY, AXMOV AX, DATAX+2ADD DATAY+2 , AX3)本組指令的作用是: BX <DATAX+DATAY+1(CF 的值 ) 帶進位加法 4) MOV AX,DATAXMUL DATAY ;結果的高十六位保存在 DX裏,低十六位保存在 AX裏5) MOV AX, DATAXMOV DX, DATAX+2MUL DWORD DATA;Y;6) MOV AX, DATAXDIV 17H;結果商保存在 AL中,余數在 AH中7) MOV AX, DATAXCDWDIV DATAY21 NEG DXNEG AXSBB DX, 022;

11、把雙字長數的低字放;把雙字長數的高字放到DX中;測試雙字長數的符號MOV AX, A到AX中MOV DX, A+2TEST DX, 8000HJZRIGHT;如果是非負;如果是負數,則直接保存 NEG DX 數,則求補 NEG AXSBB DX, 0 RIGHT: MOV B , AXMOV B+2 , DX23每條指令單獨執行完後的結果依次為:(1) 9AH(2)61H (3)0FBH (4)1CH (5)0 (6)0E3H24.執行指令序列後,BX的內容爲:ODAH25(1)把53D乘以2的程序:MOV AX, 35H; 53D=35HSHL AX , 1( 2)把 53 除以 2 的程序

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

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

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

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

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

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

18、R+9LEA DI ,PRINT_LINE+132MOV CX,9STDREP MOVSB 32程序实现:LEA SI , OLDSLEA DI ,NEWSMOV CX, 5REPZ CMPSBJNZ NEW_LESS331) CMP DX,CXJA EXCEED2) CMP BX,AXJG EXCEED(3)CMP CX,0JZ ZERO4)CMP BX,AXJO OVERFLOW( 5) CMP BX,AXJLE EQ_SMA(6)CMP DX, CXJBE EQ_CX34 (1) 跳转到: L1(2)跳转到 L1( 3)跳转到 L2( 4)跳转到 L5( 5)跳转到 L535NB ,BE

19、 ,NL , LE同上B,BE , L ,LENB,NBE ,NL ,NLE(1)可以引起转移到 L1 的指令有:(2)可以引起转移到 L1 的指令有:(3)可以引起转移到 L1 的指令有:(4)可以引起转移到 L1 的指令有:(5)可以引起转移到 L1 的指令有:同上(6)可以引起转移 到 L1 的指令有:同(3)(7)可以引起转移 到 L1 的指令有:同上36。37 程序流程图就不画了,程序如下 MOV AL,STAUSSI;把要测试的字节放到 AL 中ANDAL,2AH;把第一,三,五位为一其他位为0 的数-2AH ,与这个字节比较,结果放到AL中JZ ROUTINE_4 为0 XORA

20、L,2AH 异或JZ ROUTINE_1BSF BL,ALBSR BL ,ALCMP BL,CL;如果向前和向后测试后,第一个 1 的位置相同, JE ROUTINE_2;如果结果为 0 ,则三位都; 前面相与的结果再与 2AH;如果结果为 0,则三位都为 1;说明只有一个 1,则异或运算前有 AL 中有两个 1ROUTINE_1 注:本题还有其他解法,请大家自己试试 38.( 1)当括号内是:LOOP寸,循环四次,程序结束后AX) =05( BX) = 16( CX) =0 ( DX) =02) 当括号内是: LOOPE 寸,不循环,程序结束后AX) =02 ( BX) =04 ( CX)

21、=03 ( DX) =02(3)当括号内是:LOOPNE寸:循环三次,程序结束后AX) =04 ( 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 MYDATSIOFFSET 不能与复杂操作数相连

22、(7) MOV CS AX不能对CS赋值(8) MOV ECX,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)格式不对, 应为 NEAR PTR 。

23、5。图,就不画了 6。( 1) DW 5150H(2) MOV AX, 5150HMOV ADDRESS , AX ; 等,写出几个就可以 7。DATASG SEGMENTFLD1BDB'personal computer'FLD2BDB10 DUP (32)FLD3BDB20HFLD5BDB'32654'FLD6BDB10 DUP (0)FLD7BDB'PART1',DUP 20(?),'PART2',DUP 50 (?),'PART3',DUP 14 (?)FLD1WDW0FFF0HFLD2WDW0101100

24、1BFLD3WDWFLD7BFLD4WDW5 , 6, 7, 8, 9FLD5WDW5 DUP ( 0)FLD6WDW(FLD6W-FLD1W)-(FLD7B-FLD1B)FLD4BDB 01011001B& 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 SEGMENTDB 5DATA_LIST DW 0FFFFH,0,2,5,4, 5 DUP (?)DATA_S

25、EG ENDSCODE_SEG SEGMENTASSUME CS:CODE_SEG,DS:DATA_SEGMOV AX,5MOV MAX,AXMOV AX,0FFFFHMOV MIN,AXCODE_SEG ENDS12。( 1)10025(2)193) 25484)35)1036)0FFFFH7)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) 缺少段名 在前面

26、加个段名(3 引用应该从;开始把那个“ / ”改成“;”( 4 结构混乱改为:MAIN_PROC PROC FARMAIN_PROC ENDPEND 16 。程序框架如下:讓下一字節地址為 0E000H;建立一個與下一存儲單元有相同段地址和偏;給DATA_GROU分配100個字節的空間;定義堆棧段DATA_SEG SEGMENT ;定義數據段 ORG 0E000H;FIRST_TYPE EQU THIS WORD 移地址的操作數DATA_GROUP DB 100 DUP(?)DATA_SEG ENDS;讓下一字節從小段首地址開始;為堆棧分配空間;數據段結束 STACK_SEG SEGMENT

27、ALIGN 16STACK DB 100 DUP (?)STACK_SEG ENDSCODE_SEG SEGMENTASSUME CS:CODE_SEG ,DS:DATA_SEG ,SS:STACK_SEGORG 1000H;讓下條指令的第一個字節從1000H開始START : MOV AX,DATA_SEGMOV DS,AXMOV AX,STACK_SEGMOV SS,AXCODE_SEG ENDSEND START ;結束 17。程序如下:;数据D_SEG SEGMENT 段定义AUGEND DD 99251D_SEG ENDSE_SEG SEGMENT;附加段定义ADDEND DD -1

28、5926E_SEG ENDSC_SEG SEGMENT;代码段定义ASSUME CS:C_SEG , DS:D_SEG,ES:E_SEGSTART: MOV AX,D_SEG第五章答案5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.model small.stack 100H.code main proc farStart:push dxmov ax,0push axmov ah,01Hint 21Hcmp al,61Hjl lop1cmp al,7BHjge lop1sub al,20Hmov dl,allop1:mov ah,2int 21HretEnd sta

29、rt5.2 编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示 这三个字符 .model small.386.codeMAIN PROC FARstart:push dssub ax,axpush axinput:mov ah,7Hint 21H cmpe: 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

30、ah,02Hint 21H; 输出换行回车mov dl,0AHmov ah,02Hint 21Hjmp inputexit :retMAIN ENDPEND startAL、BL、CL、DL 中。5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在 .model small.datax DB 4 dup(?).stack 100H.codeMAIN PROC FAR start:push ds and ax,00H push axmov ax,1234H mov cx,04Hmov si,00Hlop:push cxmov cl,04Hrol ax,cl push ax a

31、nd al,0FH mov BYTE PTR xsi,al pop ax pop cx add si,2 Loop lop mov al,X mov bl,X+2 mov cl,X+4 mov dl,X+6 print:mov ah,02Hint 21Hmov dl,almov ah,02Hint 21Hmov dl,blmov ah,02Hint 21Hmov dl,clmov ah,02Hint 21Hexit:retMAIN ENDPEND start5.4编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH"若不同

32、在显示:"NO MATCH"。.model small.dataSTRING1 DB 'I must study hard'STRING2 DB 'I must study hard'XDB 'MATCH .$'YDB 'NO MATCH.$'.stack 100H.codemain proc farStart:push dxmov ax,0push axmov ax,datamov ds,axmov es,axlea si,STRING1lea di,STRING2cldmov cx,(string2-str

33、ing1)/ type STRING2retEnd start5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的 ASCII为07)。这题比较有意思,呵呵。model small.code main proc farstart:push dssub ax,axpush axinput:mov ah,01Hint 21Hcmp al,20Hje exitcmp al,30Hjle inputcmp al,3AHjge inputsub al,30Hmov cx,axand cx,0FFHlop: mov dl,07Hmov ah,2Hint 21Hloop lopjmp i

34、nputexit : retmain endpend startN,并分别把5.6编写程序,将一个包含有20个数据的数组 M分成两个数组:正数数组和负数数组这两个数组中的数据个数显示出来。.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,data mov ds,axMOV bx,0MOV si,0MOV di,0MOV cx,20D

35、cmpe : CMP Mbx,0JL ifLowhight : MOV al,byte ptr MbxMOV byte ptr Psi,alinc siJMP commonContrlifLow :MOV al,byte ptr MbxMOV byte ptr Ndi,alINC dicommonContrl:INC bx loop cmpe mov ax,si call showNumber call printCR mov ax,di call showNumber exit: ret MAIN ENDP;注意,ShowNumbe这个子过程有问题,请自行修改showNumber PROC

36、NEARcovernum:DAAMOVdx,axMOVcl,2Hshow:ROLdl,4Hpush dxANDdl,0fHADDdl,30HMOVah,02Hint21Hpopdxloop showretshowNumber ENDPprintCR PROC NEARmov dl,0aHmov ah,02Hint 21Hmov dl,0dHmov ah,02Hint 21HretprintCR ENDPend startAX中。5.7编制一个汇编语言程序,求出首地址为DATA勺100D字数组中的最小偶数,并把它放在此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATAdataare

37、segmentDATA DW 3322H,4555H,200H,3544H,1245Hnum DB ($-DATA)/2dataare endscode segmentassume cs:code,ds:dataareMAIN PROC FAR start:push dsmov ax,0Hpush axmov ax,dataaremov ds,ax偶数数量计数mov dx,0Hmov cx,Word ptr nummov si,0HisO:mov bx,WORD PTR DATAsi shr bx,1H jnc addDX jmp commonControl addDX:ADD dx,1Hcm

38、p dx,1Hje firstAXValue compare:mov bx,WORD PTR DATAsicmp bx,axjge commonControlmov ax,bxcommonControl:ADD si,2Hloop isO jmp exit firstAXvalue:mov ax,WORD PTR DATAsi jmp compareexit:retMAIN ENDP code endsEND start5.8 没有做。5.9 编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等 值的二进制数。.model small.386.codemain p

39、roc farstart:push dsmov ax,0push axmov ax,0mov cx,4mov dx,0input:mov ah,1Hint 21Hcmp al,30Hjl inputcmp al,39Hjle scmp al,61Hjl inputcmp al,66Hjg inputsub al,27Hs:sub al,30Hadd dl,alcmp cx,1Hje frol dx,4 f:loop inputexit:call printretmain endpprint proc nearmov cx,10Hp:rol dx,1push dxanddx,1adddx,30H

40、movah,2int21Hpopdxloop pSUN在该文中ret print endp end start5.10设有一段英文,其变量字符名为ENG并以$字符结束。试编写一程序,查对单词的出现次数,并以格式 "SUN XXXX'显示出次数。.model small.386.dataENGdb 'SUN's SUN JAVA',24H;24H = $MESSAGE db 'SUN:','$'.stack 100H.codeMAIN PROC FARstart:PUSH DSAND AX,0PUSH AXMOV AX,d

41、ataMOV DS,AXMOV AX,0HMOV SI,1H subSI1:SUB SI,1H subSI2:SUB SI,1H compareS:ADD SI,1HMOV DL,ENGSICMP DL,24HJE printCMP DL,53HJNE compareS compareU:ADD SI,1HMOV DL,ENGSICMP DL,55HJNE subSI2 compareN:ADD SI,1HMOV DL,ENGSICMP DL,4EHJNE subSI1INC AXJMP compares print:LEA DX,MESSAGEPUSH AXMOV AH,09HINT 21H

42、POP AXcall showNumberexit:retMAIN ENDP;注意,ShowNumbe这个子过程有问题,请自行修改showNumber PROC NEARcovernum:DAAMOVdx,axMOVcl,4Hshow:ROLdx,4Hpush dxANDdx,0fHADDdx,30HMOVah,02Hint21Hpopdxloop showretshowNumber ENDPEND start5.11 从键盘输入一系列以 $为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。 .model small.386.codeMAIN PROC FARstart:push

43、 dsmov ax,0push axmov cx,0input:mov ah,1Hint 21Hcompare:cmp al,24Hje printcmp al,30HjladdCountcmp al,39HjgaddCountaddCount:add ax,1Hjmp inputprint:call showNumberexit: retMAIN ENDP;注意,ShowNumbe这个子过程有问题,请自行修改showNumber PROC NEARcovernum:DAAMOVdx,axMOVcl,2Hshow:ROLdl,4Hpush dxANDdl,0fHADDdl,30HMOVah,0

44、2Hint21Hpopdxloop showretshowNumber ENDPEND start5.12有一个首地址为 MEM勺100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前 压缩,最后将数组的剩余部分补上零。.model small.386.stack 100H.datamem dw12,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

45、,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.codeMAIN PROC FARstart:push dsand ax,0push axmov ax,datamov ds,axmov ax,0H mov bx,64H mov cx,64Hmov si,0FFFEH repeat:ADD si,2Hcmp MEMsi,0H JE callsloop repeat calls:INC ax call sort cmp ax,1HJE lastValueDEC cxjmp repeatexit :ret lastValu

46、e:mov membx,0HDEC cx jmp repeat MAIN ENDP sort PROC NEAR push cx push si sub si,2H s: add si,2H mov dx,memsi mov memsi+2,dx loop s return:pop sipop cxretsort ENDPEND startMOV AX,E_SEG MOV ES,AX MOV EAX,DS:AUGENDADD EAX,ES:ADDEND MOV DS:SUM,EAX C_SEG ENDSEND START;结束18。2)( 3)( 4)19。需要加上 PTR伪操作的有:第六章答

47、案2、答: (1) NAME1 NAMELIST < >DATA 中(2) MOV AX ,DATA ;假设结构变量 NAME1 定义在数据段 MOV DS , AXMOV ES , AXMOV AH , 10LEA DX , NAME1INT 21H;MOV CL , NAME1.ACTLENMOV CH , 0LEA SI ,NAME1.NAMEINLEA DI , DISPFILECLDREP MOVSB6 、答: SKIPLINES PROC NEARPUSH CXPUSH DXMOV CX , AXNEXT : MOV AH ,2MOV DL , 0AHINT 21HMO

48、V AH , 2MOV DL , 0DHINT 21HLOOP NEXTPOP DXPOP CXRETSKIPLINES ENDP7、答:dseg segmentnum dw 76,69,84,90,73,88,99,63,100,80n dw 10 s6 dw 0 s7 dw 0 s8 dw 0 s9 dw 0 s10 dw 0 dseg ends code segment main proc far assume cs:code, ds:dseg start: push ds sub ax, ax push ax mov ax, dseg mov ds, ax call sub1 ret

49、main endp sub1 proc near push ax push bx push cx push si mov si, 0 mov cx, n next:mov ax, numsi mov bx, 10 div bl mov bl, al cbw sub bx, 6 sal bx, 1 inc s6bx add si,2 loop next pop sipop cxpop bxpop axretsub1 endp code ends end start 8、答: data segment maxlen db 40 n db ?table db 40 dup (?)char db &#

50、39;a' ;查找字符' a'evenaddr dw 3 dup (?)data ends code segment assume cs:code, ds:data main proc far start: push ds mov ax, 0 push ax mov ax, data mov ds, ax lea dx, maxlen mov ah, 0ah int 21h ; 从键盘接收字符串 mov addr, offset table mov addr+2, offset n mov addr+4, offset char mov bx, offset addr ;通过地址表传送变量地址call count ;计算 CHAR 的出现次数call display ; 显示 ret main endp子程序子程序count proc near ; count push si push di push ax push cx mov di, bx mov si, bx+2 mov cl, byte ptrsi mov ch, 0 mov si, bx+4 mov al, byte ptrsi mov bx, 0 again: cmp al, byte ptrdi jne l1 inc bx l1: inc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论