Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > сложение двоичных чисел в прямом коде


Автор: VertiVertu 19.4.2009, 15:06
нужно сложить 2 двоичных числа в прямом коде
на пальцах знаю как сделать,а вот в асме полный 0
смотрел похожие темы,но как на встроенном в C++ builder написать нигде не нашел
Помогите плз!!!

Автор: spin2 19.4.2009, 16:17
add?

Автор: VertiVertu 19.4.2009, 16:26
Это да,наверное,а как там можно реализовать проверки на переполнение и т.д.?
впринципе,если я правильно понимаю,сложение в прямом коде=Сложение чисел размером N байт с учетом знака? я прав?

Автор: ir4y 19.4.2009, 21:02
у процессора совместимого x86 есть несколько команд для сложения
в данном случае думаю интересны тока 2
add op1,op2  - сложение целых знаковых чисел БЕЗ учета переноса
adc op1,op2   - сложение целых знаковых чисел С учетом переноса

один из операндов обязательно должен быть регистром

в результате сумма будет записана в op1


теперь касательно переполнения
если в результате выполнения команды число вышло из разрядной сетки то происходит перенос

Перенос в процессорах совместимых x86 происходит с помощью установки C флага в 1 (значение флага может быть 1 или 0, 1 - флаг установлен, 0 - флаг не установлен)
команда adc op1,op2 добавит к результату еще и значение С флага.
очистить/установить значение С флага можно с помощью команд
clc  - очистить С флаг
stc - установить С флаг

так же в зависимости от значения С флага (как и любого другого) можно менять ход исполнения программы, с помощью условных переходов
jc   -  переход если C флаг установлен
jnc -  переход если С флаг не установлен

Цитата

впринципе,если я правильно понимаю,сложение в прямом коде=Сложение чисел размером N байт с учетом знака? я прав?

впринципе правильно...

Автор: VertiVertu 19.4.2009, 22:44
Спасибо большое,еще вопрос есть,допутим произошло переполнение и по jc перешли в стадию исправления,т.е. теоритичестки надо производить расширение знака.как это сделать?

Автор: Mikl_ 20.4.2009, 03:30
Цитата(VertiVertu)
теоритичестки надо производить расширение знака.как это сделать?

два варианта
1) результат в AL, AX, EAX -- расширенный результат должен быть в AX, DX:AX, EDX:EAX -- при помощи команд CBW, CWD, CDQ соответственно
2) результат не обязательно в AL, AX, EAX -- расширенный результат в любом регистре соответствующего размера или в ячейке памяти -- используется команда MOVSX 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)