汇编第六章答案_第1页
汇编第六章答案_第2页
汇编第六章答案_第3页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章答案1. 下面的程序段有错吗?若有,请指出错误CRAY PROCPUSH AXADD AX,BXRETENDP CRAY解:当然有错误,ENDP CRAYI反了 ,应该将其改成CRAY ENDP.2. 已知堆栈寄存器SS的内容是0F0A0H堆栈指示器SP的内容是00B0H,先执行两 条把8057H和0F79BH分别入栈的PUSH旨令然后再执行一 POPW令.试画出示意 图说明堆栈及SP内容的变化过程.MOV AX.8057HMOV BK0F7PBH(SP)POP(SP)3. 分析下面"6,3的程序",画出堆栈最满时各单元的地址及内容 ;6.3题的程序S_SEG SEG

2、MENT 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 AXPUSH T_ADDRPUSH AXPUSHFPOPFPOP AXPOP T_ADDRRETC_SEG ENDS ;END OF CODE SEGMENTEND C_SEG ;END OF ASSEMBLY第六章第3题答

3、案4. 分析下面"6.4题的程序"的功能,写出堆栈最满时各单元的地址及内容 ;6.4题的程序STACK SEGMENT AT 500HDW 128 DUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMENT ;DEFINE CODE SEGMENT MAIN PROC FAR ;MAIN PART OF PROGRAMASSUME CS:CODE,SS:STACKSTART: ;STARTING EXECUTION ADDRESSMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOSPUSH DSSUB AX,AXPUSH A

4、X;MAIN PART OF PROGRAM GOES HEREMOV AX,4321HCALL HTOARET;RETURN TO DOSMAIN ENDP ;END OF MAIN PART OF PROGRAMHTOA PROC NEAR ;DEFINE SUBPROCEDURE HTOA CMP 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,0

5、7HPRINTIT:MOV DL,ALMOV AH,2INT 21HRETHTOA ENDP ;END OF SUBPROCEDURECODE ENDS ;END OF CODE SEGMENTEND START ;END OF ASSEMBLY第六章第4题答案5. 下面是6.5题的程序清单,请在清单中填入此程序执行过程中的堆栈变化0000STACKSG SEGMENT0000 20 . DW 32 DUP?0040STACKSG ENDS0000CODESG SEGMENT PARA 'CODE'0000BEGIN PROC FARASSUME CS:CODESG,SS:ST

6、ACKSG0000 1EPUSH DS0001 2B C0 SUB AX,AX0003 50PUSH AX0004 E8 0008 R CALL P100007 CBRET0008BEGIN ENDP0008B10 PROC0008 E8 000C R CALL C10000B C3RET000CB10 ENDP000CC10 PROC000C C3RET000DC10 ENDP000DCODESG ENDSEND BEGINo nu o o D o o o o Q fl oTVspsp83oo(0034)(0036)(0033)(0Q3A)(OQ3C)(003E)SP:OOOB00070DS

7、003C第六章第5题答案6. 写一段子程序SKIPLINES,完成输出空行的功能.空行的行数在AX寄存器中. 解:SKIPLINES PROC NEARPUSH CXPUSH DXMOV C,AXNEXT MOV AH 2MOV DL OAHINT 21HMOV AH 2MOV DL 0DHINT 21HLOOP NEXTPOP DXPOP CXRETSKIPLINES ENDP7. 设有 10个学生的成绩分别是 76,69,81,90,73,88,99,63,100和80分.试编制一个子程序统计 60-69,70-79,80-89,90-99 和 100 分的人数并分别存放到S6,S7,S8

8、,S9 和 S10单元中.DSEG SEGMENTNUM DW 76,69,84,90,73,88,99,63,100,80N DW 1056 DW 057 DW 058 DW 059 DW 0S10 DW 0DSEG ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE, DS:DSEGSTART:PUSH DSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AXCALL SUB1RETMAIN ENDPSUB1 PROC NEARPUSH AXPUSH BXPUSH CXPUSH SIMOV SI, 0MOV CX, NNEXT:

9、MOV AX, NUMSIMOV BX, 10DIV BLMOV BL, ALCBWSUB BX, 6SAL BX, 1INC S6BXADD SI,2LOOP NEXTPOP SIPOP CXPOP BXPOP AXRETSUB1 ENDPCODE ENDSEND START( 解法二 ) datasg segment grade db 76,69,84,90,73,88,99,63,100,80s6s7s8s9db 0db 0db 0db 0s10 db 0 mess6 db '6069:$' mess7 db '7079:$' mess8 db '

