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

8086汇编语言如何设置输入长度、计算输入字符串大小及完成数值运算

8086汇编实现可变长度购票数量输入与票价计算方案

一、可变长度输入设置与输入长度获取

8086环境下使用DOS系统中断int 21h的0AH号功能实现带缓冲的字符串输入,天然支持获取实际输入长度,无需固定输入位数:

  • 缓冲区结构定义规则:
    • 第一个字节:设置允许输入的最大字符数,你的场景下最多输入2位数字+1个$,设置为3即可
    • 第二个字节:中断执行后会自动填充用户实际输入的字符数(不含末尾回车符)
    • 后续字节:存储用户输入的具体内容
      代码示例(数据段定义):
DATA SEGMENT
    input_buf DB 3, ?, 3 DUP(?) ; 输入缓冲区:最大长度3,第二字节存实际输入长度
    station DB 5 ; 示例:乘坐站点数,可根据你的逻辑提前赋值
    ticket_cnt DB ? ; 存储转换后的车票数量
    total DW ? ; 存储最终计算的总金额(放大100倍可保留两位小数,按需调整)
DATA ENDS

输入调用代码:

MOV AX, DATA
MOV DS, AX
LEA DX, input_buf
MOV AH, 0AH
INT 21H ; 执行输入,用户输入9$或99$后按回车即可

输入长度获取逻辑:
实际输入的数字长度 = input_buf + 1 存储的值 - 1(减去末尾的$字符),比如:

  • 用户输入9$:input_buf+1的值为2,数字长度=2-1=1
  • 用户输入99$:input_buf+1的值为3,数字长度=3-1=2

二、输入字符串转车票数量数值

根据得到的数字长度做对应转换即可:

MOV CL, input_buf + 1
DEC CL ; CL中现在是数字长度
LEA SI, input_buf + 2 ; SI指向第一个输入字符
; 先处理第一位数字
MOV AL, [SI]
SUB AL, 30H ; 转成数值
CMP CL, 1
JE SAVE_CNT ; 长度为1直接保存
; 长度为2的情况,第一位乘10加第二位
MOV BL, 10
MUL BL
INC SI
MOV BL, [SI]
SUB BL, 30H
ADD AL, BL
SAVE_CNT:
MOV ticket_cnt, AL

三、总金额计算实现

你的公式Total = 1.5 * 乘坐的站点数 * 车票数量 * 105%可以先把系数转成整数运算避免浮点操作:

  1. 先合并系数:1.5 * 105% = 1.575 = 63 / 40,公式简化为 Total = (站点数 * 车票数量 * 63) / 40
  2. 如果需要保留两位小数,可以把分子乘100后再做除法,结果就是放大100倍的整数金额
    计算代码示例:
MOV AL, station
MUL ticket_cnt ; AX = 站点数 * 车票数量
MOV BX, 63
MUL BX ; DX:AX = 站点数*车票数量*63
MOV BX, 40
DIV BX ; AX = 最终总金额(整数部分),DX = 余数可用来计算小数部分
MOV total, AX

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:00:00