1、 实验四 汇编程序编写和提高 实验作业截止日 2015年4月6日(星期一)23:59:59 (编写程序和画程序流程图) 1、 编写一个汇编程序,先键盘输入的多个小写字母,回车后用大写字母显示出来。 2、 将键盘上输入的十六进制数转换成十进制数,并在屏幕上显示。 3、 利用中断调用,在屏幕上显示1—9之间随机数。中断号86H 4、 键盘输入10个学生的成绩,编写一个程序统计60-69分,70-79分,80-89分,90-99分及100分的人数,分别存放在Score6,Score7,Score8,Score9和Score10单元中。 【输入10个学生的成绩如下】65 65
2、98 78 82 88 95 72 62 90 100 1 DATAS SEGMENT n db 100 dup(?) ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT stack db 128 dup(?) ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX lea si,n mov ah,
3、1 next: int 21h cmp al,13 jz done cmp al,'a' jl noop cmp al,'z' jg noop sub al,20h noop: mov [si],al inc si jmp next done: mov ah,2 mov dl,13 int 21h mov dl,10 int 21h mov byte ptr[s
4、i],'$' mov ah,9 lea dx,n int 21h ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START 2 DATAS SEGMENT H1 DB 5 H2 DB ? H3 DB 5 DUP(?) D DB 5 DUP(?),'$' MES DB 'Input four hexadecimal number:','$' en DB 10,13,10
5、13,'$' ERR DB 'ERROR','$' OF DB 'Overflow!','$';此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX LEA DX,MES MOV AH,9 INT 21H LEA DX,H1 MOV AH,0AH INT
6、21H MOV CX,4 ;对输入的ASC2字符做数值化处理 LEA SI,H3 AGIN: CMP BYTE PTR[SI],'0' JB ERROR CMP BYTE PTR[SI],'9' JA Aa SUB BYTE PTR[SI],'0' JMP OVER Aa: CMP BYTE PTR[SI],'A' JB ERROR CMP BYTE PTR[SI],'F' JA a SUB BYTE PTR[SI],7 SUB BYTE PTR[SI],'0' JMP OVER a: C
7、MP BYTE PTR[SI],'a' JB ERROR CMP BYTE PTR[SI],'f' JA ERROR SUB BYTE PTR[SI],39 SUB BYTE PTR[SI],'0' OVER: INC SI LOOPNE AGIN LEA SI,H3 ;把十六进制数值放入AX中 MOV AH,H3 MOV CL,4 SHL AH,CL INC SI OR AH,[SI] INC SI MOV AL,[SI] SHL AL,CL INC SI OR AL,[SI
8、] CMP AX,9999 ;比较 JA OVF MOV DX,0 ;转换 MOV BX,1000 DIV BX LEA SI,D MOV [SI],AL ADD BYTE PTR[SI],'0' MOV AX,DX MOV DX,0 MOV BL,100 DIV BL INC SI MOV [SI],AL ADD BYTE PTR[SI],'0' XCHG AL,AH MOV AH,0 MOV BL,10 DIV BL INC SI MOV [SI],AL
9、ADD BYTE PTR[SI],'0' INC SI MOV [SI],AH ADD BYTE PTR[SI],'0' LEA DX,en ;正确输出 MOV AH,9 INT 21H LEA DX,D MOV AH,9 INT 21H MOV DL,'D' MOV AH,2 INT 21H JMP ENDD OVF: LEA DX,en ;溢出输出 MOV AH,9 INT 21H LEA DX,OF MOV AH,9 INT 21H JMP EN
10、DD ERROR: ;错误输出 LEA DX,en MOV AH,9 INT 21H LEA DX,ERR MOV AH,9 INT 21H ENDD: ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START 3 DOSSEG .MODEL small .stack 100h .data second db 0 first db 0 .code start:
11、 mov ax,@data mov ds,ax s10: mov ah,2ch int 21h cmp first,0 jnz s20 mov first,1 mov second,dh s20: cmp second,dh jz s10 mov second,dh mov al,dl xor ah,ah mov bl,second xor bh,bh mul bx mov bx,9 xor dx,dx div bx add dl,'1' mov ah,2 int 21h
12、 mov ah,1 int 16h jz s10 mov ah,0 int 16h cmp ah,1 jnz s10 mov ah,4ch int 21h end start 4 Code Segment Assume CS:Code,DS:Code Score db 65,98,78,82,88,95,72,62,90,100 ; 成绩单 Elements equ ($-Score)/Type Score ;元素个数 S6 db 0 ;60-69分计数 S
13、7 db 0 ;70-79分计数 S8 db 0 ;80-89分计数 S9 db 0 ;90-99分计数 S10 db 0 ;100分计数 Start: push cs pop ds cld lea si,Score ; 成绩首地址 mov cx,Elements ;成绩数目 mov dl,10 ; 用于除10 Read_Score: lodsb ; 提取成绩 div dl ; 除10 cmp al,5 ; >5,及格 j
14、g $+4 mov al,5 ; <=5,不及格 sub al,5 ; 减5,分数段计数地址偏移量 xor ah,ah push ax pop bx inc S6[bx] ; 计数 loop Read_Score ; 循环,统计下一个成绩 cmp score,0 lea dx,s10 mov ah,09 int 21h Exit_Proc: mov ah,4ch ;结束程序 int 21h Code ENDS END Start






