新手求助:汇编语言实现两输入数除法(计算车辆油耗)
汇编除法运算(每加仑英里数计算)问题修正
代码中的核心错误
- 输入值存储逻辑颠倒:
atod string执行后,输入的整数会存在eax寄存器中,但你写的是mov eax, number1(把内存中未初始化的number1值加载到eax),正确操作应该是mov number1, eax(把eax里的输入值存入number1)。第二个输入同理,需改为mov number2, eax而非mov ebx, number2。 - 除法操作数配置错误:你需要计算「满箱英里数(number2) ÷ 油箱加仑数(number1)」,x86架构的
div指令要求32位除法的被除数存储在edx:eax寄存器对中,除数为操作数。因此必须将number2加载到eax,number1加载到ebx,且执行div前必须清零edx(避免被除数包含垃圾值)。 - 结果转换对象错误:
div执行后,计算得到的商(每加仑英里数)会存在eax中,你却把ebx(除数)传给dtoa函数,应该传递eax来转换正确的计算结果。
修正后的完整代码
.586 .MODEL FLAT INCLUDE io.h ; header file for input/output .STACK 4096 .DATA number1 DWORD ? number2 DWORD ? prompt1 BYTE "Enter the number of gallons of gas the car can hold:", 0 prompt2 BYTE "Enter the number of miles you can drive on a full tank", 0 string BYTE 40 DUP (?) resultLxx BYTE "The miles per gallon your car gets is:", 0 mpg BYTE 11 DUP (?), 0 .CODE _MainProc PROC ; 读取油箱加仑数并存储 input prompt1, string, 40 ; 读取ASCII字符串 atod string ; 转换为整数,结果在eax mov number1, eax ; 将输入值存入number1 ; 读取满箱英里数并存储 input prompt2, string, 40 ; 读取ASCII字符串 atod string ; 转换为整数,结果在eax mov number2, eax ; 将输入值存入number2 ; 执行除法:number2 ÷ number1 mov eax, number2 ; 被除数(英里数)放入eax mov ebx, number1 ; 除数(加仑数)放入ebx mov edx, 0 ; 32位除法需清零edx,组成edx:eax作为被除数 div ebx ; edx:eax ÷ ebx,商在eax,余数在edx ; 转换结果为字符串并输出 dtoa mpg, eax ; 将商(每加仑英里数)转为ASCII字符串 output resultLxx, mpg ; 输出结果 mov eax, 0 ; 退出,返回码0 ret _MainProc ENDP END ; 源文件结束
关键步骤说明
- 输入处理:每次
atod转换完成后,立即把eax中的输入值存入对应内存变量,确保输入数据被正确持久化。 - 除法准备:明确被除数和除数的存放位置,清零
edx是32位除法的必要操作,否则div会把edx中的垃圾值当作被除数的高32位,导致计算完全错误。 - 结果转换与输出:
div执行后,商(即每加仑英里数)存储在eax中,将其传入dtoa转换为字符串后,再通过output指令输出结果。
内容的提问来源于stack exchange,提问作者gonedrac
相关产品推荐
相关产品推荐