10、8089:$' mess9 db '9099:$' mess10 db '100:$' datasg ends codesg segment main proc farstart:assume cs:codesg,ds:datasgpush dssub ax,ax push ax mov ax,datasg mov ds,ax call sub1lea dx,mess6 call dispstr mov dl,s6 call dispscore call crlflea dx,mess7 call dispstr mov dl,s7 call disps

11、corecall crlf lea dx,mess8 call dispstr mov dl,s8 call dispscore call crlflea dx,mess9 call dispstr mov dl,s9 call dispscore call crlflea dx,mess10 call dispstr mov dl,s10 call dispscore call crlfretmainendpsub1proc nearmov cx,10mov si,0loop1: mov al,gradesicmp al,60jl next5cmp al,70jge next1inc s6j

12、mp short next5 next1: cmp al,80jge next2inc s7jmp short next5 next2: cmp al,90jge next3inc s8jmp short next5 next3: cmp al,100jg next5je next4inc s9jmp short next5next4: inc s10next5: inc siloop loop1retsub1 endpdispstr proc nearmov ah,9int 21hdispstr endpdispscore proc nearadd dl,30hmov ah,2int 21h

13、dispscore endpcrlf proc nearmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hretcrlf endpcodesg endsend start8. 编写一个有主程序和子程序结构的程序模块子程序的参数是一个N字节数组 的首地址TABLE数N及字符CHAR要求在N字节数组中查找字符 CHAR并记录该 字符的出现次数.;主程序则要求从键盘接收一串字符以建立字节数组 TABLE并 逐个显示从键盘输入的每个字符 CHAR以及它在TABLE数组中出现的次数.(为简 化起见,假设出现次数=15,可以用十六进制形式显示出来)解:DA

14、TA SEGMENTMAXLEN DB 40N DB ?TABLE DB 40 DUP (?)CHAR DB 'A' 查找字符'A'EVEN_ADDR DW 3 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATAMAIN PROC FARSTART:PUSH DSMOV AX, 0PUSH AXMOV AX, DATAMOV DS, AXLEA DX, MAXLENMOV AH, 0AHINT 21H ; 从键盘接收字符串MOV _ADDR, OFFSET TABLEMOV _ADDR+2, OFFSET NMO

15、V _ADDR+4, OFFSET CHARMOV BX, OFFSET _ADDR ;通过地址表传送变量地址CALL COUNT ;计算CHAR勺出现次数CALL DISPLAY ; 显示RETMAIN ENDPCOUNT PROC NEAR ; COL子程序PUSH SIPUSH DIPUSH AXPUSH CXMOV DI, BXMOV SI, BX+2MOV CL, BYTE PTRSIMOV CH, 0MOV SI, BX+4MOV AL, BYTE PTRSIMOV BX, 0AGAIN:CMP AL, BYTE PTRDIJNE L1INC BXL1: INC DILOOP AG

16、AINPOP CXPOP AXPOP DIPOP SIRETCOUNT ENDPDISPLAY PROC NEAR ; DISPLA子程序CALL CRLF ; 显示回车和换行MOV DL, CHARMOV AH, 2INT 21HMOV DL, 20HMOV AH, 2INT 21HMOV AL, BLAND AL, 0FHADD AL, 30HCMP AL, 3AHJL PRINTADD AL, 7PRINT:MOV DL, ALINT 21HCALL CRLFRETDISPLAY ENDPCRLF PROC NEAR ; CRL子 程序MOV DL, 0DHMOV AH, 2INT 21

17、HMOV DL, 0AHMOV AH, 2INT 21HRETCRLF ENDPCODE ENDSEND START9. 编写一个子程序嵌套结构的程序模块 ,分别从键盘输入姓名及 8 个字符的电话 号码, 并以一定的格式显示出来 .主程序 TELIST:(1) 显示提示符 INPUT NAME:; 调用子程序INPUT_NAM输入姓名:(3)显示提示符 INPUT A TELEPHONE NUMBER:;调用子程序INPH ON输入电话号码;(5)调用子程序PRINTLINES示姓名及电话号码;子程序 INPUT_NAME:(1)调用键盘输入子程序GETCHAR,输入的姓名存放在INBUF缓冲

