Gentle Nick 2021-05-10 19:43 采纳率: 0%
浏览 40

汇编语言练习(dl帮帮,没学过)(加分项可以没有)

•随机⽣成N个score值,范围[0,100],统计:

  •当score>=90时,记为A;

  •当90>score>=75时,记为B;

  •当75>score>=60时,记为C;

  •当60>score时,记为D;

•汇总:

  •显示出N个score值

  •显示输出A、B、C、D四组成绩的百分⽐

•加分项:

  •交互UI;

  •分数⽀持浮点、汇总结果⽀持浮点

  •当Score > 100 或 Score < 0时提示异常

  • 写回答

1条回答 默认 最新

  • 电力电子空间 2024-07-01 13:45
    关注

    首先生成随机的分数,然后统计每个等级的分数个数,最后计算并显示每个等级所占的百分比。请确保在适当的环境中运行此代码,例如 DOSBox 或其他支持 x86 汇编语言的模拟器。

    .model small
    .stack 100h
    .data
    N               dw  20               ; 生成的分数个数
    scores          db  20 dup(?)        ; 存储分数的数组
    countA          dw  0                ; A 等级计数
    countB          dw  0                ; B 等级计数
    countC          dw  0                ; C 等级计数
    countD          dw  0                ; D 等级计数
    msgA            db  'Percentage of A: $'
    msgB            db  'Percentage of B: $'
    msgC            db  'Percentage of C: $'
    msgD            db  'Percentage of D: $'
    buffer          db  6, '     $'      ; 缓存用于转换数字为字符串
    
    .code
    main proc
        mov ax, @data
        mov ds, ax
        mov es, ax
    
        ; 初始化随机数种子
        mov ax, 0
        mov cx, N
        call generate_scores
    
        ; 统计各等级计数
        mov cx, N
        lea si, scores
        xor di, di
        
    count_loop:
        lodsb
        mov bx, ax
        cmp bx, 90
        jge A_grade
        cmp bx, 75
        jge B_grade
        cmp bx, 60
        jge C_grade
        jmp D_grade
        
    A_grade:
        inc word ptr countA
        jmp next_score
        
    B_grade:
        inc word ptr countB
        jmp next_score
        
    C_grade:
        inc word ptr countC
        jmp next_score
        
    D_grade:
        inc word ptr countD
        jmp next_score
        
    next_score:
        loop count_loop
    
        ; 显示分数
        mov cx, N
        lea si, scores
        call print_scores
    
        ; 计算和显示百分比
        mov ax, countA
        call print_percentage
        lea dx, msgA
        call print_string
        
        mov ax, countB
        call print_percentage
        lea dx, msgB
        call print_string
        
        mov ax, countC
        call print_percentage
        lea dx, msgC
        call print_string
        
        mov ax, countD
        call print_percentage
        lea dx, msgD
        call print_string
        
        ; 结束程序
        mov ax, 4c00h
        int 21h
    
    main endp
    
    ; 生成随机分数的过程
    generate_scores proc
        mov dx, 40h
        mov ah, 2ch
        int 21h
        add ax, dx
        mov word ptr [si], ax
        xor di, di
        
    generate_loop:
        call random
        mov [si+di], al
        inc di
        loop generate_loop
        ret
    generate_scores endp
    
    ; 生成随机数的过程
    random proc
        ; 这里使用简单的线性同余生成器
        mov ax, word ptr [si]
        mov dx, 0
        mov cx, 75
        mul cx
        add ax, 74
        mov word ptr [si], ax
        mov al, ah
        ret
    random endp
    
    ; 打印分数的过程
    print_scores proc
        lea dx, scores
        mov cx, N
    print_loop:
        lodsb
        call print_num
        loop print_loop
        ret
    print_scores endp
    
    ; 打印字符串的过程
    print_string proc
        mov ah, 09h
        int 21h
        ret
    print_string endp
    
    ; 打印百分比的过程
    print_percentage proc
        mov bx, N
        mov dx, 0
        div bx
        call print_num
        mov ah, 09h
        lea dx, buffer+2
        int 21h
        ret
    print_percentage endp
    
    ; 打印数字的过程
    print_num proc
        mov bx, 10
        xor cx, cx
    print_num_loop:
        xor dx, dx
        div bx
        add dl, '0'
        push dx
        inc cx
        cmp ax, 0
        jne print_num_loop
    
        lea si, buffer
        add si, cx
        mov byte ptr [si], '$'
    print_num_pop:
        pop dx
        mov [si-1], dl
        dec si
        loop print_num_pop
    
        lea dx, buffer+2
        mov ah, 09h
        int 21h
        ret
    print_num endp
    end main
    
    
    
    评论

报告相同问题?