8086汇编语言如何设置输入长度、计算输入字符串大小及完成数值运算
8086汇编实现可变长度购票数量输入与票价计算方案
一、可变长度输入设置与输入长度获取
8086环境下使用DOS系统中断int 21h的0AH号功能实现带缓冲的字符串输入,天然支持获取实际输入长度,无需固定输入位数:
- 缓冲区结构定义规则:
- 第一个字节:设置允许输入的最大字符数,你的场景下最多输入2位数字+1个
$,设置为3即可 - 第二个字节:中断执行后会自动填充用户实际输入的字符数(不含末尾回车符)
- 后续字节:存储用户输入的具体内容
代码示例(数据段定义):
- 第一个字节:设置允许输入的最大字符数,你的场景下最多输入2位数字+1个
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.5 * 105% = 1.575 = 63 / 40,公式简化为Total = (站点数 * 车票数量 * 63) / 40 - 如果需要保留两位小数,可以把分子乘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
相关产品推荐
相关产品推荐

