我不确定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中的格式,所以它以十进制格式显示但是仍然没有数字被分割似乎?
答案 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)。