18、区中;把INBUF中的姓名移入输出行 OUTNAME;子程序 INPHONE:(1)调用键盘输入子程序GETCHA把输入的8位电话号码存放在INBUF缓冲区中;把INBUF中的号码移入输出行 OUTPHONE.子程序 PRINTLINE:显示姓名及电话号码 ,格式为 :NAMETEL*; 编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及 8个字符的电话 号码,并以一定的格式显示出来( 解法一 ) data segmentNo_of_name db 20 No_of_phone db 8 inbuf db 20 dup(?) outname db 20 dup(?),'$'

19、 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,'$' e

20、rrormessage2 db 'you input a wrong number!',13,10,'$' flag db ?data ends prog segment main proc farassume cs:prog,ds:data start:push ds sub ax,ax push axmov ax,data mov ds,ax mov flag,0lea dx,message1 mov ah,09 int 21hcall input_name call crlflea dx,message2 mov ah,09 int 21hcall inp

21、hone call crlfcmp flag,1je exitcall printline exit:retmain endpinput_name proc nearpush axpush dxpush cxmov cx,0mov cl,No_of_name call getcharmov ax,0mov al,No_of_name sub ax,cxmov cx,axmov si,0next1:mov al,inbufsimov outnamesi,al inc siloop next1pop cx pop dx pop axretinput_name endpinphone proc ne

22、arpush axpush dxmov cx,0mov cl,No_of_phone call getcharcmp cx,0jnz error1mov cl,No_of_phonemov si,0next2:mov al,inbufsicmp al,30hjlerror2cmp al,39hjaerror2mov outphonesi,al inc siloop next2jmp exit2error1:call crlflea dx,errormessage1mov ah,09int 21hmov flag,1jmp exit2error2:call crlflea dx,errormes

23、sage2mov ah,09int 21hmov flag,1jmp exit2exit2:pop dxpop axretinphone endpgetchar proc nearpush axpush dxmov di,0 rotate:mov ah,01int 21hcmp al,0dhje exit1mov inbufdi,alinc diloop rotateexit1:pop dxpop axretgetchar endpcrlf proc nearpush ax push dxmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hpop

24、 dxpop axretcrlf endpprintline proc nearpush axpush dxlea dx,message3 mov ah,09 int 21hlea dx,outnamemov ah,09int 21hlea dx,outphonemov ah,09int 21hpop dxpop axretprintline endpprog endsend maininbuf;namlabel byte e parameter list:maxnlendb;max.length9namelendb;no. char entered?nameflddb9 dup(?)crlf

25、db13,10,'$'messg1db'INPUT NAME:',13,10,'$'messg2db'INPUT A TELEPHONE NUMBER:',13,10,'$'messg3',13,10,'$'db'NAMEOUTNAMEdb21 dup(?),'$'OUTPHONEdb8 dup(?),'$'datarea endsprognam segmentassume cs:prognam,ds:datarea; 从键盘输入姓名及 8 个字符的电

26、话号码,并以一定的格式显示出来 datarea segmentTELstart: push ds sub push mov mov movTELIST proc far mov lea int call mov lea int call call retTELIST endpINPUT_NAME proc near call mov mov mov subax,axax ax,datarea ds,ax es,axah,09 dx,messg1 21h INPUT_NAMEah,09 dx,messg2 21h INPHONE PRINTLINEGETCHAR bh,0 bl,namelen

27、cx,21 cx,bxb20: mov namefldbx,20hincbxloop b20leasi,namefldleadi,OUTNAMEmovcx,9cldrepmovsbretINPUT_NAME endpINPHONEprocnearcallGETCHARmovbh,0movbl,namelenmovcx,9subcx,bxb30:movnamefld bx,20hincbxloop b30 leasi,namefldleadi,OUTPHONEmovcx,8cldrepmovsbretINPHONEendpPRINTLINE procnearmovah,09hleadx,mess

28、g3int21hmovah,09leadx,OUTNAMEint21hmovah,09leadx,OUTPHONEint21hretPRINTLINE endpGETCHARprocnearmovah,0ahleadx,inbufint21hmovah,09leadx,crlfint21hretGETCHAR endp prognamendsend start10. 编写子程序嵌套结构的程序 , 把整数分别用二进制和八进制形式显示出来 .主 程序BANDOE整数字变量VAL1存入堆栈,并调用子程序PAIRS;子程序PAIRS:从 堆栈中取出VAL1;调用二进制显示程序OUTBIN显示出与其等效

