Изучение операторов обмена XCHG и XLAT

Команда обмена XCHG позволяет обменивать содержимое любого общего регистра и ячейки памяти, а также любой пары общих регистров. Примеры:

XCHG AL, SEMA ;обмен содержимого байта памяти и регистра AL

XCHG CX,[BP] ;обмен содержимого слова памяти и регистра CX

XCHG AH,DL ;обмен байтами регистр- регистр

XCHG AX,CX ;обмен словами регистр-регистр

В команде XCHG нельзя использовать сегментные регистры.

Команда XLATзаменяет содержимое аккумулятора AL на байт из 256 байтной таблицы, начальный адрес которой находится в регистре BX (см. рисунок).

Алгоритм выполнения команды XLAT состоит из двух шагов:

a) прибавить содержимое регистра AL к содержимому регистра BX;

б) использовать результат как смещение в сегменте данных (относительно DS) и поместить адресуемый байт из памяти в регистр AL.

Команда XLAT обычно применяется для быстрого преобразования символов из одного символьного кода в другой. Команда XLAT транслирует содержимое одного байта в другое предопределенное значение. При передаче данных между персональными компьютерами и большими ЭВМ с помощью команда XLAT можно выполнять перекодировку данных между форматами ASCII и EBCDIC.

В следующем примере происходит преобразование цифр от 0 до 9 из кода ASCII в код EBCDIC. Представление цифр в ASCII выглядит как шестнадцатеричные 30...39, а в EBCDIC -как шестнадцатеричные F0...F9. Для команды XLAT необходимо определять таблицу перекодировки. Команда XLAT предполагает адрес таблицы в регистре BX, а транслируемый байт (например: поля ASCNO)- в регистре AL.

Следующие команды выполняют подготовку и трансляцию байта:

MOV bx, offset XLTBL

MOV AL,ASCNO

XLAT

Команда XLAT использует значение в регистре AL в качестве относительного адреса в таблице, т.е. складывает адрес в BX и смещение в AL. Если, например, AL содержит 32h, то адрес соответствующего байта в таблице будет XLTBL+50. Этот байт содержит значение 0F2h (2 в коде EBCDIC), которое команда XLAT загружает в регистр AL.

Пример использования в программе оператора XLAT.

В данном примере производится преобразование шести значений из таблицы ASCNO (код ASCII) в код XLTAB. Результат заносится в область памяти с начальным адресом EBCNO.

Assume cs:preob, ds:tabl
tabl segment
ascno db 33h, 35h, 32h, 35h, 37h, 33h
xltab db 0f0h, 0f1h, 0f2h, 0f3h, 0f4h
db 0f5h, 0f6h, 0f7h, 0f8h, 0f9h
ebcno db 6 dup(?)
tabl ends
Preob segment
start:    
  mov ax, tabl ;инициализация сегментного регистра ds
  mov ds, ax
  mov di, offset ebcno ;адрес таблицы перекодируемых элементов заносится в регистр di
  mov si, offset ascno ; адрес таблицы куда заносится результат
  mov bx,offset xltab ;адрес таблицы, с помощью которой производится преобразование, заносится в регистр bx
  mov cx, 6 ;инициализация счетчика числа перекодируемых элементов A20: очередной перекодируемый байт
  mov al, [si] ; в al
  sub al,30h ;преобразование ascii кода в число
  xlat ; преобразование содержимого al в код ebcdic
  mov [di], al ;запись преобразованного значения в память
  inc di ;смещение указателя адреса памяти на следующий байт
  inc si ;смещение указателя адреса памяти на следующий байт
  loop a20 ;если cx <>0, переход на метку а20
  ret  
  Preob ends  
  End start  

 

Индивидуальные задания

Вариант 1.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 2516h, 630h, 1841h, 3345h, 123h;

2. цепочка символов 'кмпотхд';

3. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из первого слова последовательности (1) вычитает третье слово этой последовательности, а результат складывает со вторым словом;

3. младший байт полученного результата записывается в первый байт последовательности (3), от старшего байта результата вычитается значение 10h, полученное значение заносится во второй байт последовательности (3). В третий байт этой последовательности заносится инкрементированное значение младшего байта результата, полученного в п.2.

