Assembly MASM中的分数和百分比-浮点?
我对汇编非常陌生,我认为我的课程根本没有涉及浮点运算。在过去的几天里,我一直在寻找正确显示我答案的解决方案,但它不起作用 下面是我的代码片段:Assembly MASM中的分数和百分比-浮点?,assembly,masm,Assembly,Masm,我对汇编非常陌生,我认为我的课程根本没有涉及浮点运算。在过去的几天里,我一直在寻找正确显示我答案的解决方案,但它不起作用 下面是我的代码片段: marks1 DWORD ? ; int marks = ? (EAX) - stored in mtMarks DWORD ? ; int mtMarks (MID TERM MARKS) = ? (EBX) mtPercent DWORD ?
marks1 DWORD ? ; int marks = ? (EAX) - stored in
mtMarks DWORD ? ; int mtMarks (MID TERM MARKS) = ? (EBX)
mtPercent DWORD ? ; int mtPercent = ? (ECX)
mtResult DWORD ?,?
这是计算部分
EQUATION PROC
mov eax, marks1
mov ebx, mtMarks
mov edx, 0
cdq
div ebx
mov mtPercent, eax
mul ebx
mov mtResult, eax
ret
EQUATION ENDP
输出看起来像这样,因为我没有使用FPU,但我们以前从未学过它,有没有办法不用它来解决这个问题
输入获得的分数:20 输入期中考试总分:30分 输入期中考试的贡献百分比:50 中期结果(%):+0
以下是我解决问题的方法:
((标记1*100/mtMarks)*mtPercent)/100
EQUATION PROC
imul eax, [marks1], 100
mov ebx, mtMarks
xor edx, edx
div ebx
imul eax, [mtPercent]
mov ebx, 100
xor edx, edx
div ebx
mov mtResult, eax
ret
EQUATION ENDP
你可以先乘以100,得到的结果是56,而不是0.56。这就是所谓的“定点”。通常你会使用二进制定点(具有256这样的比例因子),但当你最终想要一个百分比时,十进制定点是有用的。好了,我已经乘以它了,它现在可以工作了!谢谢,请不要在问题中编辑答案。相反,回答你自己的问题,把它作为答案贴出来。(你甚至可以接受这个答案)你可以将前3条指令简化为
imul-eax,[marks1],100
和imul-eax,[mtPercent]
;您只需将100
放入div
的另一个寄存器中。或者,如果您保留将其结果写入EDX:EAX的加宽mul
,则不需要cdq
。事实上,您不应该将CDQ与DIV一起使用,而应该只与IDIV一起使用。如果您在edx:EAX中还没有64位数字,请在无符号DIV之前使用xor edx,edx将edx归零。