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
    是最坏的情况
  • 2147483648/10
    用于开始显示号码2147483648
  • 47623/320
    用于将320x200 256色视频模式偏移地址47623转换为(x,y)坐标

你应该检查这个数字是否足够大,这样你就可以减法了。你能给我举个例子吗?如果你想计算'divResult=firstInt/secondInt',你应该从firstInt中减去,而不是从0中减去。(我不会为您编写代码)。在
复合体中
ecx
的init在哪里?这是除数吗?@PeterCordes
ECX
寄存器初始化为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