Пример 4. Проверка при вычитании чисел без знака

masmmodel smallstack 256.data.code;сегмент кодаmain:;точка входа в программу...xor ax,axmov al,5sub al,10; вычитание - результат получается в дополнительном коде (отрицательный)jnc m1;нет переноса?neg al;в al модуль результатаm1:...exit:mov ax,4c00h;стандартный выходint 21hend main;конец программы

В этом примере выполняется вычитание. С указанными для этой команды вычитания исходными данными результат получается в дополнительном коде (отрицательный). Для того чтобы преобразовать результат к нормальному виду (получить его модуль), применяется команда neg, с помощью которой получается дополнение операнда. В нашем случае мы получили дополнение дополнения или модуль отрицательного результата. А тот факт, что это на самом деле число отрицательное, отражен в состоянии флага cf. Дальше все зависит от алгоритма обработки.

neg операнд — изменение знака (получение двоичного дополнения) операнда.

Команда выполняет инвертирование значения операнда и помещает результат на место операнда: операнд = 0 – операнд, то есть вычитает операнд из нуля.

Команду neg операнд можно применять:

  • •для смены знака;
  • •для выполнения вычитания из константы.

Дело в том, что команды sub и sbb не позволяют вычесть что-либо из константы, так как константа не может служить операндом-приемником в этих операциях. Поэтому данную операцию можно выполнить с помощью двух команд:

neg ax;смена знака (ax)...add ax,340;фактически вычитание: (ax)=340-(ax)

Советы

1. Сложение и вычитание знаковых и беззнаковых чисел проводятся по одним и тем же алгоритмам. ПК не знает какие числа (знаковые или беззнаковые) он складывает и вычитает, поэтому фиксирует в флагах CF OF особенности операций. Какие числа обрабатываются знает программист. Если предполагается, что работа идет с беззнаковыми числами, необходимо производить анализ флага CF, а OF не надо. Если предполагается, что работа идет со знаковыми числами, необходимо производить анализ флага ОF, а СF не надо.

2. Команды INC DEC занимают только один байт и работают быстрее, чем команды ADD SUB, занимающие три байта.

3. Команды ADD SUB устанавливают флажок переноса, а INC DEC нет

4. Кроме флагов cf и of в регистре eflags есть еще несколько флагов, которые можно использовать с двоичными арифметическими командами:

§ zf — флаг нуля, который устанавливается в 1, если результат операции равен 0, и в 1, если результат не равен 0;

§ sf — флаг знака, значение которого после арифметических операций (и не только) совпадает со значением старшего бита результата, то есть с битом 7, 15 или 31. Таким образом, этот флаг можно использовать для операций над числами со знаком.




double arrow
Сейчас читают про: