8086的编程题(使用汇编语言)

1.编两个通用过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换成二进制数
2.在附加段中有一个数组,首地址为BUFF,数组中第一个字节存放了数组的长度.编一个程序在数组中查找0,找到后把它从数组中删去,后续项向前压缩,其余部分补0
3.编程序统计学生的数学成绩,分别归类90分~99分,80分~89分,70分~79分,60~69,及60分以下,并将各段的人数送入内存单元中.
1楼的大侠你速度好快啊,把剩下的第一题和第二题也做一下吧
总共有3题
第三题你编的有点复杂啊,有简化一点的吗?
大虾们能把第一题和第二题做一下吗?拜托了,全做完我再加20分

1、编两个通用过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换成二进制数。

; 本程序通过编译,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:将AX中的二进制数转换成压缩型BCD码
; 入口:AX=16位二进制数(因为压缩BCD码最大为:9999H,所以,AX的二进制值不能大于270FH)
; 出口:AX=转换后的压缩型BCD码
Binary_BCD Proc Near
push dx
push cx
push bx
push di
mov @@Temp_Save,0
mov @@Temp_Save[2],0 ;将临时两个字存储单元置0
mov bx,10
lea di,@@Temp_Save[3]
cld
@@Divide: xor dx,dx
div bx
mov [di],dl ;保存余数
dec di
test ax,0ffffh
jnz @@Divide
mov cl,4
mov ax,@@Temp_Save[2]
xchg ah,al
shl al,cl
shl ax,cl
mov dl,ah
mov ax,@@Temp_Save
xchg ah,al
shl al,cl
shl ax,cl
mov al,dl
pop di
pop bx
pop cx
pop dx
ret
@@Temp_Save dw 2 dup(?)
Binary_BCD EndP
; -----------------------------------------
; 功能:将AX中的压缩型BCD码转换成二进制数
; 入口:AX=压缩型BCD码
; 出口:AX=转换后的16位二进制数
BCD_Binary Proc Near
push dx
push cx
push bx
mov dx,ax
mov bx,10
mov cl,4
shr ah,cl
xchg ah,al
cbw
push dx
mul bx
pop dx
and dh,0fh
xchg dh,dl
push dx
xor dh,dh
add ax,dx
mul bx
pop dx
xchg dh,dl
xor dh,dh
push dx
shr dx,cl
add ax,dx
mul bx
pop dx
and dl,0fh
add ax,dx
pop bx
pop cx
pop dx
ret
BCD_Binary EndP
; -----------------------------------------
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
mov ax,3456
call Binary_BCD ;将AX中的二进制数转换成压缩型BCD码
call BCD_Binary ;将AX中的压缩型BCD码转换成二进制数
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

2、在附加段中有一个数组,首地址为BUFF,数组中第一个字节存放了数组的长度.编一个程序在数组中查找0,找到后把它从数组中删去,后续项向前压缩,其余部分补0。

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
BUFF db 10,56,78,35,0,89,51,63,0,76,123
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
lea si,BUFF ;数组首地址→si
lodsb ;读数组长度
xor ah,ah
push ax
pop cx ;数组长度→cx
Find_Zero: lodsb ;数组元素读入累加器al
cmp al,0 ;是否为0
jnz Next_One ;不是0,跳转,处理下一个元素
; -----------------------------------------
; 找到0,把它从数组中删去,后续项向前压缩,其余部分补0。
push si
pop di
dec di
push di
push cx
dec cx
rep movsb
mov byte ptr [si-1],0
pop cx
pop si
; -----------------------------------------
Next_One: loop Find_Zero
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

