引自免费微信小程序:皆我百晓生
要实现这个功能,你需要编写一个简单的DOS环境下运行的汇编语言程序。下面是一个使用TASM(Turbo Assembler)编译器的Masm32平台上的8086汇编语言示例代码。
首先,确保已经安装了TASM和Masm32工具链。然后,创建一个名为student_scores.asm的文件,并将以下代码粘贴到其中:
.386
.model small
.stack 100h
.data
prompt db '请输入10个学生成绩 (数字之间用空格隔开): $'
scorePrompt db '10个学生成绩分别为: $'
passMsg db '及格人数x个,不及格人数y个。$'
inputBuffer db 20 dup(?)
delimiter db ' ', 0
gradeThreshold db 60, 0
passCount dw ?
failCount dw ?
.code
main proc
; 显示提示信息并读取用户输入
mov ah, 9
lea dx, prompt
int 21h
; 输入成绩,直到遇到换行符
mov si, offset inputBuffer
readInput:
mov ah, 1
int 21h
cmp al, 13 ; 检查是否为回车键
je displayScores
stosb ; 存储字符到缓冲区
cmp byte ptr [si-1], 32 ; 检查是否为空格
jne readInput ; 如果不是空格,继续读取
jmp skipScore ; 如果是空格,跳过当前空格
; 处理最后一个成绩
skipScore:
stosb ; 存储最后一个成绩到缓冲区
jmp displayScores
; 显示成绩并计算及格/不及格数量
displayScores:
mov ah, 9
lea dx, scorePrompt
int 21h
mov si, offset inputBuffer
printScore:
lodsb ; 从缓冲区加载下一个成绩
cmp al, 0 ; 检查是否到达字符串末尾
je donePrinting
add dl, 30h ; 将ASCII码转换为可打印字符
mov ah, 2
int 21h
mov ah, 9
lea dx, delimiter
int 21h
jmp printScore
donePrinting:
mov ah, 9
lea dx, passMsg
int 21h
; 计算及格/不及格数量
mov cx, 10 ; 总共有10个成绩
mov di, offset inputBuffer
calculateCounts:
lodsb ; 加载下一个成绩
cmp al, gradeThreshold ; 比较成绩与及格线
ja incrementPass ; 如果大于等于及格线,增加及格数
inc failCount ; 否则,增加不及格数
jmp nextStudent
incrementPass:
inc passCount
nextStudent:
loop calculateCounts ; 对所有学生进行计数
; 输出结果
mov ax, passCount
call printNumber
mov ah, 9
lea dx, ', '
int 21h
mov ax, failCount
call printNumber
mov ah, 9
lea dx, '$'
int 21h
exitProgram:
mov ah, 4Ch
int 21h
printNumber proc near
push ax
push bx
push cx
push dx
mov bx, 10
xor cx, cx
countDown:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jnz countDown
printDigit:
pop dx
add dl, 30h
mov ah, 2
int 21h
dec cx
jnz printDigit
pop dx
pop cx
pop bx
pop ax
ret
printNumber endp
end main
接下来,使用TASM编译器编译代码:
tasm student_scores.asm -f obj
link student_scores.obj -o student_scores.exe
最后,在DOSBox或其他支持MS-DOS的环境中运行生成的student_scores.exe文件,按照提示输入10个学生成绩,程序会输出成绩列表以及及格和不及格的人数。
