基于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
三、整合到你的现有逻辑
你可以按这个流程调用:
- 用
INT 21H的09H功能输出提示字符串(比如"请输入跳远项目3次成绩:$",注意结尾要加$作为终止符) - 调用
READ_INPUT读取用户输入的一行内容 - 调用
READ_THREE_NUMS得到该赛事的3次成绩(存在AX、BX、CX中) - 用你已有的平均计算逻辑算出该赛事的平均值
- 重复上述步骤3次,就能搞定9个数值的输入了
四、额外小提示
- 如果需要处理小数成绩(比如1.85米),可以把字符串转成BCD码或者用FPU指令处理32位浮点数,逻辑和整数转换类似,只是要额外处理小数点
- 可以加个简单的合法性检查(比如判断输入的字符是不是0-9),避免非法输入导致程序崩溃
内容的提问来源于stack exchange,提问作者Ruifeng Zhu
相关产品推荐
相关产品推荐

