在划分为nasm时,你如何围绕商数?

时间:2015-04-27 02:00:22

标签: assembly decimal nasm divide

我不确定m是否使用了错误的数据类型或错误的指令,或者除了div,idiv,fdiv之外什么似乎都给了我一个0的商。我想得到一些十进制数四舍五入到几位小数。我认为我也使用正确的寄存器进行划分。

mov ebp, 3          ;ebp = 3(constant) 
mov eax, edx            ;eax = edx(sum from previous calculation)
mov ecx,3           ;load upper half of dividend with zero
div ecx             ;divide double register ecx eax by 3

push eax
push msg6
call _printf
add esp, 8

我更改了printf中的格式,所以它以十进制格式显示但是仍然没有数字被分割似乎?

2 个答案:

答案 0 :(得分:1)

mov ebp, 3          ;ebp = 3(constant)
mov eax, edx        ;eax = edx(sum from previous calculation)
mov ecx,3           ;load upper half of dividend with zero
div ecx             ;divide double register ecx eax by 3

看起来你的分工方式错了!代码不符合评论的意思 如果EDX保留了之前计算的总和,那么您应将其移至EAX中,同时清除EDX以准备即将到来的分部。
这就是正确代码的外观:

mov ebp, 3          ;ebp = 3(constant)
mov eax, edx        ;eax = edx(sum from previous calculation)
mov edx, 0          ;load upper half of dividend with zero
div ebp             ;divide edx:eax by 3

要使用2位小数,可以在进行除法之前乘以100,然后在显示为文本的结果的最后2个字符之前插入小数点字符。

答案 1 :(得分:0)

div执行(无符号)整数除法。它意味着你得到一个整数商和一个小于除数的余数。

如果您不想使用浮点数,您可以将余数乘以10 ^ n并再次除以(n将是您想要的小数位数)。这个新商将是0到10 ^ n之间的整数,但您可以用它来表示小数点后的n位数。

要添加舍入,如果余数大于或等于divisor / 2,则应将此结果加1。

修改

这是(或多或少)您将手动获取小数的方法。 例如,为了得到带有两位小数的18/7,第一个除法产生商= 2,余数= 4

接下来,如果将剩余部分乘以100并再次划分

4*100/7 -> quotient=57, remainder=1

所以数字是2.57(截断)。要考虑舍入,你应该看看下面的数字是否小于5。如果最后一个余数小于除数/ 2,那就是这种情况。考虑在表示小数部分的数字上加1可以传播到整数部分(例如,用两位小数计算999/1000)。