| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 - переход если С флаг не установлен
впринципе правильно... |
| Автор: VertiVertu 19.4.2009, 22:44 |
| Спасибо большое,еще вопрос есть,допутим произошло переполнение и по jc перешли в стадию исправления,т.е. теоритичестки надо производить расширение знака.как это сделать? |
| Автор: Mikl_ 20.4.2009, 03:30 | ||
два варианта 1) результат в AL, AX, EAX -- расширенный результат должен быть в AX, DX:AX, EDX:EAX -- при помощи команд CBW, CWD, CDQ соответственно 2) результат не обязательно в AL, AX, EAX -- расширенный результат в любом регистре соответствующего размера или в ячейке памяти -- используется команда MOVSX |