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

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

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

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

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

textual
Листинг программы
  1.     _asm
  2.     {
  3.         xor ecx, ecx                    //ecx stores index of current symbol
  4.         xor dl, dl                      //perenos
  5.             mov ebx, res                    //address of result string
  6.             addit :
  7.         mov esi, A                      //address of 1st string
  8.             mov al, byte ptr[esi + ecx]     //al=A[i]
  9.             mov esi, B                      //address of 2nd string
  10.             mov ah, byte ptr[esi + ecx]     //ah=B[i]
  11.             add al, ah                      //A[i]+B[i]
  12.             add al, dl                      //+P
  13.             sub al, 060h                    //-2* '0' -- convertation to numbers
  14.             cmp al, 3                       //if res=11=3
  15.             je A3                           //goto A3
  16.             cmp al, 0                       //[else] if res=00=0
  17.             je A0                           //goto A0
  18.             cmp al, 2                       //[else] if res=10=2
  19.             je A2                           //goto A2
  20.             mov byte ptr[ebx + ecx], 031h   //res=01.  res[i]='1'
  21.             xor dl, dl                      //p=0
  22.             inc ecx                         //i++
  23.             cmp ecx, BinLen                 //if end of addition algorytm,
  24.             je endadd                       //goto exit code
  25.             jmp addit                       //else start new iteration
  26.             A3 :
  27.         mov byte ptr[ebx + ecx], 031h   //dl is already correct, we know that
  28.             inc ecx                         //i++
  29.             cmp ecx, BinLen                 //... endings of a0,a2,a3 are same
  30.             je endadd
  31.             jmp addit
  32.             A2 :
  33.         mov byte ptr[ebx + ecx], 030h   //res[i]=0
  34.             mov dl, 1                       //set p=1
  35.             inc ecx
  36.             cmp ecx, BinLen
  37.             je endadd
  38.             jmp addit
  39.             A0 :
  40.         mov byte ptr[ebx + ecx], 030h   //res[i]=0. p already =0
  41.             inc ecx
  42.             cmp ecx, BinLen
  43.             je endadd
  44.             jmp addit
  45.             endadd :
  46.         mov byte ptr[ebx + ecx], 0      //adding string end symbol
  47.     };

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

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы