版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 711-2026优质碳素结构钢热轧钢板和钢带
- GB/T 47913-2026绿色产品评价不锈钢
- 体检健康小贴士
- 肘关节综合征治疗-1
- 疼痛宣教健康教育方案
- 数字创业 课件 第七讲-数字平台
- 法律职业资格客观题真题精讲精练(带答案)
- UNIT 1 CULTURAL HERITAGE 高中英语必修第二册
- 七台河单招面试题及答案
- 汽车轮胎供应商质量不达标追究违约责任函4篇
- 2026年全国中级经济师之中级经济师经济基础知识考试综合能力题详细参考解析
- 2026江苏淮安淮阴区国家统计局淮阴调查队招聘编制外工作人员1人笔试参考题库及答案详解
- 2026年云南事业单位考试真题
- 电子书 -失效模式及影响分析 FMEA-AIAG-VDA-第一版
- 检验科实验室标本处理与运输指南
- 中层管理能力提升2026年培训课件
- 2026年衡水学院教师招聘考试参考试题及答案解析
- 2025春人教版七年级英语下册单词默写练习
- 药品注册岗位招聘笔试题(某大型国企)2025年试题集精析
- 福建省招标采购集团公司招聘笔试题库2026
- 2024年成都西岭文旅投资运营集团有限公司招聘笔试冲刺题(带答案解析)
评论
0/150
提交评论