匯編第六章答案參考_第1頁
匯編第六章答案參考_第2頁
匯編第六章答案參考_第3頁
匯編第六章答案參考_第4頁
匯編第六章答案參考_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、文檔供參考,可復制、編制,期待您的好評與關注! 第六章答案=1.下面的程序段有錯嗎?若有,請指出錯誤.CRAY PROCPUSH AXADD AX,BXRETENDP CRAY解:當然有錯誤,ENDP CRAY寫反了,應該將其改成CRAY ENDP.2.已知堆棧寄存器SS的內容是0F0A0H,堆棧指示器SP的內容是00B0H,先執行兩條把8057H和0F79BH分別入棧的PUSH指令.然后再執行一POP指令.試畫出示意圖說明堆棧及SP內容的變化過程.3.分析下面"6,3的程序",畫出堆棧最滿時各單元的地址及內容.;     

2、         6.3題的程序;=S_SEG SEGMENT AT 1000H ;DEFINE STACK SEGMENTDW 200 DUP(?)TOS LABEL WORDS_SEG ENDSC_SEG SEGMENT ;DEFINE CODE SEGMENTASSUME CS:C_SEG,SS:S_SEGMOV AX,S_SEGMOV SS,AXMOV SP,OFFSET TOSPUSH DSMOV AX,0PUSH AX.PUSH T_ADDRPUSH AXPUSHF.POPFPOP AXPOP T_AD

3、DRRETC_SEG ENDS ;END OF CODE SEGMENTEND C_SEG ;END OF ASSEMBLY4.分析下面"6.4題的程序"的功能,寫出堆棧最滿時各單元的地址及內容.;                  6.4題的程序;=STACK SEGMENT AT 500HDW 128 DUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMENT ;DEFINE

4、CODE SEGMENTMAIN PROC FAR ;MAIN PART OF PROGRAMASSUME CS:CODE,SS:STACKSTART: ;STARTING EXECUTION ADDRESSMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOSPUSH DSSUB AX,AXPUSH AX;MAIN PART OF PROGRAM GOES HEREMOV AX,4321HCALL HTOARET       ;RETURN TO DOSMAIN ENDP ;END OF MAIN PART O

5、F PROGRAMHTOA PROC NEAR ;DEFINE SUBPROCEDURE HTOACMP AX,15JLE B1PUSH AXPUSH BPMOV BP,SPMOV BX,BP+2AND BX,000FHMOV BP+2,BXPOP BPMOV CL,4SHR AX,CLCALL HTOAPOP AXB1:ADD AL,30HCMP AL,3AHJL PRINTITADD AL,07HPRINTIT:MOV DL,ALMOV AH,2INT 21HRETHTOA ENDP ;END OF SUBPROCEDURECODE ENDS ;END OF CODE SEGMENTEND

6、 START ;END OF ASSEMBLY5.下面是6.5題的程序清單,請在清單中填入此程序執行過程中的堆棧變化.0000       STACKSG SEGMENT0000 20 . DW 32 DUP(?)?0040                    STACKSG ENDS0000     &#

7、160; CODESG SEGMENT PARA 'CODE'0000       BEGIN PROC FAR           ASSUME CS:CODESG,SS:STACKSG0000 1E    PUSH DS0001 2B C0 SUB AX,AX0003 50    PUSH AX0004 E8 0008 R CALL P100007 CB&#

8、160;        RET0008       BEGIN ENDP0008       B10 PROC0008 E8 000C R CALL C10000B C3         RET000C       B10 ENDP000C  

9、60;    C10 PROC000C C3         RET000D       C10 ENDP000D       CODESG ENDS           END BEGIN6.寫一段子程序SKIPLINES,完成輸出空行的功能.空行的行數在AX寄存器中

10、.解:SKIPLINES PROC NEAR PUSH CX PUSH DX MOV CX,AX NEXT: MOV AH,2 MOV DL,0AH INT 21H MOV AH,2 MOV DL,0DH INT 21H LOOP NEXT POP DX POP CX RET SKIPLINES ENDP7.設有10個學生的成績分別是76,69,81,90,73,88,99,63,100和80分.試編制一個子程序統計60-69,70-79,80-89,90-99和100分的人數并分別存放到S6,S7,S8,S9和S10單元中.DSEG SEGMENT NUM DW 76,69,84,90,73

11、,88,99,63,100,80 N 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 MAIN ENDP SUB1 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH SI MOV SI, 0 MOV CX, N NEXT: MOV AX, NUMSI MOV

