Двоичные числа с плавающей точкой (сложение) - 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 };
Объяснение кода листинга программы
Код выполняет сложение двух двоичных строк с плавающей точкой, представляемых в виде последовательности двоичных цифр. Список действий:
- Инициализация регистров:
- ECX содержит индекс текущего символа
- EBX содержит адрес результирующей строки
- ESI содержит адрес первой строки
- EDI содержит адрес второй строки
- AL и AH содержат текущие символы первой и второй строк соответственно
- DL содержит значение переноса
- RES содержит результат сложения
- Начинается цикл сложения, который выполняется до тех пор, пока не будут выполнены условия выхода из цикла:
- Если результат равен 11 (3 в десятичной системе), выполняется переход к метке A3
- Если результат равен 0, выполняется переход к метке A0
- Если результат равен 10 (2 в десятичной системе), выполняется переход к метке A2
- В циклах выполняется следующая последовательность действий:
- Результат сложения текущих символов записывается в RES
- Если результат равен 1, значение переноса устанавливается равным 1
- Индекс увеличивается на 1
- Если индекс меньше или равен длине строки, выполняется продолжение цикла
- Если результат равен 11 (3 в десятичной системе), выполняется следующая последовательность действий:
- Значение переноса устанавливается равным 1
- Индекс увеличивается на 1
- Если индекс меньше или равен длине строки, выполняется продолжение цикла
- Если результат равен 0, выполняется следующая последовательность действий:
- Значение переноса устанавливается равным 0
- Индекс увеличивается на 1
- Если индекс меньше или равен длине строки, выполняется продолжение цикла
- Если результат равен 10 (2 в десятичной системе), выполняется следующая последовательность действий:
- Значение переноса устанавливается равным 0
- Индекс увеличивается на 1
- Если индекс меньше или равен длине строки, выполняется продолжение цикла
- По завершении цикла выполняется следующая последовательность действий:
- В RES записывается значение переноса
- Индекс увеличивается на 1
- Если индекс меньше или равен длине строки, выполняется продолжение цикла
- По завершении цикла выполняется следующая последовательность действий:
- Если индекс меньше или равен длине строки, выполняется продолжение цикла
- Если индекс больше длины строки, выполняется переход к метке endadd
- Если индекс больше длины строки, выполняется следующая последовательность действий:
- В RES записывается символ конца строки
- Выполняется переход к метке endadd
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д