3.编程序统计学生的数学成绩,分别归类90分~99分,80分~89分,70分~79分,60~69,及60分以下,并将各段的人数送入内存单元中。

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码
; 入口:AL=二进制数;di=转换后的ASCII保存地址
; 出口:无
Dec_ASCII Proc Near
push si
push cx
push bx
push di
mov bl,10
xor cx,cx
lea di,@@Temp_Save[3]
cld
@@Divide: xor ah,ah
div bl
or ah,30h
mov [di],ah
dec di
inc cx
test al,0ffh
jnz @@Divide
push di
pop si
inc si
pop di
pop bx
push di
rep movsb
mov byte ptr [di],'$'
pop di
pop cx
pop si
ret
@@Temp_Save db 4 dup(?)
Dec_ASCII EndP
; -----------------------------------------
Score db 56,69,84,82,73,88,99,63,100,80,0,10,80,100,90,73,43,60,63,72,88,42,58,99,100,89,65,61,74,84,79,2,60,61,62,62,66,82,79,71,62,63 ; 成绩单
Elements equ ($-Score)/Type Score ;元素个数
Score_Tab db 6 dup(0) ; 各分数段计数
Resault db '00---59: '
Temp_STr db 4 dup ('$')
Score100 db '====100: '
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
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,分数段计数地址偏移量
cbw ;
push ax
pop bx
inc Score_Tab[bx] ; 计数增1
loop Read_Score ; 循环,统计下一个成绩
; 显示统计结果
mov bl,59h
mov cx,5
lea si,Score_Tab ;各分数段计数数组首地址
lea di,Temp_STr
lea dx,Resault ; 统计结果字符串地址
List_Resault:
lodsb ;读入计数值
call Dec_ASCII
mov ah,9 ; 显示统计结果
int 21h
call enter_CTLF
mov al,bl
add al,1
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov word ptr Resault,ax
mov al,bl
add al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov word ptr Resault[5],ax
pop cx
loop List_Resault
push si
push di
lea si,Score100
lea di,Resault
lea cx,Temp_STr
sub cx,di
rep movsb
pop di
pop si
lodsb ;读入计数值
call Dec_ASCII
mov ah,9 ; 显示统计结果
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-26
.MODEL SMALL
.STACK
.DATA
SCORES DB 0,10,80,100,90,73,43,60,63,72,88,42,58,99,100,89,65,61,74,84,79,2,60,61,62,62,66,82,79,71,62,63
COUNTS DW $-SCORES
MD DB '$'
SCOREE DB 0
SCORED DB 0
SCOREC DB 0
SCOREB DB 0
SCOREA DB 0
SE DB 'LEVER E: $'
SD DB 'LEVER D: $'
SC DB 'LEVER C: $'
SB DB 'LEVER B: $'
SA DB 'LEVER A: $'
.CODE
.STARTUP
CALL STATISTICS

MOV DX,OFFSET SE
CALL SHOWF
MOV AL,SCOREE
CALL SHOWRESULT
CALL ENTERF
;-------------
MOV DX,OFFSET SD
CALL SHOWF
MOV AL,SCORED
CALL SHOWRESULT
CALL ENTERF
;------------------
MOV DX,OFFSET SC
CALL SHOWF
MOV AL,SCOREC
CALL SHOWRESULT
CALL ENTERF
;-------------------
MOV DX,OFFSET SC
CALL SHOWF
MOV AL,SCOREC
CALL SHOWRESULT
CALL ENTERF
;----------------
MOV DX,OFFSET SB
CALL SHOWF
MOV AL,SCOREB
CALL SHOWRESULT
CALL ENTERF
;---------------
MOV DX,OFFSET SA
CALL SHOWF
MOV AL,SCOREA
CALL SHOWRESULT
CALL ENTERF
.EXIT 0
SHOWF PROC
MOV AH,09H
INT 21H
RET
SHOWF ENDP
SHOWRESULT PROC
CBW
MOV BX,AX
PUSH BX
MOV CL,4
SHR BL,CL
.IF BL!=0
MOV DL,BL
ADD DL,30H
MOV AH,02H
INT 21H
.ENDIF
POP BX
AND BL,0FH

MOV DL,BL
.IF BL>0AH
ADD DL,7
.ENDIF
ADD DL,30H
MOV AH,02H
INT 21H
RET
SHOWRESULT ENDP
STATISTICS PROC ;入口参数,将数组首地址和长度传入
MOV BX,OFFSET SCORES
MOV CX,COUNTS
MOV SI,0
.REPEAT
.IF BYTE PTR [BX][SI]<60
INC SCOREE
.ELSEIF BYTE PTR [BX][SI]<70
INC SCORED
.ELSEIF BYTE PTR [BX][SI]<80
INC SCOREC
.ELSEIF BYTE PTR [BX][SI]<90
INC SCOREB
.ELSEIF BYTE PTR [BX][SI]<=100
INC SCOREA
.ENDIF
ADD SI,1
.UNTILCXZ
RET
STATISTICS ENDP
ENTERF PROC
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
RET
ENTERF ENDP
END
相似回答