Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MASM中的分数和百分比-浮点?_Assembly_Masm - Fatal编程技术网

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归零。