Не могу разобраться с делением long int - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте уважаемые знатоки. при решении задачи никак не получается разделить двойное слово на байт.помогите пожалуйста разобраться. пример: b) A (longint) B (byte) C (integer) вычислить D = (A/B)*C E = (C^2/B)-A не получается именно первое действие A/B. уже весь интернет перекопал,ничего найти не могу пример кода:
#include "stdafx.h" 
#include "iostream" 

int _tmain(int argc, _TCHAR* argv[])
{
    long int A = 10, D, E;
    char B = 5;
    short int C = 4;
    /*
    D = (A/B)*c
    E = (A+B)+B
    */
 
    __asm
    {
    
        mov eax, A; 
        mov cl, B;
        cbw;
        cwd;
        
        IDIV CX;
        mov D,eax
        
    }
 
    printf("\n%d", D);
    getchar();
    return 0;
}

Решение задачи: «Не могу разобраться с делением long int»

textual
Листинг программы
org     100h
 
                mov     ebx,[Divisor]   ; movsx, если делим на байт
                mov     eax,dword [Dividend+4]
                mov     ecx,dword [Dividend]
 
                cdq
                idiv    ebx
 
                bt      eax,31
                sbb     eax,0           ; вычитаем единицу, если EAX отрицательный
 
                xchg    ecx,eax
                idiv    ebx
                ; результат в ECX:EAX, остаток в EDX
 
Dividend        dq      3               ; делимое
Divisor         dd      2               ; делитель

Объяснение кода листинга программы

Список элементов:

  1. org 100h — начало выполнения программы
  2. mov ebx,[Divisor] — перемещение делителя в регистр ebx
  3. mov eax,dword [Dividend+4] — перемещение старших 4 байт делимого в регистр eax
  4. mov ecx,dword [Dividend] — перемещение младших 4 байт делимого в регистр ecx
  5. cdq — преобразование 32-битного целого числа в 64-битное с учётом знака
  6. idiv ebx — деление ecx на ebx с учётом знака
  7. bt eax,31 — получение младшего бита результата
  8. sbb eax,0 — вычитание единицы, если EAX отрицательный
  9. xchg ecx,eax — обмен ecx и eax
  10. idiv ebx — деление ecx на ebx с учётом знака
  11. результат в ECX:EAX, остаток в EDX Dividend — делимое, равно 3 Divisor — делитель, равно 2

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5