logo资料库

汇编第三次试验报告-武汉理工大学.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
汇编语言实验报告
汇编语言实验报告 学院 计算机科学与技术学院 专业 计算机科学与技术专业 班级 学号 姓名 实验时间: 2011 年 11 月 一、 实验名称:子程序设计 二、 实验内容及要求: 理解 CALL 和 RET 指令,以及子程序的调用与返回过程;掌握子程序的结构, 及相关的设计方法;能合理地分解程序功能,有效地支持功能的重用。 三、 实验使用的关键技术和方法: 关键技术 方法 DOS 系统功能的 调用 MOV AH,01 AL=输入字符 INT 21H MOV AH,02 DL=输出字符 INT 21H MOV AH,09 DS:DX=串地址 INT 21H 子程序的调用与返回 Call DST ret 保存与恢复寄存器 Push ax pop ax 子程序的参数传送 通过寄存器传送,通过存储器传送 等
1: 习题 5.22:从键盘输入一系列字符(以回车符结束),并按字母、数字及其他 字符分类计数,最后显示这三类字符的计数结果(使用子程序 BINIDEC)。 子程序 BINIDEC:将 BX 中的无符号数用十进制数的形式输出。 2::编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及 8 个字符的电 话号码,并以一定的格式显示出来。 主程序 TELIST:  显示提示符“INPUT NAME:”;  调用子程序 INPUT_NAME 输入姓名;  显示提示符“INPUT A TELEPHONE NUMBER:”;  调用子程序 INPHONE 输入电话号码;  调用子程序 PRINTLINE 显示姓名及电话号码。  调用键盘输入子程序 GETCHAR,把输入的姓名存放在 INBUF 缓冲 子程序 INPUT_NAME: 区中; 子程序 INPHONE:  把 INBUF 中的姓名移入输出行 OUTNAME。  调用键盘输入子程序 GETCHAR,把输入的 8 位电话号码存放在 INBUF 缓冲区中;  把 INBUF 中的号码移入输出行 OUTPHONE。 子程序 PRINTLINE: 显示姓名及电话号码,格式为: NAME TEL. X X X XXXXXXXX 3. 解释执行一个算术运算表达式(至少可以执行加法和减法运算,自定义表达 式中数据的精度) 四、 实验设计方案说明: 习题 5.22 代码 DATAS SEGMENT ALPHA DB 'The total of alpha is:','$' NUMBER DB 'The total of number is:','$' OTHER DB 'The total of other is:','$' BUF DB 7 DUP(0),'$' CRLF DB 0DH,0AH,'$' DATAS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS START: PUSH DS SUB AX,AX
PUSH AX MOV AX,DATAS MOV DS,AX MOV BX,0 MOV SI,0 MOV DI,0 INPUT: MOV AH,01H INT 21H CMP AL,0DH JE DISP CMP AL,30H JAE L1 OTHERS: L1: L2: L3: L4: L5: INC DI JMP SHORT INPUT CMP AL,39H JA L2 INC SI JMP SHORT INPUT CMP AL,41H JAE L3 JMP SHORT OTHERS CMP AL,5AH JA L4 INC BX JMP SHORT INPUT CMP AL,61H JAE L5 JMP SHORT OTHERS CMP AL,7AH JA SHORT OTHERS INC BX JMP SHORT INPUT DISP: LEA DX,CRLF MOV AH,09H INT 21H LEA DX,ALPHA
CALL DISPLAY LEA DX,NUMBER MOV BX,SI CALL DISPLAY LEA DX,OTHER MOV BX,DI CALL DISPLAY RET MAIN ENDP DISPLAY PROC NEAR MOV AH,09H INT 21H CALL BINIDEC LEA DX,CRLF MOV AH,09H INT 21H RET DISPLAY ENDP BINIDEC PROC NEAR PUSH AX PUSH SI PUSH DX MOV AX,BX MOV CX,10 LEA SI,BUF+6 EXCHANGE: MOV DX,0 DIV CX ADD DL,30H MOV [SI],DL DEC SI OR AX,AX JNZ EXCHANGE LEA DX,BUF MOV AH,09H INT 21H POP DX POP SI
POP AX RET BINIDEC ENDP CODES ENDS END MAIN 习题 6.9 代码 DATAS SEGMENT INPUTNAME DB 'Please input name:','$' INPUTTELE DB 'Please input a telephone number:','$' OUTNAME DB 16 DUP(' '),'$' OUTPHONE DB 12 DUP(' '),0DH,0AH,'$' MESG DB 'NAME',12 DUP(' '),'TEL',0DH,0AH,'$' CRLF DB 0DH,0AH,'$' INBUF DB 12 DUP(' '),'$' DATAS ENDS STACKS SEGMENT DW 100 DUP(?),'$' TOS LABEL WORD STACKS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,STACKS MOV SS,AX MOV SP,OFFSET TOS PUSH DS SUB AX,AX PUSH AX MOV AX,DATAS MOV DS,AX MOV ES,AX BEGIN: LEA DX,INPUTNAME MOV AH,09H INT 21H CALL INPUT_NAME LEA DX,INPUTTELE MOV AH,09H INT 21H
CALL INPHONE CALL PRINTLINE RET MAIN ENDP INPUT_NAME PROC NEAR CALL GETCHAR LEA SI,INBUF LEA DI,OUTNAME MOV CX,12 CLD REP MOVSB RET INPUT_NAME ENDP INPHONE PROC NEAR CALL GETCHAR LEA SI,INBUF LEA DI,OUTPHONE MOV CX,12 CLD REP MOVSB RET INPHONE ENDP GETCHAR PROC NEAR MOV AL,20H MOV CX,12 LEA DI,INBUF CLD REP STOSB MOV CX,12 MOV DI,0 INPUT: MOV AH,1 INT 21H CMP AL,0DH JZ QUIT MOV INBUF[DI],AL INC DI LOOP INPUT QUIT: CALL DISP_CRLF
RET GETCHAR ENDP PRINTLINE PROC NEAR LEA DX,MESG MOV AH,09H INT 21H LEA DX,OUTNAME MOV AH,09H INT 21H LEA DX,OUTPHONE MOV AH,09H INT 21H RET PRINTLINE ENDP DISP_CRLF PROC NEAR LEA DX,CRLF MOV AH,09H INT 21H RET DISP_CRLF ENDP CODES ENDS END MAIN 五、 测试及评估 习题 5.22 图 习题 6.9 图
第三题代码 DATAS SEGMENT EXPRESSION DB 20 DUP(' '),'$' DATAS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATAS MOV DS,AX LEA SI,EXPRESSION L1: MOV AH,01H INT 21H MOV [SI],AL INC SI CMP AL,0DH JNE L1 MOV [SI],'$' MOV AH,02H MOV DL,0DH INT 21H MOV DL,0AH INT 21H CALL CAL RET 六、 设计心得 通过本次试验,我对子程序结构的设计方法有了一定的认识,子程序相当 于高级语言中的过程和函数。在一个程序的不同部分,往往要用到类似的程序段, 这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把 这些程序段写成子程序的形式,以便需要时可以调用它。
分享到:
收藏