12、BX, 10 DIV BL MOV BL, AL CBW SUB BX, 6 SAL BX, 1 INC S6BX ADD SI,2 LOOP NEXT POP SI POP CX POP BX POP AX RET SUB1 ENDP CODE ENDS END START (解法二)datasg segmentgrade   db 76,69,84,90,73,88,99,63,100,80s6      db 0s7      db 0s8  

13、60;   db 0s9      db 0s10     db 0mess6 db '6069:$'mess7 db '7079:$'mess8 db '8089:$'mess9 db '9099:$'mess10 db '100:$'datasg endscodesg segmentmain    proc far     

14、   assume cs:codesg,ds:datasgstart:        push ds        sub ax,ax        push ax        mov ax,datasg        mov

15、ds,ax        call sub1                lea dx,mess6        call dispstr        mov dl,s6      &#

16、160; call dispscore        call crlf        lea dx,mess7        call dispstr        mov dl,s7        call dispscore 

17、0;           call crlf        lea dx,mess8        call dispstr        mov dl,s8        call dispscore  &#

18、160;     call crlf        lea dx,mess9        call dispstr        mov dl,s9        call dispscore        

19、 call crlf        lea dx,mess10        call dispstr        mov dl,s10        call dispscore             c

20、all crlf        retmain    endpsub1    proc near        mov cx,10        mov si,0loop1: mov al,gradesi        cmp al,60  

21、;      jl   next5        cmp al,70        jge next1        inc s6        jmp short next5next1: cmp al,80   

22、60;    jge next2        inc s7        jmp short next5next2: cmp al,90        jge next3        inc s8        jm

23、p short next5next3: cmp al,100        jg next5        je next4        inc s9        jmp short next5next4: inc s10next5: inc si     

24、0;  loop loop1        retsub1    endpdispstr proc near        mov ah,9        int 21hdispstr endpdispscore proc near       add dl,30h  

25、     mov ah,2       int 21hdispscore endpcrlf proc near    mov dl,0dh    mov ah,2    int 21h    mov dl,0ah    mov ah,2    int 21h      

26、  retcrlf endpcodesg endsend start8.編寫一個有主程序和子程序結構的程序模塊.子程序的參數是一個N字節數組的首地址TABLE,數N及字符CHAR.要求在N字節數組中查找字符CHAR,并記錄該字符的出現次數.;主程序則要求從鍵盤接收一串字符以建立字節數組TABLE,并逐個顯示從鍵盤輸入的每個字符CHAR以及它在TABLE數組中出現的次數.(為簡化起見,假設出現次數<=15,可以用十六進制形式顯示出來)解:DATA SEGMENT MAXLEN DB 40 N DB ? TABLE DB 40 DUP (?) CHAR DB 'A'

27、 ; 查找字符'A' EVEN _ADDR 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, OF

28、FSET _ADDR ; 通過地址表傳送變量地址 CALL COUNT    ; 計算CHAR的出現次數 CALL DISPLAY ; 顯示 RET MAIN ENDPCOUNT 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 DI L

29、OOP AGAIN POP CX POP AX POP DI POP SI RET COUNT ENDP DISPLAY PROC NEAR ; DISPLAY子程序 CALL CRLF    ; 顯示回車和換行 MOV DL, CHAR MOV AH, 2 INT 21H MOV DL, 20H MOV AH, 2 INT 21H MOV AL, BL AND AL, 0FH ADD AL, 30H CMP AL, 3AH JL PRINT ADD AL, 7 PRINT: MOV DL, AL INT 21H CALL CRLF RET DISPLAY ENDP CRL

30、F PROC NEAR ; CRLF子程序 MOV DL, 0DH MOV AH, 2 INT 21H MOV DL, 0AH MOV AH, 2 INT 21H RET CRLF ENDP CODE ENDS END START9.編寫一個子程序嵌套結構的程序模塊,分別從鍵盤輸入姓名及8個字符的電話號碼,并以一定的格式顯示出來.主程序TELIST:(1)顯示提示符INPUT NAME:;(2)調用子程序INPUT_NAME輸入姓名:(3)顯示提示符INPUT A TELEPHONE NUMBER:;(4)調用子程序INPHONE輸入電話號碼;(5)調用子程序PRINTLINE顯示姓名及電話號

31、碼;子程序INPUT_NAME:(1)調用鍵盤輸入子程序GETCHAR,把輸入的姓名存放在INBUF緩沖區中;(2)把INBUF中的姓名移入輸出行OUTNAME;子程序INPHONE:(1)調用鍵盤輸入子程序GETCHAR,把輸入的8位電話號碼存放在INBUF緩沖區中;(2)把INBUF中的號碼移入輸出行OUTPHONE.子程序PRINTLINE:顯示姓名及電話號碼,格式為:NAME           TEL*       

