You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于x86汇编实现三项赛事9次成绩的加权总分计算交互程序

解决x86汇编中9个赛事成绩输入的问题

嘿,既然你已经搞定了平均计算和加权分数的逻辑,那卡你的应该就是如何从控制台读取9个数值并转成汇编能直接计算的二进制数据对吧?毕竟x86汇编不像高级语言有现成的输入函数,得自己处理ASCII字符到数值的转换,下面给你一套实模式下(MASM/TASM兼容)的落地方案:

一、输入流程优化

先把9个数值拆成3组(对应3项赛事),每组3个成绩,这样用户输入更清晰,也方便你后续绑定赛事名称:

  • 先输出提示:"请输入[跳远]项目3次成绩(空格分隔,单位:cm):"
  • 读取用户输入的一行字符串(包含3个用空格/回车分隔的数字)
  • 把这行字符串拆成3个独立的数字字符串,再转成二进制整数/浮点数
  • 重复上述步骤,完成另外两项赛事的成绩输入

二、核心实现代码片段

1. 用DOS中断读取输入字符串

实模式下最常用的就是INT 21H的0AH功能,它能读取用户输入到预先定义的缓冲区:

; 定义输入缓冲区:最大100字符,第二个字节存实际输入长度,后面是输入内容
INPUT_BUF DB 100, ?, 100 DUP(0)

; 读取用户输入的子过程
READ_INPUT PROC
    MOV AH, 0AH
    LEA DX, INPUT_BUF
    INT 21H
    ; 把输入末尾的回车替换成字符串结束符0,方便后续处理
    MOV BL, INPUT_BUF+1
    MOV BH, 0
    MOV INPUT_BUF[BX+2], 0
    RET
READ_INPUT ENDP

2. ASCII字符串转二进制整数

用户输入的数字是ASCII字符(比如'123'对应31H、32H、33H),得转成汇编能计算的二进制数。逻辑很简单:初始化结果为0,遍历每个字符,结果 = 结果*10 + (字符-'0'):

; 字符串转无符号整数:DS:SI指向字符串首地址,返回AX=转换后的整数
STR_TO_INT PROC
    XOR AX, AX  ; 初始化结果为0
STR_LOOP:
    MOV BL, [SI]
    CMP BL, 0   ; 遇到字符串结束符就退出
    JE STR_EXIT
    CMP BL, ' ' ; 遇到空格也退出(用来分隔多个数字)
    JE STR_EXIT
    ; 计算:AX = AX*10 + (BL-'0')
    PUSH CX
    MOV CX, 10
    MUL CX      ; DX:AX = AX*10(如果成绩超过65535,要改用32位寄存器)
    POP CX
    SUB BL, '0'
    ADD AL, BL
    ADC AH, 0   ; 处理乘法和加法的进位
    INC SI
    JMP STR_LOOP
STR_EXIT:
    RET
STR_TO_INT ENDP

3. 拆分一行输入的3个数值

读取完一行后,遍历缓冲区,每次调用STR_TO_INT得到一个数值,然后跳过空格继续读下一个:

; 从INPUT_BUF读取3个整数,返回AX=第一个数,BX=第二个数,CX=第三个数
READ_THREE_NUMS PROC
    LEA SI, INPUT_BUF+2  ; 跳过缓冲区前两个控制字节
    ; 读取第一个数
    CALL STR_TO_INT
    MOV DX, AX  ; 暂存第一个数到DX
    ; 跳过空格分隔符
SKIP_SPACE1:
    MOV BL, [SI]
    CMP BL, ' '
    JNE SKIP_SPACE1_EXIT
    INC SI
    JMP SKIP_SPACE1
SKIP_SPACE1_EXIT:
    ; 读取第二个数
    CALL STR_TO_INT
    MOV BX, AX
    ; 跳过空格分隔符
SKIP_SPACE2:
    MOV BL, [SI]
    CMP BL, ' '
    JNE SKIP_SPACE2_EXIT
    INC SI
    JMP SKIP_SPACE2
SKIP_SPACE2_EXIT:
    ; 读取第三个数
    CALL STR_TO_INT
    MOV CX, AX
    ; 把第一个数从DX移回AX
    MOV AX, DX
    RET
READ_THREE_NUMS ENDP

三、整合到你的现有逻辑

你可以按这个流程调用:

  1. 用INT 21H的09H功能输出提示字符串(比如"请输入跳远项目3次成绩:$",注意结尾要加$作为终止符)
  2. 调用READ_INPUT读取用户输入的一行内容
  3. 调用READ_THREE_NUMS得到该赛事的3次成绩(存在AX、BX、CX中)
  4. 用你已有的平均计算逻辑算出该赛事的平均值
  5. 重复上述步骤3次,就能搞定9个数值的输入了

四、额外小提示

  • 如果需要处理小数成绩(比如1.85米),可以把字符串转成BCD码或者用FPU指令处理32位浮点数,逻辑和整数转换类似,只是要额外处理小数点
  • 可以加个简单的合法性检查(比如判断输入的字符是不是0-9),避免非法输入导致程序崩溃

内容的提问来源于stack exchange,提问作者Ruifeng Zhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:34:55