欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    汇编第六章答案(共25页).doc

    • 资源ID:14107861       资源大小:136KB        全文页数:25页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    汇编第六章答案(共25页).doc

    精选优质文档-倾情为你奉上第六章答案=1.下面的程序段有错吗?若有,请指出错误.CRAY PROCPUSH AXADD AX,BXRETENDP CRAY解:当然有错误,ENDP CRAY写反了,应该将其改成CRAY ENDP.2.已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令.然后再执行一POP指令.试画出示意图说明堆栈及SP内容的变化过程.3.分析下面"6,3的程序",画出堆栈最满时各单元的地址及内容.;              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_ADDRRETC_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 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 OF 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 START ;END OF ASSEMBLY5.下面是6.5题的程序清单,请在清单中填入此程序执行过程中的堆栈变化.0000       STACKSG SEGMENT0000 20 . DW 32 DUP(?)?0040                    STACKSG ENDS0000       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         RET0008       BEGIN ENDP0008       B10 PROC0008 E8 000C R CALL C10000B C3         RET000C       B10 ENDP000C       C10 PROC000C C3         RET000D       C10 ENDP000D       CODESG ENDS           END BEGIN6.写一段子程序SKIPLINES,完成输出空行的功能.空行的行数在AX寄存器中.解: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,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 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      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        assume cs:codesg,ds:datasgstart:        push ds        sub ax,ax        push ax        mov ax,datasg        mov ds,ax        call sub1                lea dx,mess6        call dispstr        mov dl,s6        call dispscore        call crlf        lea dx,mess7        call dispstr        mov dl,s7        call dispscore             call crlf        lea dx,mess8        call dispstr        mov dl,s8        call dispscore        call crlf        lea dx,mess9        call dispstr        mov dl,s9        call dispscore         call crlf        lea dx,mess10        call dispstr        mov dl,s10        call dispscore             call crlf        retmain    endpsub1    proc near        mov cx,10        mov si,0loop1: mov al,gradesi        cmp al,60        jl   next5        cmp al,70        jge next1        inc s6        jmp short next5next1: cmp al,80        jge next2        inc s7        jmp short next5next2: cmp al,90        jge next3        inc s8        jmp short next5next3: cmp al,100        jg next5        je next4        inc s9        jmp short next5next4: inc s10next5: inc si        loop loop1        retsub1    endpdispstr proc near        mov ah,9        int 21hdispstr endpdispscore proc near       add dl,30h       mov ah,2       int 21hdispscore endpcrlf proc near    mov dl,0dh    mov ah,2    int 21h    mov dl,0ah    mov ah,2    int 21h        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' ; 查找字符'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, OFFSET _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 LOOP 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 CRLF 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显示姓名及电话号码;子程序INPUT_NAME:(1)调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中;(2)把INBUF中的姓名移入输出行OUTNAME;子程序INPHONE:(1)调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中;(2)把INBUF中的号码移入输出行OUTPHONE.子程序PRINTLINE:显示姓名及电话号码,格式为:NAME           TEL*           *=;编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来(解法一)data segment     No_of_name db 20     No_of_phone db 8     inbuf db 20 dup(?)      outname db 20 dup(?),'$'     outphone db 8 dup(?),'$'     message1 db 'please input name:','$'     message2 db 'please input a telephone number:','$'     message3 db 'NAME',16 dup(20h),'TEL.',13,10,'$'     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:datastart:       push ds       sub ax,ax       push ax       mov ax,data       mov ds,ax       mov flag,0       lea dx,message1       mov ah,09       int 21h       call input_name       call crlf       lea dx,message2       mov ah,09       int 21h       call inphone       call crlf       cmp flag,1       je   exit       call printlineexit:       retmain endpinput_name proc near       push ax       push dx       push cx       mov cx,0       mov cl,No_of_name       call getchar              mov ax,0       mov al,No_of_name       sub ax,cx       mov cx,ax       mov si,0next1:              mov al,inbufsi       mov outnamesi,al       inc si              loop next1       pop cx       pop dx       pop ax       retinput_name endpinphone proc near       push ax       push dx              mov cx,0       mov cl,No_of_phone       call getchar       cmp cx,0       jnz error1       mov cl,No_of_phone          mov si,0       next2:              mov al,inbufsi              cmp al,30h       jl   error2       cmp al,39h       ja   error2       mov outphonesi,al       inc si              loop next2       jmp exit2error1:       call crlf       lea dx,errormessage1       mov ah,09       int 21h       mov flag,1       jmp exit2error2:        call crlf       lea dx,errormessage2       mov ah,09       int 21h       mov flag,1       jmp exit2exit2:       pop dx       pop ax        retinphone endpgetchar proc near        push ax        push dx        mov di,0rotate:        mov ah,01        int 21h        cmp al,0dh        je   exit1        mov inbufdi,al        inc di        loop rotateexit1:        pop dx        pop ax        retgetchar endpcrlf proc near         push ax         push dx         mov dl,0dh         mov ah,2         int 21h         mov dl,0ah         mov ah,2         int 21h         pop dx         pop ax         retcrlf endpprintline proc near         push ax         push dx         lea dx,message3         mov ah,09         int 21h         lea dx,outnamemov ah,09int 21hlea dx,outphonemov ah,09int 21h         pop dx         pop ax         retprintline endpprog endsend main=;从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来datarea segmentinbuf    label   byte                         ;name parameter list:maxnlen    db      9                          ;max.lengthnamelen    db      ?                          ;no. char enterednamefld    db      9 dup(?)   crlf       db      13,10,'$'messg1     db      'INPUT NAME:',13,10,'$'messg2     db      'INPUT A TELEPHONE NUMBER:',13,10,'$'messg3     db      'NAME                 TEL',13,10,'$'OUTNAME    db      21 dup(?),'$'OUTPHONE   db      8 dup(?),'$'datarea endsprognam segmentassume cs:prognam,ds:datareastart:    push   ds           sub    ax,ax           push   ax           mov    ax,datarea           mov    ds,ax           mov    es,ax TELIST     proc   far               mov    ah,09           lea    dx,messg1           int    21h           call   INPUT_NAME           mov    ah,09           lea    dx,messg2           int    21h           call   INPHONE           call   PRINTLINE           retTELIST     endpINPUT_NAME proc   near           call   GETCHAR           mov   bh,0           mov   bl,namelen           mov   cx,21           sub   cx,bxb20:       mov   namefldbx,20h           inc   bx           loop b20           lea   si,namefld                    lea   di,OUTNAME           mov   cx,9           cld           rep   movsb           retINPUT_NAME endpINPHONE    proc   near           call   GETCHAR           mov   bh,0           mov   bl,namelen            mov   cx,9           sub   cx,bxb30:       mov   namefld bx,20h           inc   bx           loop b30            lea   si,namefld            lea   di,OUTPHONE           mov   cx,8           cld           rep   movsb           retINPHONE    endpPRINTLINE proc   near           mov    ah,09h           lea    dx,messg3           int    21h           mov    ah,09           lea    dx,OUTNAME           int    21h           mov    ah,09           lea    dx,OUTPHONE           int    21h           retPRINTLINE endpGETCHAR    proc   near           mov    ah,0ah           lea    dx,inbuf           int    21h           mov    ah,09           lea    dx,crlf           int    21h           ret        GETCHAR    endpprognam    endsend    start =10.编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来.主程序BANDO:把整数字变量VAL1存入堆栈,并调用子程序PAIRS;子程序PAIRS:从堆栈中取出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,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,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   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   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)SUBPRO怎么告诉汇编程序这三个变量是在另一个汇编语言程序中定义的?解:(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:wordpublic var1,var2,lab1data1    segmentvar1     dd ?var2     db 10 dup(?)data1    endscode1    segmentassume cs:code1, ds:data1main     proc far         mov ax,data1         mov ds,ax         .         .         .lab1:         .         .         .         mov ax,4c00h         int 21hmain     endpcode1    endsend start;模块2extrn var1:dword,var2:byte,lab1:near,lab3:farpublic var3,lab2data2    segmentvar3     dw ?data2    endscode2    segmentassume cs:code2, ds:data2         .         .         .lab2:         .         .         .code2    ends         end;模块3extrn var1:dword,var2:byte,lab1:near,lab2:farpublic lab3code3    segmentassume cs:code3         .         .         .lab3:         .         .         .code3    endsend14.主程序CALLMUL定义堆栈段,数据段和代码段,并把段寄存器初始化;数据段中定义变量QTY和PRICE;代码段中将PRICE装入AX,QTY装入BX,然后调用子程序SUBMUL.程序SUBMUL没有定义任何数据,它只简单地把AX中的内容(PRICE)乘以BX中的内容(QTY),乘积放在DX,AX中.请编制这两个要连接起来的程序.datasg    segmentqty       dw 2price     dw 4datasg    endsstacksg segment         dw 100 dup(?)tos      label wordstacksg endscodesg   segmentmain     proc farassume cs:codesg,ds:datasg,ss:stacksgstart:mov ax,datasgmov ds,axmov ax,stacksgmov ss,axmov sp,offset tosmov ax,pricemov bx,qtycall submulmov ax,4c00hint 21hmain     endpsubmul proc nearmov dx,0mul bxretsubmul   endpcodesg   endsend start15.试编写一个执行以下计算的子程序COMPUTE:       R<-X+Y-3其中X,Y及R均为字数组.假设COMPUTE与其调用程序都在同一代码段中,数据段D_SEG中包含X和Y数组,数据段E_SEG中包含R数组,同时写出主程序调用COMPUTE过程的部分.如果主程序和COMPUTE在同一程序模块中,但不在同一代码段中,程序就如何修改?如果主程序和COMPUTE不在同一程序模块中,程序就如何修改?(1)d_seg    segmentx        dw 1y        dw 4d_seg    endse_seg    segmentr        dw ?e_seg    endsc_seg    segmentmain     proc fara

    注意事项

    本文(汇编第六章答案(共25页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开