32、    *=;編寫一個子程序嵌套結構的程序模塊,分別從鍵盤輸入姓名及8個字符的電話號碼,并以一定的格式顯示出來(解法一)data segment     No_of_name db 20     No_of_phone db 8     inbuf db 20 dup(?)      outname db 20 dup(?),'$'     outph

33、one db 8 dup(?),'$'     message1 db 'please input name:','$'     message2 db 'please input a telephone number:','$'     message3 db 'NAME',16 dup(20h),'TEL.',13,10,'$' 

34、60;   errormessage1 db 'you should input 8 numbers!',13,10,'$'     errormessage2 db 'you input a wrong number!',13,10,'$'     flag db ?data endsprog segmentmain proc far      assume cs:prog,ds:

35、datastart:       push ds       sub ax,ax       push ax       mov ax,data       mov ds,ax       mov flag,0  

36、60;    lea dx,message1       mov ah,09       int 21h       call input_name       call crlf       lea dx,message2    

37、;   mov ah,09       int 21h       call inphone       call crlf       cmp flag,1       je   exit      

38、; call printlineexit:       retmain endpinput_name proc near       push ax       push dx       push cx       mov cx,0     

39、60; mov cl,No_of_name       call getchar              mov ax,0       mov al,No_of_name       sub ax,cx       mov cx,ax&#

40、160;      mov si,0next1:              mov al,inbufsi       mov outnamesi,al       inc si            

41、  loop next1       pop cx       pop dx       pop ax       retinput_name endpinphone proc near       push ax       p

42、ush dx              mov cx,0       mov cl,No_of_phone       call getchar       cmp cx,0       jnz error1  

43、0;    mov cl,No_of_phone          mov si,0       next2:              mov al,inbufsi             

44、; cmp al,30h       jl   error2       cmp al,39h       ja   error2       mov outphonesi,al       inc si    

45、0;         loop next2       jmp exit2error1:       call crlf       lea dx,errormessage1       mov ah,09       int 2

46、1h       mov flag,1       jmp exit2error2:        call crlf       lea dx,errormessage2       mov ah,09       int 21h

47、0;      mov flag,1       jmp exit2exit2:       pop dx       pop ax        retinphone endpgetchar proc near        p

48、ush ax        push dx        mov di,0rotate:        mov ah,01        int 21h        cmp al,0dh     &

49、#160;  je   exit1        mov inbufdi,al        inc di        loop rotateexit1:        pop dx        pop ax

50、0;       retgetchar endpcrlf proc near         push ax         push dx         mov dl,0dh         mov ah,2

51、0;        int 21h         mov dl,0ah         mov ah,2         int 21h         pop dx   

52、60;     pop ax         retcrlf endpprintline proc near         push ax         push dx         lea dx,message3 

53、0;       mov ah,09         int 21h         lea dx,outnamemov ah,09int 21hlea dx,outphonemov ah,09int 21h         pop dx     &

54、#160;   pop ax         retprintline endpprog endsend main=;從鍵盤輸入姓名及8個字符的電話號碼,并以一定的格式顯示出來datarea segmentinbuf    label   byte                 

55、;        ;name parameter list:maxnlen    db      9                          ;max.lengthnamelen 

56、   db      ?                          ;no. char enterednamefld    db      9 dup(?)   crlf&

57、#160;      db      13,10,'$'messg1     db      'INPUT NAME:',13,10,'$'messg2     db      'INPUT A TELEPHONE NUMBER:',13,10,'

58、$'messg3     db      'NAME                 TEL',13,10,'$'OUTNAME    db      21 dup(?),'$'OUTPHONE 

59、0; db      8 dup(?),'$'datarea endsprognam segmentassume cs:prognam,ds:datareastart:    push   ds           sub    ax,ax         

60、60; push   ax           mov    ax,datarea           mov    ds,ax           mov    es,ax TELIST&

61、#160;    proc   far               mov    ah,09           lea    dx,messg1         

62、60; int    21h           call   INPUT_NAME           mov    ah,09           lea    dx,messg2

63、60;          int    21h           call   INPHONE           call   PRINTLINE       

64、60;   retTELIST     endpINPUT_NAME proc   near           call   GETCHAR           mov   bh,0        

65、   mov   bl,namelen           mov   cx,21           sub   cx,bxb20:       mov   namefldbx,20h    

66、60;      inc   bx           loop b20           lea   si,namefld                &

67、#160;   lea   di,OUTNAME           mov   cx,9           cld           rep   movsb     

68、;      retINPUT_NAME endpINPHONE    proc   near           call   GETCHAR           mov   bh,0      &

69、#160;    mov   bl,namelen            mov   cx,9           sub   cx,bxb30:       mov   namefld bx,20h  

70、60;        inc   bx           loop b30            lea   si,namefld            lea   d

71、i,OUTPHONE           mov   cx,8           cld           rep   movsb           re

72、tINPHONE    endpPRINTLINE proc   near           mov    ah,09h           lea    dx,messg3         

73、60; int    21h           mov    ah,09           lea    dx,OUTNAME           int    21h

74、0;          mov    ah,09           lea    dx,OUTPHONE           int    21h      

75、     retPRINTLINE endpGETCHAR    proc   near           mov    ah,0ah           lea    dx,inbuf     &

76、#160;     int    21h           mov    ah,09           lea    dx,crlf           int

77、60;   21h           ret        GETCHAR    endpprognam    endsend    start =10.編寫子程序嵌套結構的程序,把整數分別用二進制和八進制形式顯示出來.主程序BANDO:把整數字變量VAL1存入堆棧,并調用子程序PAIRS;子程序PAIRS:從堆棧中

78、取出VAL1;調用二進制顯示程序OUTBIN顯示出與其等效的二進制數;輸出8個空格;調用八進制顯示程序OUTOCT顯示出與其等效的八進制數;調用輸出回車及換行符的子程序.model small.stack 100h.dataval1 dw 0ffffh.codemain proc farstart:push dssub   ax,axpush axmov   ax,datamov   ds,axpush val1call pairsretmain endppairs proc nearpush bpmov   bp

79、,spmov   bx,bp+4call outbinmov   cx,8loop1:mov   dl,20hmov   ah,2int   21hloop loop1call outoctcall crlfpop   bpret   2pairs endpoutbin proc nearmov   cx,16loop2:mov   dl,0rol   bx,1rcl   dl

80、,1or    dl,30hmov   ah,2int   21hloop loop2retoutbin endpoutoct proc nearmov   dl,0rol   bx,1rcl   dl,1add   dl,30hmov   ah,2int   21hmov   ch,5mov   cl,3loop3:rol   bx,clmov&

81、#160;  al,bland   al,07hadd   al,30hmov   dl,almov   ah,2int   21hdec   chjnz   loop3retoutoct endpcrlf proc nearmov   dl,13mov   ah,2int   21hmov   dl,10mov   ah,2int &#

82、160; 21hretcrlf endpend start11.假定一個名為MAINPRO的程序要調用子程序SUBPRO,試問:(1)MAINPRO中的什么指令告訴匯編程序SUBPRO是在外部定義的?(2)SUBPRO怎么知道MAINPRO要調用它?解:(1)EXTRN SUBPRO: FAR(2)PUBLIC SUBPRO12.假定程序MAINPRO和SUBPRO不在同一模塊中,MAINPRO中定義字節變量QTY和字變量VALUE和PRICE.SUBPRO程序要把VALUE除以QTY,并把商存在PRICE中,試問:(1)MAINPRO怎么告訴匯編程序外部子程序要調用這三個變量?(2)SUBP

83、RO怎么告訴匯編程序這三個變量是在另一個匯編語言程序中定義的?解:(1)PUCLIC QTY,VALUE,PRICE(2)EXTRN QTY: BYTE, VALUE: WORD, PRICE: WORD13.假設:(1)在模塊1中定義了雙字變量VAR1,首地址為VAR2的字節數組和NEAR標號LAB1,它們將由模塊2和模塊3所使用;(2)在模塊2中定義了字變量VAR3和FAR標號LAB2,而模塊1中要用到VAR3,模塊3中要用到LAB2;(3)在模塊3中定義了FAR標號LAB3,而模塊2中要用到它.試對每個源模塊給出必要的EXTRN和PUBLIC說明.;模塊1extrn var3:wordp

84、ublic var1,var2,lab1data1    segmentvar1     dd ?var2     db 10 dup(?)data1    endscode1    segmentassume cs:code1, ds:data1main     proc far         mov a

85、x,data1         mov ds,ax         .         .         .lab1:         .     

86、    .         .         mov ax,4c00h         int 21hmain     endpcode1    endsend start;模塊2extrn var1:dword,var2:byte,lab1:near,la

87、b3:farpublic var3,lab2data2    segmentvar3     dw ?data2    endscode2    segmentassume cs:code2, ds:data2         .         .     

88、    .lab2:         .         .         .code2    ends         end;模塊3extrn var1:dword,var2:byte,lab1:near,lab2

89、:farpublic lab3code3    segmentassume cs:code3         .         .         .lab3:         .         .  &#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論