29、的二进制数;输出 8个空格;调用八进制显示程序OUTOC显示出与其等效的八进制数;调用输出回 车及换行符的子程序 .model small.stack 100h.dataval1 dw 0ffffh.codemain proc farstart:push dssub ax,axpush axmov ax,data mov ds,ax push val1 call pairs ret main endp pairs proc near push bp mov bp,sp mov bx,bp+4 call outbinmovcx,8loop1:movdl,20hmovah,2int21hloop

30、loop1call outoctcall crlfpopbpret2pairs endpoutbin proc nearmovcx,16loop2:movdl,0rolbx,1rcldl,1ordl,30hmovah,2int21hloop loop2retoutbin endpoutoct proc nearmovdl,0rolbx,1rcldl,1adddl,30hmovah,2int21hmovch,5movcl,3loop3:rolbx,clmoval,blandal,07haddal,30hmovdl,almovah,2int21hdecchjnzloop3retoutoct end

31、pcrlf proc nearmovdl,13movah,2int21hmovdl,10movah,2int21hretcrlf endpend start11. 假定一个名为MAINPR的程序要调用子程序SUBPR(试问:MAINPRO中的什么指令告诉汇编程序 SUBPR是在外部定义的? (2)SUBPRO怎么知道MAINPR要调用它? 解 :(1) EXTRN SUBPRO: FAR(2) PUBLIC SUBPRO12. 假定程序MAINPRO口 SUBPR不在同一模块中,MAINPRO中定义字节变量 QTY 和字变量VALUES PRICE.SUBPR程序要把VALUED以QTY并把商

32、存在PRICE中, 试问 :(1) MAINPRC怎么告诉汇编程序外部子程序要调用这三个变量 ?(2) SUBPRC怎么告诉汇编程序这三个变量是在另一个汇编语言程序中定义的? 解 :(1) PUCLIC QTY,VALUE,PRICE(2) EXTRN QTY: BYTE, VALUE: WORD, PRICE: WORD13. 假设 :(1)在模块1中定义了双字变量VAR1首地址为VAR的字节数组和NEARS号LAB1, 它们将由模块 2 和模块 3所使用;在模块2中定义了字变量VAR3和FAR标号LAB2,而模块1中要用到VAR3模 块 3 中要用到 LAB2;在模块3中定义了 FAR标号

33、LAB3,而模块2中要用到它. 试对每个源模块给出必要的 EXTRN和PUBLIC说明.; 模块 1extrn var3:wordpublic var1,var2,lab1data1 var1 var2data1segmentdd ?db 10 dup(?)endscode1 segment assume cs:code1, ds:data1mainproc farmov ax,data1 mov ds,axlab1:mov ax,4c00hint 21hmain endpcode1 ends end start ; 模块 2 extrn var1:dword,var2:byte,lab1:n

34、ear,lab3:far public var3,lab2data2segmentvar3dw ?data2endscode2segmentassume cs:code2, ds:data2lab2:code2endsend; 模块 3extrn var1:dword,var2:byte,lab1:near,lab2:farpublic lab3code3 segmentassume cs:code3 lab3: code3 endsend14. 主程序CALLMU定义堆栈段,数据段和代码段,并把段寄存器初始化;数据段 中定义变量QTY和PRICE;代码段中将PRICE装入AX,QTY装入BX

35、,然后调用子程 序SUBMU程序SUBMU没有定义任何数据,它只简单地把AX中的内容(PRICE)乘 以BX中的内容(QTY),乘积放在DX,AX中.请编制这两个要连接起来的程序 datasgsegme ntqtydw 2pricedw 4datasgendsstacksg segmentdw 100 dup(?)toslabel wordstacksg endscodesgsegmentmainproc farassume cs:codesg,ds:datasg,ss:stacksgstart:mov ax,datasgmov ds,axmov ax,stacksgmov ss,axmov sp,offset tosmov ax,price mov bx,qty call submul mov ax,4c00hint 21h mainendpsubmul proc near mov dx,0 mul bxret submul endp codesg ends end start15. 试编写一个执行以下计算的子程序 COMPUTE:R<-X+Y-3其中X,Y及R均为字数组.假设COMPUTE其调用程序都在同一代码段中,数据段 D_SE防包含X和Y数组,数据段E_SEG中包含R数组,同时写出主程序调用 COMPUT过程的部分.如果主程序和COMPUTt同一程

温馨提示

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

评论

0/150

提交评论