• 汇编语言程序(环境是dosbox)


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2401_85541766 2024-06-06 14:06 采纳率: 0% 浏览 9 首页/ 编程语言 / 汇编语言程序(环境是dosbox) 开发语言 问题:在电脑上通过键盘输入10个学生的成绩后,依次在界面上显示:及格人数x个,不及格人数y个。要求:提示输入10个学生成绩score,每个成绩数字之间空格隔开,键盘送入; 换行输出“10个学生成绩分别为……” 换行显示结果:及格人数x个,不及格人数y 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 14:06
      关注

      引自免费微信小程序:皆我百晓生

      要实现这个功能,你需要编写一个简单的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个学生成绩,程序会输出成绩列表以及及格和不及格的人数。

      展开全部

      评论 编辑记录
    • 阿里嘎多学长 2024-06-06 14:06
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      编写汇编语言程序通常需要对汇编语言和目标平台(在这个案例中是DOSBox)有较深的理解。下面是一个简单的汇编语言示例,它使用x86汇编语言和DOS中断来实现你的需求。请注意,这个示例是用NASM汇编器语法编写的,你可能需要根据你使用的汇编器调整语法。

      section .data
          prompt db '请输入10个学生的成绩,用空格隔开:', 0
          scores dw 10 dup(0) ; 用于存储10个成绩
          format db '10个学生成绩分别为:', 0
          result db '及格人数%d个,不及格人数%d个。', 0
          format2 db '%d ', 0
      
      section .bss
          x db 10 ; 用于存储及格人数
          y db 10 ; 用于存储不及格人数
      
      section .text
          global _start
      
      _start:
          ; 显示提示信息
          mov ah, 09h
          mov dx, prompt
          int 21h
      
          ; 接收10个成绩
          mov cx, 10
      input_loop:
          mov ah, 0Ah
          lea dx, [scores]
          int 21h
          ; 将输入的成绩转换为数字
          sub al, '0'
          mov bx, scores
          add [bx], ax
          add bx, 2
          loop input_loop
      
          ; 显示成绩
          mov ah, 09h
          mov dx, format
          int 21h
          mov bx, scores
          mov cx, 10
      display_loop:
          mov ax, [bx]
          add ax, '0'
          push ax
          mov ah, 09h
          mov dx, format2
          int 21h
          pop ax
          add bx, 2
          loop display_loop
      
          ; 计算及格和不及格人数
          xor ax, ax ; 清零计数器
          xor bx, bx
      count_loop:
          mov ax, [bx]
          cmp ax, 60 ; 假设及格分数为60
          jge pass
          inc byte [y]
          jmp continue
      pass:
          inc byte [x]
      continue:
          add bx, 2
          loop count_loop
      
          ; 显示结果
          mov ah, 09h
          mov dx, result
          int 21h
          mov ax, [x]
          add ax, '0'
          push ax
          mov ah, 09h
          mov dx, format2
          int 21h
          pop ax
          mov ax, [y]
          add ax, '0'
          push ax
          mov ah, 09h
          mov dx, format2
          int 21h
          pop ax
      
          ; 退出程序
          mov ax, 4C00h
          int 21h
      

      请注意,这个示例代码没有进行错误检查,比如输入的是否是数字,或者输入的数字是否在合理的范围内。在实际使用中,你可能需要添加这些检查。

      关于参考资料,你可以参考以下资源来学习汇编语言和DOS中断:

      1. x86 Assembly Guide - 一个关于x86汇编语言的指南。
      2. DOS Interrupts - DOS中断的详细列表和描述。
      3. NASM Documentation - NASM汇编器的官方文档。

      由于汇编语言和DOSBox环境的特殊性,你可能需要根据你的具体环境和需求调整上述代码。希望这个示例和参考资料能对你有所帮助。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    MQTT 主题通配符
    信息熵和热力学定律中的熵有关系吗?
    七日算法先导(三)—— 快速排序,插入排序
    Ubuntu18.04安装hls4ml+tensorflow-gpu
    thonny运行esp32项目时出现以下情况
    Java导出pdf格式文件
    《C++ Primer Plus》第十三章复习题和编程练习
    RNN变体——LSTM原理及代码实现
    【小程序】统计字符
    Spring Boot 的创建和运行
  • 原文地址:https://ask.csdn.net/questions/8114924