4. в регистр SI заносится значение адреса последовательности (2), в регистр BX - значение адреса (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 2.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 2499h, 2106h, 333h, 1821h, 3CB6h;

2. цепочка символов 'кмпотхд';

3. три байта без инициализации и один со значением '$'.

В программе необходимо предусмотреть выполнение следующих действий:

1. инициализировать сегментный регистр DS;

2. к первому слову последовательности (1) прибавить четвертое слово этой последовательности, а из результата вычесть пятое слово;

3. младший байт полученного результата записывается в третий байт последовательности (3), старший байт результата инкрементировать и результат занести в первый байт последовательности (3).

Во второй байт этой последовательности заносится декремент значения младшего байта результата, полученного в п.2.

4. в регистр DI заносится значение адреса последовательности (2), в регистр BX - значение адреса (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 3.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 1389h, 2145h, 326h, 2821h, 2265h;

2. цепочка символов 'кмпотхд';

3. три байта без инициализации и один со значением '$'.

В программе необходимо предусмотреть выполнение следующих действий:

1. инициализировать сегментный регистр DS;

2. к второму слову последовательности (1) прибавить третье слово этой последовательности, а из результата вычесть пятое слово;

3. младший байт полученного результата записывается в третий байт последовательности (3), из старшего байта результата вычитается значение 2 и результат заносится в первый байт последовательности (3). Во второй байт этой последовательности заносится

уменьшенное на 3 значение младшего байта результата, полученного в п.2.

4. в регистр DI заносится значение адреса последовательности (2), в регистр BX - значение адреса (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 4.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 4516h, 2221h, A212h, 1C10h, 6115;

2. цепочка символов 'кмпотхд';

3. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из второго слова последовательности (1) вычитает четвертое слово этой последовательности, старший байт результата записывает в первый байт последовательности (3);

3. третье слово последовательности (1) складывает с пятым словом этой последовательности, от младшего байта полученного результата вычитается значение 11 и результат записывается в третий байт последовательности (3), старший байт результата заносится во второй байт последовательности (3).

4. в регистр SI заносится значение адреса последовательности (2), в регистр BX - значение адреса последовательности (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 5.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 4576h, 27F0h, 3FF1h, 77F1h, 3713;

2. цепочка символов 'кмпотхд';

3. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из четвертого слова последовательности (1) вычитает второе слово этой последовательности, младший байт результата записывает в третий байт последовательности (3), старший байт результата, уменьшенный на 4D записывает во второй байт последовательности (3);

3. пятое слово последовательности (1) складывает с третьим словом этой последовательности, младший байт полученного результата записывает в первый байт последовательности (3),.

4. в регистр SI заносится значение адреса последовательности (2), в регистр BX - значение адреса последовательности (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 6.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 1F5h, A781h, CF84h, C0A4h, A483h

2. цепочка символов 'ХАПЛМТЕ'

3. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из третьего слова последовательности (1) вычитает пятое слово этой последовательности, младший байт результата записывает во второй байт последовательности (3);

3. первое слово последовательности (1) складывает с четвертым словом этой последовательности, от старшего байта полученного результата вычитается значение С2h и результат записывается в первый байт последовательности (3), младший байт результата уменьшенный на 95 заносится в третий байт последовательности (3).

4. в регистр SI заносится значение адреса последовательности (2), в регистр BX - значение адреса последовательности (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 7.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 324Ah, 765Eh, AEF1h, 45CDh, 8685h;

2. цепочка символов 'толкнха';

3. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. складывает первое и пятое слова последовательности (1) и из результата вычитает второе слово этой последовательности;

3. младший байт полученного результата уменьшенный на величину 71h записывается в третий байт последовательности (3), от старшего байта результата вычитается значение 41h, полученное значение заносится во второй байт последовательности (3). В первый байт этой последовательности заносится инкрементированное значение вновь полученного второго байта последовательности (3).

4. в регистр SI заносится значение адреса последовательности (2), в регистр BX - значение адреса (3), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 8.

Написать программу, в которой в сегменте данных резервируется:

1. шесть байт со значениями: 45h, 16h, 22h, 21h, 3Ch, F1h;

2. два слова со значениями: АА33h, 44F4h;

3. цепочка символов 'ТАПЕМХСК';

4. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из второго слова последовательности (2) вычитает третье слово последовательности (1), старший байт результата уменьшенный на величину 50h записывает во второй байт последовательности (4);

3. первое слово последовательности (1) складывает со вторым словом последовательности (2), от младшего байта полученного результата вычитается значение 32h и результат записывается в третий байт последовательности (4), старший байт результата уменьшенный на 56h заносится в первый байт последовательности (4).

4. в регистр SI заносится значение адреса последовательности (3), в регистр BX - значение адреса последовательности (4), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 9.

Написать программу, в которой в сегменте данных резервируется:

1. четыре слова со значениями: 1245h, FAC1h, 12C1h, 45C6h;

2. три байта со значениями 35h, 33h, F4h

3. цепочка символов 'таэпомхшк';

4. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. складывает первое и третье слова последовательности (1) , младший байт результата записывает во второй байт последовательности (4), старший байт результата уменьшенный на 23h заносит в первый байт последовательности (4);

3. второй байта последовательности (2) складывает с младшим байтом полученного в п.2 результата и вычитает первый байт последовательности (2), результат записывает в третий байт последовательности (4).

4. в регистр SI заносится значение адреса последовательности (3), в регистр BX - значение адреса последовательности (4), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 10.

Написать программу, в которой в сегменте данных резервируется:

1. четыре слова со значениями: 1245h, FAC1h, 12C1h, 45C6h;

2. три байта со значениями 27h, 80h, ABh

3. цепочка символов 'тапсорлик';

4. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. складывает третье и четвертое слова последовательности (1) . Из младшего байта результата вычитает второй байт последовательности (2), полученное значение записывает во второй байт последовательности (4), старший байт результата уменьшенный на 53h заносит в первый байт последовательности (4);

3. первый байт последовательности (2) складывает с младшим байтом полученного в п.2 результата и вычитает третий байт последовательности (2), результат записывает в третий байт последовательности (4).

4. в регистр SI заносится значение адреса последовательности (3), в регистр BX - значение адреса последовательности (4), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 11.

Написать программу, в которой в сегменте данных резервируется:

1. четыре слова со значениями: 245Fh, 7AC1h, 128Ch, 445Ch;

2. три байта со значениями 2Ch, 90h, 61h

3. цепочка символов 'тгаплросик';

4. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из второго слова последовательности (1) вычитает четвертое слово этой последовательности. Из младшего байта результата вычитает третий байт последовательности (2), полученное значение записывает в третий байт последовательности (4), старший байт результата уменьшенный на 30h заносит во второй байт последовательности (4);

3. первый байт последовательности (2) складывает с младшим байтом полученного в п.2 результата и вычитает второй байт последовательности (2), результат записывает в первый байт последовательности (4).

4. в регистр SI заносится значение адреса последовательности (3), в регистр BX - значение адреса последовательности (4), затем осуществляется обмен содержимым этих регистров;

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Вариант 12.

Написать программу, в которой в сегменте данных резервируется:

1. пять слов со значениями: 245Fh, 7AC1h, 128Ch, 445Ch, 2233h;

2. три байта со значениями 2Ch, 10h, 61h;

3. цепочка символов 'тлпрвсюоа';

4. три байта без инициализации и один со значением '$'.

Программа выполняет следующие действия:

1. инициализирует сегментный регистр DS;

2. из пятого слова последовательности (1) вычитает третье слово этой последовательности. К младшему байту результата добавляет значение 61h , полученное значение записывает в третий байт последовательности (4), из второго байта последовательности (2) вычитает старший байт результата и заносит полученное значение во второй байт последовательности (4);

4. дважды декрементированное значение третьего байта последовательности (4) (или содержимое AL) заносит в первый байт последовательности (4);

5. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (3) перекодировать, в качестве таблицы перекодировки взять последовательность символов (2).

6. используя адрес, хранящийся в SI (косвенную адресацию), три байта последовательности (4) перекодировать, используя таблицу - последовательность символов (3).

7. перекодированную последовательность вывести на экран, а результат наблюдать в отладчике в альтернативном окне. Вывод на экран строки символов см. в приложении.

 

Приложение.Выводимая на экран строка символов должна завершаться символом '$'. Вывод строки символов осуществляется с помощью программного прерывания 21h, при этом в регистр AH заносится номер функции - 9h, а в регистре DX должен храниться адрес выводимой последовательности, например:

MOV DX, OFFSET T1

MOV AH, 09h

INT 21h

Лабораторная работа № 5

Команды умножения

Операция умножение беззнаковых данных выполняется командой MUL.Существуют две основные операции умножения:

Умножение байта на байт:В этом случае множимое находится в регистре AL, а множитель в байте памяти или в многобайтовом регистре. После умножения произведение находится в регистре АХ. Операция игнорирует и стирает любые данные, которые находились в АН.

Пример. Пусть в сегменте данных зарезервировано три байта с определенными значениями, необходимо вычислить произведение 1-го и 3-го байтов. Фрагмент программы, демонстрирующий решение этой задачи, имеет вид:

Data segment
A DB 0fah, 0с7h, 0ach
B dw ?
Data ends
Code segment
. . .  
  Mov al, A ;в AL первый байт последовательности А
  Mul A+2 ;произведение в регистре АХ
  Mov B, ax ; результат заносится в память
  . . .  

 

Умножение слова на слово: Здесь множимое находится в регистре AХ, а множитель в слове памяти или в регистре. После умножения произведение образуется в двойном слове, для которого требуется два регистра: старшая часть произведения находится в регистре DХ, а младшая часть в регистре АХ.

пример. в сегменте данных два слова, требуется вычислить их произведение:

Data segment
A DW 0f3a7h, 20e7h, 0a4ech
B dw ?, ?
Data ends
Code segment
  . . .  
  Mov ax, a  
  Mul a+2 ;произведение в регистрах DX : АХ
  Mov b, dx ; результат
  Mov b+2, ax ; заносится в память
  . . .  

 

Команды деления

Операция деления для беззнаковых данных выполняется командой DIV,существуют две основные операции деления:

Деление слова на байт: Делимое находится в регистре AХ, а делитель в байте памяти или в однобайтовом регистре. Остаток от деления получается в АН, а частное в регистре АL.

пример.в сегменте данных зарезервированы два слова и два байта.

Разделить первое слово на второй байт:

Data segment
AC DW 0ecdah, 0CB78h
CC DB 0d7h, 0cdh
C1 dw ?, ?
C2 db ?, ?
Data ends
Code segment
   
  Mov ax, ac ; занесение делимого в регистр
  Div cc+1  
  Mov c2, ah ; результат заносится в память
  Mov c2+1, al ;эти два оператора можно заменить одним: MOV C1, AХ

 

Деление двойного слова на слово: Делимое находится в регистровой паре DX:AХ, а делитель в слове памяти или в регистре. Остаток от деления получается в DX, а частное в регистре АX.

пример. сегмент данных оформлен как в предыдущем примере. Требуется вычислить частное от деления двойного слова на слово, образованное из двух байтов:

 

Mov dx, ac ; в DX старшая часть делимого
Mov aх, ac+2 ; в АX младшая часть делимого
Mov bh, cc ; в регистре ВХ
Mov bl, cc+1 ; формируется слово делителя
Div bx ; деление
Mov c1, dx ; остаток от деления записывается в память
Mov c1+2, ax ; в память записывается частное от деления

 

Индивидуальные задания

Вариант № 1

Написать программу, в которой используются следующие данные: шесть слов со значениями X1=6А81h, X2=А356h, X3=FE32h, X4=A33h, X5=D310h X6=C12Ah. Вычислить (X1 + X2 + X3)/ X6. Частное от деления записать в память по адресу, следующему за последним шестым числом. Остаток умножить на четвертое число. Результат записать в память.

Вариант № 2

Написать программу, в которой используются следующие данные: шесть байтов со значениями АBh, CDh, EFh, 4Ah, CFh, 56h. Найти сумму второго и третьего байтов, из полученного результата вычесть четвертый байт. Результат умножить на слово 54АСh. Произведение разделить на слово, составленное из пятого и шестого байтов заданной последовательности. Полученный результат записать в память по адресу, следующему за указанной последовательностью.

Вариант № 3

Написать программу, в которой используются следующие данные: семь байтов со значениями АFh, 3Dh, 8Ah, 5Dh, FCh, EAh, EEh. Найти разность седьмого и второго байтов, результат сложить с третьим байтом и поделить на шестой байт. Частное от деления записать в память по адресу, следующему за заданной последовательностью. Остаток умножить на первый байт последовательности. Результат записать в память.

Вариант № 4

Написать программу, в которой используются следующие данные: пять байтов со значениями FDh, FFh, A3h, 3Fh, F2h и два слова: 3А66h, 5134h. Найти сумму второго и третьего байтов, результат умножить на второе слово и разделить на первое. Из остатка вычесть первое слово, результат записать в память, так же как и частное от деления.

Вариант № 5

Написать программу, в которой используются следующие данные: пять байтов со значениями C3h, F3h, 5Fh, 66h, E4h и три слова: 5А34h, 6FC1h, D1E2h. Найти сумму второго и третьего байтов, результат умножить на второе слово. Из младшего слова произведения вычесть третье слово и разделить на первое слово. Частное и остаток записать в память по адресу, следующему за данной последовательностью.

Вариант № 6

Написать программу, в которой зарезервировано четыре слова со значениями A031h, 8FFAh, 5FD3h, 4FAFh и два байта FAh, CDh. Получить разность второго и четвертого слов, разделить ее на первый байт, остаток сложить со вторым байтом и записать в память, а частное от деления умножить на седьмой байт последовательности слов. Результат записать в память.

Вариант № 7

Написать программу, в которой зарезервированы два слова со значениями: FACDh, FE37h и пять байтов: 5Ah, 6Fh, AAh, BCh, CDh. Получить сумму второго, четвертого и пятого байтов, вычесть из полученного результата второе слово. Разность разделить на третий байт последовательности байт. Остаток записать в память, а частное от деления умножить на четвертый байт последовательности слов. Результат записать в память.

Вариант № 8

Написать программу, в которой зарезервировано два слова со значениями FCC1h, CF11h и три байта FCh, FFh, 88h. Получить сумму второго слова и третьего байта. Результат умножить на первое слово. Старший байт результата записать в память. Младшее слово результата разделить на второй байт байтовой последовательности. Частное от деления и остаток записать в память.

Вариант № 9

Написать программу, в которой зарезервировано четыре слова со значениями: E010h, 1E4Ah, 2BC7h, B781h и три байта со значениями: AAh, ABh, ACh. Найти разность между первым словом последовательности слов и вторым байтом байтовой последовательности. Результат разделить на третий байт. Частное от деления умножить на первый байт, а остаток сложить с третьим словом последовательности слов. Полученные результаты записать в память.

Вариант № 10

Написать программу, в которой зарезервировано три слова со значениями: F11Fh, A332h, 2878h и четыре байта: ADh, DDh, CDh, 1Dh. Получить сумму второго слова последовательности слов и второго байта последовательности байт. Результат разделить на четвертый байт. Остаток от деления вычесть из третьего слова последовательности слов и записать в память, а частное от деления умножить на третий байт. Полученный результат записать в память.

Вариант № 11

Написать программу, в которой зарезервировано пять байт со значениями: 1Dh, D7h, ECh, C7h, ACh и два слова 87FEh, 7FA8h. Вычесть из второго слова последовательности слов третий байт последовательности байт. Результат умножить на первое слово. Старшее слово результата сложить с третьим байтом байтовой последовательности, а младшее слово результата разделить на пятый байт. Все полученные результаты записать в память.

Вариант № 12

Написать программу, в которой зарезервировано четыре слова: AABBh, BC1Dh, EC2Ch, 146Dh и три байта со значениями DFh, 7Fh, 8Ah. Найти сумму первого и третьего слов, результат разделить на второе слово. Остаток от деления умножить на слово, составленное из первого и третьего байтов последовательности байт, а из частного от деления вычесть второй байт байтовой последовательности.

Лабораторная работа № 6

Команды передачи управления

Эти команды не изменяют состояния флажков, за исключением команды возврата из прерывания IRET. Команды передачи управления модифицируют указатели программной памяти (регистры IP, CS). Передача управления в пределах текущего сегмента кода называется внутрисегментной - при этом модифицируется только регистр IP и адрес перехода представляется одним словом. Такая передача называется близкой и ее тип - NEAR. Передача управления за пределы текущего сегмента кода называется межсегментной. В этом случае модифицируются регистры IP и CS, а адрес перехода представляется двумя словами, одно из которых представляет сегмент, а другое смещение. Такая передача называется дальней и ее тип - FAR.

Команды переходов

Команды переходов подразделяются на команды безусловных переходов и команды условных переходов. Команды безусловных переходов обеспечивают переход на соответствующую команду программы. Этот оператор по своему функциональному назначению соответствует оператору языка Паскаль.

GOTO <метка>.

Форматы команд безусловных переходов:

JMP <смещение> - смещение рассматривается как знаковое целое, которое прибавляется с расширением знака до 16 бит к содержимому IP (в IP содержится адрес команды, находящейся после команды JMP);

JMP <адрес> - содержит 4 байта прямого адреса перехода;

JMP mem/reg - реализует косвенный безусловный переход.

Команды условных переходов анализируют некоторое условие, закодированное текущим состоянием флажков, при этом в зависимости от того, удовлетворено условие или нет, переход либо совершается, либо нет. Эти команды позволяют проверить оба состояния практически всех флажков арифметических операций, а также ряд комбинаций состояний нескольких флажков. Если условие истинно, управление передается по адресу перехода, если ложно - выполняется следующая по порядку команда. Ниже приводится таблица, в которой перечислены команды условных переходов. Команды условных переходов удобно рассматривать в соответствии со следующей классификацией:

· команды условных переходов для беззнаковых данных;

· команды условных переходов для знаковых данных;

· специальные арифметические проверки.

Употребление терминов «больше» и «меньше» относят к знаковым числам, представленным в дополнительном коде, а «выше» и «ниже» к беззнаковым. Например, число АСh меньше и выше числа 43h. Каждая команда условного перехода имеет две мнемоники, при этом обе мнемоники генерируют одинаковый код. Введение двух мнемонических обозначений одной команды объясняется необходимостью обеспечения определенных удобств для программиста.

Таблица команд условных переходов

№/№ Мнемоника Проверяемое условие Проверяемые флаги
Команды переходов для беззнаковых данных
JE / JZ равно / нуль Z
JNE / JNZ не равно / не нуль Z
JA / JNBE выше / не ниже или равно Z, C
JAE / JNB выше или равно / не ниже C
JB / JNAE ниже / не выше или равно C
JBE / JNA ниже или равно / не выше C, A
Команды переходов для знаковых данных
JE / JZ равно / нуль Z
JNE / JNZ не равно / не нуль Z
JG / JNLE больше / не меньше или равно Z, S, O
JGE / JNL больше или равно / не меньше S, O
JL / JNGE меньше / не больше или равно S, O
JLE / JNG меньше или равно / не больше Z, S, O
Специальные арифметические проверки
JS есть знак (отрицательное) S
JNS нет знака (положительное) S
JC есть перенос C
JNC нет переноса C
JO есть переполнение O
JNO нет переполнения O
JP / JPE паритет четный P
JNP / JPO паритет нечетный P
         

 

Кроме перечисленных в таблице команд, в число команд условных переходов входит команда JCXZ, которая проверяет равно ли нулю содержимое регистра CX, и, если равенство подтверждается, совершается переход.

Команды вызовов подпрограмм

Команда вызова подпрограмм CALL передает управление с автоматическим сохранением адреса возврата. В поле операнда этой команды находится метка первой команды вызываемой подпрограммы. После того как подпрограмма закончит свои действия, завершающая ее команда RET возврата передаст управление по запомненному адресу возврата. Адреса возврата хранятся в стеке. Вызовы подпрограмм могут быть внутрисегментными и межсегментными. В первом случае вызываемая подпрограмма находится в текущем кодовом сегменте (тип NEAR), во втором - в произвольном (тип FAR). В соответствии с этим в стеке запоминается содержимое либо только IP, либо IP и CS. Примеры записи операторов вызовов подпрограмм:

CALL Subr

CALL AX

CALL [BX][SI].

Команды управления циклами

Для организации программных циклов применяются следующие команды управления итерациями:

· LOOP <метка>

· LOOPE / LOOPZ <метка>

· LOOPNE / LOOPNZ <метка>

В этих командах предусматривается использование регистра СХ в качестве счетчика цикла. Когда выполняется команда LOOP (повторить цикл), производится декремент регистра СХ, и, если содержимое регистра СХ¹0 - производится переход к началу цикла, в противном случае цикл завершается и выполняется следующая по порядку команда.

Мнемоники LOOPE и LOOPZ определяют одну и ту же машинную команду, которая производит декремент регистра СХ, а затем передает управление в начало цикла, если (СХ¹0) и флаг Z=1. В противном случае будет выполняться следующая по порядку команда. Команда LOOPNE и LOOPNZ аналогична предыдущей команде, но здесь условие продолжения цикла имеет вид: (СХ¹0) и флаг Z=0.

Пример. В сегменте данных хранится 10 байт. Каждый байт содержит число, значение которого не выше 9. Необходимо вывести на экран байты, значения которых выше 5. Один из возможных вариантов реализации программы имеет вид:

 

name cikl
assume cs:cod, ds:data
data segment
aa db 9h, 8h, 3h, 6h, 5h, 2h, 3h, 7h, 1h, 5h
data ends
cod segment
start proc far
  push ds  
  mov ax,0  
  push ax  
  mov ax, data  
  mov ds,ax  
  lea bx,aa ;адрес просматриваемой последовательности в ВХ
  mov ah,0eh ; номер функции прерывания для вывода символа на экран
  mov cx,10 ; счетчик числа просматриваемых чисел
l1: mov al,[bx] ; очередное число в AL
  cmp al,5 ; сравнение текущего числа из памяти с числом 5
  jbe l2 ; если ниже или равно - переход, в противном случае
  add al,30h ; формируется ASCII код выводимого числа
  int 10h ;программное прерывание, обеспечивающее вывод на экран числа
  mov al,20h ; вывод на экран
  int 10h ; пробела
l2: inc bx ; смещение указателя на следующий байт в памяти
  loop l1 ; переход, если счетчик СХ не равен нулю
  ret  
  start endp  
  cod ends  
  end start  

 

Здесь символ на экран выводится используя прерывание INT 10h. Прежде чем будет инициировано прерывание необходимо подготовить регистры: AH, AL. В AH нужно занести значение 0еh (номер функции), в AL символ, который следует напечатать на экране.

В кодах ASCII цифры 0...9 имеют значения 30h...39h соответственно, следовательно, для того, чтобы вывести цифру на экран ее необходимо представить в коде ASCII. Слово состоит из четырех шестнадцатеричных цифр, а байт из двух. Следовательно, для того чтобы вывести содержимое слова или байта в шестнадцатеричном коде, нужно выделить и отдельно вывести каждую цифру. Для выделения цифр из слова или байта можно использовать команду сдвига влево:

SHL <сдвигаемый операнд>, <число сдвигов>.

Ниже приведен пример выделения цифры из слова. Для этого производится сдвиг на 4 бита влево содержимого регистра AX с занесением выдвигаемых битов в регистр DX. Здесь число, из которого выделяется цифра находится в регистре AX:

MOV DX , 0

MOV CL, 4

C2: SHL DX, 1

SHL AX, 1

ADC DX,0

DEC CL

JNZ C2

В результате приведенных операций в DX оказалась первая шестнадцатеричная цифра числа из AX.

Ниже приводится пример организации цикла на ассемблере. Решается задача поиска адреса байта в массиве из 200 байт, содержимое которого равно нулю.

 

  ….  
  Mov cx, 200 ;инициализация счетчика числа байт массива
  Lea bx, t ;в ВХ адрес начала массива байт (адрес первого байта)
  Mov ax, 0  
l2: Cmp [bx], ax ;сравнение значения очередного байта с 0
  Jz l1 ;переход, если этот байт нулевой
  Inc bx ;в противном случае увеличение на 1 текущего адреса
  Dec cx ;уменьшение на 1 содержимого счетчика байт
  Jnz l2 ;переход на L2, если значение счетчика не равно 0
l1: Mov ta, bx ; запись в память адреса нулевого байта
  ….  

 

 

Индивидуальные задания

Вариант № 1

В сегменте данных задана последовательность из шести слов: F501h, 3196h, 5737h, AA88h, CEDh, FA88h. Найти значение большее 4000h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 2

В сегменте данных задана последовательность из семи слов: 3845h, 4367h, 3157h, F501h, 3F96h, 8737h, EAA8h. Найти значение ниже 3500h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 3

В сегменте данных задана последовательность из девяти байт: 38h, 45h, F4h, 36h, A7h, CFh, 51h, 3Fh, 96h. Найти значение выше 43h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 4

В сегменте данных задана последовательность из девяти байт: FAh, E8h, 77h, F4h, 96h, CFh, 57h, 8Fh, 9Ah. Найти значение ниже 67h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 5

В сегменте данных задана последовательность из семи слов: F345h, 4967h, 3156h, F501h, 3F96h, 8737h, EAA8h. Найти значение меньшее 7888h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 6

В сегменте данных задана последовательность из восьми слов: FA45h, A667h, 3156h, F501h, 3F96h, 8967h, ECA8h, 76CDh . Найти значение большее 0000h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 7

В сегменте данных задана последовательность из шести слов: 9694h, 7389h, F481h, 7314h, 2224h, 124h. Найти значение, которое ниже или равно 7FF1h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 8

В сегменте данных задана последовательность из шести слов: 3147h, 5364h, 8102h, AF39h, B786h, A134h. Найти значение, которое выше или равно 6781h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 9

В сегменте данных задана последовательность из девяти слов: 7131h, 7AFFh, 9345h, 7FA1h, 6AD3h, 2784h, 2DACh, 5A36h, FF45h. Найти значение, которое меньше или равно 6127h и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 10

В сегменте данных задана последовательность из семи слов: FA35h, AA12h, 8FCDh, 2534h, 5781h, 73A6h, FF47h. Найти значение, которое больше или равно 37AFh и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 11

В сегменте данных задана последовательность из десяти байт: CDh, FCh, FAh, 97h, 38h, F4h, 36h, A7h, CFh, 51h. Найти значение, которое ниже или равно ADh и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

Вариант № 12

В сегменте данных задана последовательность из одиннадцати байт: 5Fh, 4Ah, 31h, 89h, 7Dh, 91h, CDh, FCh, FAh, 97h, 38h. Найти значение, которое выше 8Ah и вывести его на экран. Для вывода символа на экран использовать прерывание 10h с номером функции 0еh.

 

Лабораторная работа № 7

Директивы процедур

Процедура (или подпрограмма) является одним из средств разработки модульных программ. Она представляет собой законченную последовательность, которая приводится в действие командой вызова CALL. Процедуры сокращают длину программы, обеспечивая экономию памяти. Отлаженные процедуры можно организовать в библиотеки. Метка в процедуре, которой передает управление команда CALL, называется точкой входа процедуры. Процедура выполняется до тех пор, пока не встретится команда возврата RET. В процедуре может быть несколько команд возврата.

Для организации процедур в языке ассемблера предназначены директивы PROC и ENDP. Директива PROC отмечает точку входа процедуры, а директива ENDP - окончание процедуры. Формат директив:

<имя> PROC <тип>

...

Тело процедуры

...

<имя> ENDP

В обеих директивах должно находиться одно и тоже имя процедуры. Оно представляет собой метку, указывающую точку входа процедуры. Тип процедуры может быть NEAR или FAR (по умолчание принимается тип NEAR). Действие директив PROC/ENDP заключается в том, чтобы наименовать процедуру и установить ее тип. В соответствии с типом ассемблер генерирует требуемые команды CALL и RET.

Пример. Пусть необходимо вывести на экран значения байтовой последовательности, предварительно увеличив каждое из них на 15h. Один из вариантов реализации указанной задачи представлен ниже:

name procedur
assume cs:cod, ds:data
data segment
aa db 9h,8h,3h,6h,5h,2h,3h,7h,1h,5h
data ends
cod segment
start proc far
  push ds  
  mov ax,0  
  push ax  
  mov ax, data ; инициализация сегментного
  mov ds,ax ; регистра
  lea bx,aa ; адрес байтовой последовательности в регистре BX
  mov ah,0eh ; в AH номер функции прерывания вывода символа на экран
  mov cx,10 ; инициализация счетчика числа байт
l1: mov al,[bx] ; запись в AL значения текущего байта
  add al,15h ; сложение байта со значением 15h
  call sym ; вызов подпрограммы вывода байта на экран
l2: inc bx ; смещение указателя на следующий байт
  mov al,20h ; занесение в AL кода символа пробела
  int 10h ; вызов программного прерывания вывода символа на экран
  loop l1  
  ret  
  start endp  
  sym proc  
  push cx ; сохранение в стеке содержимого счетчика байт
  mov dl,al ; сохранение в DL значения выводимого байта
  mov cl,2 ; инициализация счетчика числа символов в байте
p4: mov dh,0 ; обнуление регистра, в который выдвигается цифра из байта
  mov ch,4 ; инициализация счетчика числа бит в шестнадцатеричной цифре
p1: shl dh,1 ; освобождение места для записи бита выдвигаемой цифры
  shl dl,1 ; выдвижение бита цифры во флаг C
  adc dh,0 ; занесение содержимого флага C (бита цифры) в регистр DH
  dec ch ; декремент счетчика числа бит в цифре
  jnz p1 ; если не 0 - переход к началу цикла
  mov al,dh ; перезапись выдвинутой цифры в AL
  cmp al,9 ; проверка - является ли цифра «буквенной», если да - переход на
  ja p2 ; метку, иначе - преобразование
  add al,30h ; цифры в ее символическое представление (ASCII код)
  jmp p3  
p2: add al,37h ; преобраз. буквенной цифры в ее символическое представление
p3: int 10h ; вывод символа на экран
  loop p4  
  pop cx  
  ret  
  sym endp  
  cod ends  
  end start  

 

Здесь операции выделения цифр из байта, преобразование цифр в ASCII код и вывод их на экран оформлены в процедуру SYM. Передача параметров в процедуру осуществляется через регистр процессора.

Значения, которые процедура использует как входные данные, называются параметрами. Имеется несколько способов передачи параметров процедурам. Один из простых способов - размещение параметров в регистрах МП. В приведенном примере два входных параметра передаются в процедуру в регистре AX. В AH - номер функции прерывания, в AL - значение выводимого байта. Еще один способ передачи параметров связан с использованием общей области данных, доступной вызывающей программе и процедуре. В большинстве языков высокого уровня передача параметров процедурам организуется через стек. В приведенном примере программа оформлена как подпрограмма типа FAR. Это объясняется тем, что в среде операционной системы все прикладные программы считаются подпрограммами, которые вызываются операционной системой. Стандартное начало программы

push ds ; сохранить в стеке сегментный адрес

mov ax,0 ; и нулевое смещение

push ax ; смещение PSP для возврата

 

В кодах ASCII цифры 0...9 имеют значения 30h...39h соответственно, Цифры ah, bh,...fh кодируются как 41h,...,46h, следовательно, для того, чтобы вывести цифру на экран ее необходимо представить в коде ASCII. Это преобразование приведено в примере программы.

Индивидуальные задания

Вариант № 1

Задана последовательность из шести слов: F501h, 3196h, 5737h, AA88h, CEDh, FA88h. Найти значение выше 4000h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 2

Задана последовательность из семи слов: 3245h, 4E1Ah, 315Ah, F501h, 3F96h, 8737h, EAA8h. Найти значение большее 3500h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 3

Задана последовательность из девяти байт: 38h, F5h, F4h, 36h, A7h, CFh, 51h, 3Fh, 96h. Найти значение меньшее 13h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 4

Задана последовательность из девяти байт: FAh, E8h, 7Ah, F4h, 96h, CFh, 51h, 3Fh, 9Ah. Найти значение большее 67h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 5

Задана последовательность из семи слов: 734Eh, 4E67h, 3156h, F501h, 3F96h, 8737h, EAA8h. Найти значение выше 8888h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 6

Задана последовательность из семи слов: F345h, A6C7h, 3156h, F501h, 3F96h, 8737h, EAA8h. Найти значение, которое ниже E600h, и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 7

В сегменте данных задана последовательность из шести слов: 7FFFh, 7AC9h, F481h, 7314h, 2224h, 124h. Найти значение, которое меньше или равно 7FF1h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 8

В сегменте данных задана последовательность из шести слов: 3147h, 5364h, 71DEh, AF39h, B786h, A134h. Найти значение, которое больше или равно 6781h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 9

В сегменте данных задана последовательность из девяти слов: 4131h, 7AFFh, 9345h, 7FA1h, 6AD3h, 2784h, 2DACh, 5A36h, FF45h. Найти значение, которое выше или равно 6127h и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 10

В сегменте данных задана последовательность из семи слов: FA35h, AA12h, 8FCDh, 2A3Eh, 5781h, 73A6h, FF47h. Найти значение, которое ниже или равно 37AFh и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 11

В сегменте данных задана последовательность из десяти байт: CDh, FCh, FAh, 9Eh, 3Eh, F4h, 36h, A7h, CFh, 51h. Найти значение, которое больше или равно ADh и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Вариант № 12

В сегменте данных задана последовательность из одиннадцати байт: 5Fh, 4Ah, 31h, 89h, 7Dh, 91h, CDh, FCh, FAh, 97h, 38h. Найти значение, которое меньше 8Ah и вывести его на экран. Вывод символа на экран оформить в виде процедуры.

Лабораторная работа №.8

Команды логических операций

Логические операции представлены булевыми операторами NOT (инверсия), AND (конъюнкция), OR (дизъюнкция), XOR (исключающее ИЛИ) и командой TEST, которая выполняет конъюнкцию операндов, но не изменяет их значений (неразрушающая проверка). Все логические операции являются поразрядными, то есть выполняются независимо для всех бит операндов.

Форматы команд:

 

AND OR XOR TEST mem/reg, mem/reg mem/reg, mem/reg mem/reg, mem/reg mem/reg, mem/reg AND OR XOR TEST mem/reg, data mem/reg, data mem/reg, data mem/reg, data AND OR XOR TEST ac, data ac, data ac, data ac, data

 

NOT mem/reg

Пример. Пусть необходимо сформировать сорока байтный массив путем преобразования символов, вводимых с клавиатуры. Каждые четыре байта массива формируются путем: 1) инверсии очередного введенного байта; 2) конъюнкции байта с числом ACh; 3) инвертирования в исходном байте третьего и пятого разрядов; 4) дизъюнкции байта с ранее введенным символом (для первого символа дизъюнкцию не производить - в память записывается введенный байт). Фрагмент программы реализующей решение поставленной задачи имеет вид:

 

assume cs:cod, ds:data
data segment
aa db 40 dup(?)
data ends
cod segment
start proc far
assume cs:cod, ds:data
data segment
aa db 40 dup(?)
data ends
cod segment
start proc far
  push ds  
  mov ax,0  
  push ax  
  mov ax, data ; инициализация сегментного
  mov ds,ax ; регистра
  lea bx,aa ; занесение в ВХ адреса формируемого массива
  mov cx,10 ; инициализация счетчика числа вводимых символов
l1: mov ah,0 ; номер функции прерывания
  int 16h ;ввод символа
  mov dl,al ;сохранение введенного символа в DL
  not al ;инвертирование введенного символа
  mov [bx],al ; запись в память первого сформированного байта из четверки
  mov al,dl ; восстановление введенного символа из DL
  and al,0ach ; формирование второго байта из четверки путем конъюнкции
  mov 1[bx],al ; запись в память второго сформированного байта из четверки
  mov al,dl ; восстановление введенного символа из DL
  xor a,10100B ; формирование 3-го байта из четверки путем инвертирования отдельных бит
  mov 2[bx],al ; запись в память 3-го сформированного байта из четверки
  mov al,dl ; восстановление введенного символа из DL
  cmp cx,10 ; проверка: является ли введенный символ первым, если да переход, иначе -дизъюнкция с ранее введенным символом и формирование последнего байта из текущей четверки
  je l2
  or al,dh
l2: mov 3[bx],al ; запись в память 4-го сформированного байта из четверки
  mov dh,dl ;сохранение в DH введенного символа ;смещение указателя на следующую четверку байт формируемого массива
  add bx,4
  loop l1  

 

 
 

Ввод символа с экрана можно осуществить с помощью прерывания INT 16h, как это сделано в выше приведенном примере. При этом в регистр АН заносится номер функции прерывания 0, таким образом, реализуется ввод символа с клавиатуры без эхо-повтора. После выполнения команды прерывания в регистре AL находится код введенного символа. Пример:

MOV AH,0

INT 16h.

Команды сдвигов

Форматы команд сдвига приведены на рис. 3.10, где count - счетчик, определяющий число сдвигов. Этот операнд может быть указан как константа 1 (статический сдвиг) или как регистр CL. В первом случае осуществляется сдвиг на один бит, а во втором - число сдвигов определяется содержимым регистра CL. Таким образом, число сдвигов можно задать переменной, вычисляемой во время выполнения программы (динамический сдвиг). Команды сдвигов подразделяются на команды циклических сдвигов (ротации) и обычных. В циклических сдвигах выдвигаемый бит помещается на место освобождающегося бита. При выполнении команд сдвигов флажок C всегда содержит значение последнего выдвинутого бита. Циклические сдвиги влияют только на флаги C и O. В обычных сдвигах флаги S, Z и P модифицируются в соответствии с полученным результатом.

Команды RCL, RCR, ROL, ROR - реализуют циклические сдвиги. Команды RCL и RCR называются командами циклического сдвига влево и вправо через перенос.

Команды SHL и SHR - реализуют логический сдвиг влево и вправо. Здесь в освобождающийся бит загружается нуль, а выдвигаемый бит теряется. Команды SAL и SAR предназначены для арифметического сдвига влево и вправо. Арифметический сдвиг вправо отличается от логического тем, что знаковый бит не сдвигается, а тиражируется в соседнем правом бите, сохраняя знак числа. Арифметический сдвиг влево в дополнительном коде не отличается от логического.

Пример. Пусть необходимо решить задачу формирования 32 разрядного числа из двух символов, вводимых с клавиатуры. Первый введенный символ помещается в младший байт млад