Assembly 如何修复此代码以执行;用减法除法;
我的程序应该用减法进行除法。然而,我得到的是毫无意义的结果作为输出。有人能帮我完成我的程序和循环吗? 多谢各位Assembly 如何修复此代码以执行;用减法除法;,assembly,division,subtraction,masm32,Assembly,Division,Subtraction,Masm32,我的程序应该用减法进行除法。然而,我得到的是毫无意义的结果作为输出。有人能帮我完成我的程序和循环吗? 多谢各位 div proc pushad mov ecx,firstInt mov ebx,0 subtracting: sub ebx,secondInt loop subtracting mov divResult,ebx popad ret divt endp 只要没有借钱,你就继续减法。如果发生借用,则您有以下计数: mov ecx, firstInt
div proc
pushad
mov ecx,firstInt
mov ebx,0
subtracting:
sub ebx,secondInt
loop subtracting
mov divResult,ebx
popad
ret
divt endp
只要没有借钱,你就继续减法。如果发生借用,则您有以下计数:
mov ecx, firstInt
mov ebx, -1
subtracting:
inc ebx
sub ecx, secondInt
jnb subtracting
mov divResult, ebx
编辑
上面的代码仍然缺少的是检查除法器是否为零。如果我们允许使用零除法,代码将永远运行,因为减去零将永远不会产生借用
这个简单的解决方案完成了任务,但对于大商贩来说,速度慢得令人无法接受。这就需要一个更好的解决方案,当然不违背“使用减法除法”的任务“aka”不要使用div
(或任何类似指令)”
要模拟div
指令:
divide:
mov eax, firstInt
xor edx, edx
div secondInt ; -> EDX is remainder, EAX is quotient
我们可以写:
simple:
mov edx, firstInt
mov eax, -1
.A: inc eax
sub edx, secondInt
jnb .A
add edx, secondInt ; -> EDX is remainder, EAX is quotient
这个简单解决方案的问题是,我们可能会多次减去一个小数字。如果我们能找到一种一次减去更多的方法呢?我们可以,如果我们减去除法器的二进制倍数(*1,*2,*4,*8,*16,…)。正是这些因素的总和产生了商 为了计算,例如,
503/20
,我们将减去以下值:
503 - (20 * 16) = 183
183 - (20 * 8) = 23
23 - (20 * 1) = 3 <-- is remainder
--
25 <-- is quotient
为了说明开发更好的解决方案的重要性,我对几个部分进行了计时:
simple complex divide
-------------- -------- --------
4294967295 / 1 8087730.0 µsec 3.0 µsec 0.3 µsec
2147483648 / 10 405994.0 µsec 1.3 µsec 0.1 µsec
47623 / 320 0.4 µsec 0.2 µsec 0.1 µsec
是最坏的情况4294967295/1
用于开始显示号码21474836482147483648/10
用于将320x200 256色视频模式偏移地址47623转换为(x,y)坐标47623/320
复合体中ecx
的init在哪里?这是除数吗?@PeterCordesECX
寄存器初始化为complex.C(第14行)ECX
扮演除法器的二进制倍数(更确切地说是其因子)的角色。在我给出的例子中,它变成了16,8,和1,总共产生了25,这是商。哦,我错过了循环从jmp
开始,到底部有mov ecx,80000000h
。德普。
simple complex divide
-------------- -------- --------
4294967295 / 1 8087730.0 µsec 3.0 µsec 0.3 µsec
2147483648 / 10 405994.0 µsec 1.3 µsec 0.1 µsec
47623 / 320 0.4 µsec 0.2 µsec 0.1 µsec