Двоичные числа с плавающей точкой (сложение) - Assembler

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

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

Есть программа на c++ она передает в функцию 2 числа в двоичной сс, задача их сложить на ассемблере. Как это сделать? Сложение произвольных двоичных чисел с плавающей точкой с использованием обратных кодов При этом при выполнении арифметических действий сопроцессор эмулируется, т.е. при написании кода на ассемблере использовать функции сопроцессора НЕЛЬЗЯ

Решение задачи: «Двоичные числа с плавающей точкой (сложение)»

textual
Листинг программы
    _asm
    {
        xor ecx, ecx                    //ecx stores index of current symbol
        xor dl, dl                      //perenos
            mov ebx, res                    //address of result string
            addit :
        mov esi, A                      //address of 1st string
            mov al, byte ptr[esi + ecx]     //al=A[i]
            mov esi, B                      //address of 2nd string
            mov ah, byte ptr[esi + ecx]     //ah=B[i]
            add al, ah                      //A[i]+B[i]
            add al, dl                      //+P
            sub al, 060h                    //-2* '0' -- convertation to numbers
            cmp al, 3                       //if res=11=3
            je A3                           //goto A3
            cmp al, 0                       //[else] if res=00=0
            je A0                           //goto A0
            cmp al, 2                       //[else] if res=10=2
            je A2                           //goto A2
            mov byte ptr[ebx + ecx], 031h   //res=01.  res[i]='1'
            xor dl, dl                      //p=0
            inc ecx                         //i++
            cmp ecx, BinLen                 //if end of addition algorytm,
            je endadd                       //goto exit code
            jmp addit                       //else start new iteration
            A3 :
        mov byte ptr[ebx + ecx], 031h   //dl is already correct, we know that
            inc ecx                         //i++
            cmp ecx, BinLen                 //... endings of a0,a2,a3 are same
            je endadd
            jmp addit
            A2 :
        mov byte ptr[ebx + ecx], 030h   //res[i]=0
            mov dl, 1                       //set p=1
            inc ecx
            cmp ecx, BinLen
            je endadd
            jmp addit
            A0 :
        mov byte ptr[ebx + ecx], 030h   //res[i]=0. p already =0
            inc ecx
            cmp ecx, BinLen
            je endadd
            jmp addit
            endadd :
        mov byte ptr[ebx + ecx], 0      //adding string end symbol
    };

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

Код выполняет сложение двух двоичных строк с плавающей точкой, представляемых в виде последовательности двоичных цифр. Список действий:

  1. Инициализация регистров:
    • ECX содержит индекс текущего символа
    • EBX содержит адрес результирующей строки
    • ESI содержит адрес первой строки
    • EDI содержит адрес второй строки
    • AL и AH содержат текущие символы первой и второй строк соответственно
    • DL содержит значение переноса
    • RES содержит результат сложения
  2. Начинается цикл сложения, который выполняется до тех пор, пока не будут выполнены условия выхода из цикла:
    • Если результат равен 11 (3 в десятичной системе), выполняется переход к метке A3
    • Если результат равен 0, выполняется переход к метке A0
    • Если результат равен 10 (2 в десятичной системе), выполняется переход к метке A2
  3. В циклах выполняется следующая последовательность действий:
    • Результат сложения текущих символов записывается в RES
    • Если результат равен 1, значение переноса устанавливается равным 1
    • Индекс увеличивается на 1
    • Если индекс меньше или равен длине строки, выполняется продолжение цикла
  4. Если результат равен 11 (3 в десятичной системе), выполняется следующая последовательность действий:
    • Значение переноса устанавливается равным 1
    • Индекс увеличивается на 1
    • Если индекс меньше или равен длине строки, выполняется продолжение цикла
  5. Если результат равен 0, выполняется следующая последовательность действий:
    • Значение переноса устанавливается равным 0
    • Индекс увеличивается на 1
    • Если индекс меньше или равен длине строки, выполняется продолжение цикла
  6. Если результат равен 10 (2 в десятичной системе), выполняется следующая последовательность действий:
    • Значение переноса устанавливается равным 0
    • Индекс увеличивается на 1
    • Если индекс меньше или равен длине строки, выполняется продолжение цикла
  7. По завершении цикла выполняется следующая последовательность действий:
    • В RES записывается значение переноса
    • Индекс увеличивается на 1
    • Если индекс меньше или равен длине строки, выполняется продолжение цикла
  8. По завершении цикла выполняется следующая последовательность действий:
    • Если индекс меньше или равен длине строки, выполняется продолжение цикла
    • Если индекс больше длины строки, выполняется переход к метке endadd
  9. Если индекс больше длины строки, выполняется следующая последовательность действий:
    • В RES записывается символ конца строки
    • Выполняется переход к метке endadd

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


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

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

15   голосов , оценка 3.867 из 5
Похожие ответы