Справочник по языку Ассемблера IBM PC


Команды преобразования типов - часть 2


  • Команды movsx и movzx, относящиеся к командам обработки строк (см. урок 11). Эти команды обладают полезным свойством в контексте нашей проблемы:

  •  

  • movsx операнд_1,операнд_2 — переслать с распространением знака. Расширяет 8 или 16-разрядное значение операнд_2, которое может быть регистром или операндом в памяти, до 16 или 32-разрядного значения в одном из регистров, используя значение знакового бита для заполнения старших позиций операнд_1. Данную команду удобно использовать для подготовки операндов со знаками к выполнению арифметических действий;

  • movzx операнд_1,операнд_2 — переслать с расширением нулем. Расширяет 8 или 16-разрядное значение операнд_2 до 16 или 32-разрядного с очисткой (заполнением) нулями старших позиций операнд_2. Данную команду удобно использовать для подготовки операндов без знака к выполнению арифметических действий.

К примеру, вычислим значение y = (a + b)/c, где a, b, c — байтовые знаковые переменные (листинг 7).

   Листинг 7. Вычисление простого выражения <1> ;prg_8_9.asm <2> masm <3> model small <4> stack 256 <5> .data <6> a db ? <7> b db ? <8> c db ? <9> y dw 0 <10> .code <11> main: ;точка входа в программу <12> ... <13> xor ax,ax <14> mov al,a <15> cbw <16> movsx bx,b <17> add ax,bx <18> idiv c ;в al — частное, в ah — остаток <19> exit: <20> mov ax,4c00h ;стандартный выход <21> int 21h <22> end main ;конец программы

В этой программе делимое для команды idiv (строка 17) готовится заранее. Так как делитель имеет размер байта, то делимое должно быть словом. С учетом этого сложение осуществляется параллельно с преобразованием размера результата в слово (строки 13–16). Для примера расширение операндов со знаком производится двумя разными командами — cbw и movsx. 




- Начало -  - Назад -  - Вперед -



Книжный магазин