资源描述
实验四 汇编程序编写和提高
实验作业截止日 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 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,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[si],'$'
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,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 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: CMP 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]
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
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 ENDD
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:
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
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分计数
S7 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,及格
jg $+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
展开阅读全文