Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел. Проблем не возникает до тех пор, пока значение результата не превышает размерности поля операнда (). Например, при сложении операндов размером в байт результат не должен превышать число 255. Если это происходит, то результат оказывается неверным. Рассмотрим, почему так происходит. К примеру, выполним сложение: 254 + 5 = 259 в двоичном виде. 11111110 + 0000101 = 1 00000011. Результат вышел за пределы восьми бит и правильное его значение укладывается в 9 бит, а в 8-битовом поле операнда осталось значение 3, что, конечно, неверно. В микропроцессоре этот исход сложения прогнозируется и предусмотрены специальные средства для фиксирования подобных ситуаций и их обработки. Так, для фиксирования ситуации выхода за разрядную сетку результата, как в данном случае, предназначен флаг переноса cf. Он располагается в бите 0 регистра флагов eflags/flags. Именно установкой этого флага фиксируется факт переноса единицы из старшего разряда операнда. Естественно, что программист должен предусматривать возможность такого исхода операции сложения и средства для корректировки. Это предполагает включение участков кода после операции сложения, в которых анализируется флаг cf. Анализ этого флага можно провести различными способами. Самый простой и доступный — использовать команду условного перехода . Эта команда в качестве операнда имеет имя метки в текущем сегменте кода. Переход на эту метку осуществляется в случае, если в результате работы предыдущей команды флаг cf установился в 1. Если теперь посмотреть на , то видно, что в системе команд микропроцессора имеются три команды двоичного сложения:
inc операнд — операция инкремента, то есть увеличения значения операнда на 1;
add операнд_1,операнд_2 — команда сложения с принципом действия: операнд_1 = операнд_1 + операнд_2
adc операнд_1,операнд_2 — команда сложения с учетом флага переноса cf. Принцип действия команды:
операнд_1 = операнд_1 + операнд_2 + значение_cf
|
Листинг 3. Вычисление суммы чисел <1> ;prg_8_3.asm <2> masm <3> model small <4> stack 256 <5> .data <6> a db 254 <7> .code ;сегмент кода <8> main: <9> mov ax,@data <10> mov ds,ax <11> ... <12> xor ax,ax <13> add al,17 <14> add al,a <15> jnc m1 ;если нет переноса, то перейти на m1 <16> adc ah,0 ;в ax сумма с учетом переноса <17> m1: ... <18> exit: <19> mov ax,4c00h ;стандартный выход <20> int 21h <21> end main ;конец программы |