Сборка IA-32: Как разделить 64-битное число со знаком на нечетное число (хранится в 2 регистрах) - PullRequest
0 голосов
/ 20 октября 2018

В архитектуре IA-32 , как разделить число со знаком на 3 (например, значение, хранящееся в 2 регистрах, edx: eax (a 64-)бит значение).Я хочу разделить все значение (64-разрядное) на 3, а не только 32-разрядное, и сохранить его в 2 регистрах.

Я предполагаю, что это можно сделать только с использованием сдвигов операции с imul работают только для умножения 32-битных чисел.Но нашли только решения для деления на 2^n числа.

Как мне этого добиться?

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете разделить любое число длины на 32-битное число с последовательными делениями, используя остаток от предыдущего деления как наиболее значимые 32 бита делимого для следующего деления, аналогично делению на длинные руки

Обратите внимание, что мне нужно исправить этот код для обработки отрицательных делителей, но он должен работать с положительными делителями и знаковыми дивидендами.

Обратите внимание, что этот код округляет в сторону отрицательной бесконечности: -10/3: quotient = -4, остаток = +2.Для обработки отрицательных делителей код может отрицать как делитель, так и делимое, а затем отрицать остаток после.

        mov     ecx,000000003h  ;ecx = signed dvsr (must be positive)
        mov     edi,0fedcba98h  ;edi:esi = signed dvnd
        mov     esi,076543210h
        ;; inputs

        mov     eax,edi         ;eax = upper 32 bits dvnd
        cdq                     ; sign-extend that into EDX:EAX

        idiv    ecx
        test    edx,edx         ;br if sign rmdr == sign dvsr
        jns     short div0
        dec     eax             ;dec quot
        add     edx,ecx         ;rem += dvsr

div0:   mov     edi,eax         ;edi = upper 32 bits quot
        mov     eax,esi         ;eax = lower 32 bits dvnd
        div     ecx           
        mov     esi,eax         ;esi = lower 32 bits quot
;                               ;edx = remainder
...