Система команд микропроцессора i8088
Группы команд
Команды пересылки данных
Основные команды общего назначения
Команда mov - переслать данные
Ограничения этой команды
Пример
Команда Push – сохранить данные в стеке
Команда Pop – извлечь данные из стека
Вершина стека (напоминание)
Применение
Команда Lea – загрузить смещение ячейки памяти.
Команда Lds – загрузить указатель с использованием регистра ds
Пример
Команды пересылки флагов
Команды pushf и popf
Применение и пример
Команды In и Out
Понятие порта ввода/вывода
Форматы команд:
Пример
Простейшие способы ввода данных с клавиатуры и вывода данных на экран
Вывод строки символов.
Особеннность
Пример:
Ввод информации с клавиатуры.
Для организации ввода необходимо:
Пример:
Результат
Пример программы:
Определение сегментов и стандартная часть
Вывод подсказки и ввод исходных данных
Обработка
Вывод результата
Результат работы программы.
Команды обработки битов
Логические команды
Ограничения на команды:
Команда NOT:
Выполнение
Действия логических команд: Команда OR
Команда AND
Команда XOR
Команда Test
Команда Not
Применение
Пример 1. Преобразование двоичной цифры в символьное значение.
Пример 2. Преобразования ASCII кода символа цифры в её двоичное представление
Пример 3. Умножение на 4
Общие примеры
Команды сдвига
Формат команд
Выполнение
Команды логического сдвига
Команды арифметического сдвига
Схема работы
Команды циклического сдвига
Схема работы
Циклический сдвиг с учетом флага переноса
Схема работы
Примеры команд
Применение
Пример программы
Пример перевода
417.00K
Category: programmingprogramming

Система команд микропроцессора i8088

1. Система команд микропроцессора i8088

2. Группы команд

• команды пересылки данных
• команды обработки битов
• команды передачи управления
• арифметические команды
• команды обработки строк
• команды управления процессором
• команды прерываний

3. Команды пересылки данных

• Эти команды осуществляют обмен
данными и адресами между регистрами и
ячейками памяти или портами
ввода/вывода.
• Выделяются следующие команды
пересылки данных:
• команды общего назначения
• команды пересылки адреса
• команды пересылки флагов
• команды ввода/вывода

4. Основные команды общего назначения

5. Команда mov - переслать данные

• наиболее распространенная команда.
• Формат команды: mov приемник, источник
рег.
рег.
рег.
конст.
рег.
яч. пам.
яч. пам.
конст.
яч. пам.
рег.
--------------------------------------
8 бит
8 бит
16 бит
16 бит
• Команда пересылает содержимое источника в приемник

6. Ограничения этой команды

• Нельзя переслать содержимое одной ячейки памяти в
другую. Для такой пересылки нужно использовать
промежуточную операцию пересылки в регистр.
• Если источник константа, то приемник не может быть
регистром сегмента.
• В качестве приемника не может быть использован
регистр cs.
• Нельзя занести содержимое одного сегментного
регистра в другой.

7. Пример

• mov ax, table; занести содержимое ячейки
;памяти table в регистр ax
• mov table[bx],ax
• mov al, 25
• mov [bx], ah

8. Команда Push – сохранить данные в стеке

• Формат команды:
• push источник
рег.
яч. пам.
--------------------
16 бит
• Команда Push загружает содержимое источника в вершину
стека.
• Пример:
• push si
• push [bx]

9. Команда Pop – извлечь данные из стека

• Формат команды: pop приемник
рег.
яч. пам.
-------------------
16 бит
• Команда Pop берет слово с вершины стека и загружает его в
приемник.
• Пример:
• pop ax ; взять слово с вершины стека и загрузить его в регистр
ax.
• pop work ; взять слово с вершины стека и загрузить его в work.

10. Вершина стека (напоминание)

• Под вершиной стека понимается ячейка памяти в
сегменте стека , адрес которой находиться в
регистре SP. При загрузке программы в начальный
момент указатель стека SP указывает на последнюю
ячейку в сегменте стека. При выполнении команды
push данные помещаются в стек и значение SP
уменьшается на 2.
• При выполнении команды Pop данные берутся с
вершины стека и помещаются в приемник,
указатель стека увеличивается на 2, тем самым
свободное место в стеке увеличивается на 2 байта.

11. Применение

• Команда Push используется в основном для
сохранения в стеке изменяемых значений.
Команда Pop используется для восстановления
из стека сохраненных значений.
• Удобство этих команд в том что команда Pop
восстанавливает значение в строго обратной
последовательности их сохранению командой
Push.

12.

• Команды пересылки адреса
Эти команды позволяют переслать не
содержимое ячеек памяти, а их адреса

13. Команда Lea – загрузить смещение ячейки памяти.

• Формат команды:
• lea приемник, источник
рег.
яч. пам.
--------------------------
16 бит
8 бит
16 бит
16 бит
• Команда заносит в 16-битовый регистр смещение ячейки памяти из
указаннного сегмента.
• Пример:
• lea bx, table ; загрузить в bx смещение переменной table
mov di,5
lea bx, table[di] ; загрузить в bx смещение ячейки table+ di
эквивалентно: mov bx, offset table[di].
• Применение
lea bx, table
mov ax, ss:[bx]

14. Команда Lds – загрузить указатель с использованием регистра ds

• Формат команды:
• lds приемник, источник
рег.
яч. пам.
• -------------------------------
16 бит
32 бита
• По этой команде считывается содержимое
ячейки памяти источника и первые 16 бит
загружаются в приемник, а следующие 16 бит в регистр ds. Команда позволяет в регистровой
паре ds:регистр получать указатель, который
хранится в ячейке памяти

15. Пример

;в сегмент данных
met dd adr
; adr – это адрес команды (*).
; Этот адрес помещен в
; переменную met длиной двойное
; слово
; в сегмент команд
adr mov ax, bx (*)
lds bx, met
По этой команде в паре ds:bx будет помещен указатель на
команду (*), т.е. адрес этой команды (ds=cs, bx=смещению
команды (*)в сегменте команд).

16. Команды пересылки флагов

17. Команды pushf и popf

• Команда pushf - сохранить регистр флага в
стеке (без операнда). Команда помещает
регистр флага в вершину стека.
• Команда Popf – восстановить регистр
флагов из стека. Команда берет
содержимое ячейки памяти с вершины
стека длиной слово и помещает её в
регистр флагов.

18. Применение и пример

Эти команды позволяют:
1. Сохранять в стеке состояние микропроцессора на время выполнения
некоторых операций и затем восстанавливать эти состояния.
2. Манипулировать отдельными битами регистра флагов.
1) установка произвольного набора битов регистра флагов
mov ax, 01101101b
push ax
popf
2)проанализировать любую комбинацию битов регистр флагов
pushf
pop ax ; анализируем ax

19.

Команды ввода/вывода

20. Команды In и Out

• В системе команд микропроцессора
имеются 2 команды
• In – ввод информации из порта ввода
/вывода
• Out – вывод информации в порт
ввода/вывода
Эти команды позволяют осуществлять ввод
или вывод информации любого устройства
подключенного к компьютеру.

21. Понятие порта ввода/вывода

• Для организации взаимодействия устройств с микропроцессором
в архитектуре компьютера используются порты ввода/вывода.
• Порт ввода/вывода - это специальное устройство, с которого к
персональному компьютеру могут быть подключены
периферийные устройства. Запись информации в порт приводит к
вводу или выводу информации на соответствующее устройство
Каждый порт имеет свой адрес (номер).
• Всего микропроцессор i80386 может адресовать 65536 портов.
Аналогично ячейке памяти порт имеет разрядность и может быть
8-и или 16-ти разрядным.
• Каждый порт имеет свое определенное назначение. Например,
порт с номером 60h используется для ввода с клавиатуры.
• Команды In и Out взаимодействуют с портами ввода вывода

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

• In аккумулятор, порт ; ввести данное из порта в
аккумулятор
• Out порт, аккумулятор ; вывести данные из
аккумулятора в порт.
• Здесь порт - это адрес соответствующего порта.
• Адрес может быть задан либо непосредственно,
либо как содержимое регистра dx.
• Аккумулятор - это либо регистр ах при
вводе/выводе слов, или регистр al при
вводе/выводе байтов..

23. Пример

In al, 200 ; ввести байт из порта 200 в
;регистр al
Out 30h, ax ; вывести содержимое регистра
; ax в порт 30h

24. Простейшие способы ввода данных с клавиатуры и вывода данных на экран

Использование команд In и Out позволяет
осуществлять ввод/вывод любой сложности на
любое устройство.
Для организации символьного ввода с
клавиатуры и вывода символьных строк на
экран можно использовать простые функции
ОС, существенно упрощающие эти операции.

25. Вывод строки символов.

Для выполнения этой операции необходимо:
1. В сегменте данных определить выводимую
строку, которая должна заканчиваться
знаком “$” - признаком конца строки.
2. Занести в регистр ah значение 09h - номер
функции ОС “вывод строки символов”
3. Занести в регистр dx смещение (адрес)
начала выводимой строки
4. Выполнить команду Int 21h – вызов
функции ОС

26. Особеннность

1. Выводятся символьные строки, представленные в
ASCII – формате. Служебные символы приводят к
передвижению курсора на экране.
2. Особенностью функции 09h является то, что после
вывода строки курсор остается в той же строке и в
позиции следующего символа. Это значит что
следующий вывод будет в той же строке, начиная с
позиции курсора. Для того чтобы передвинуть
курсор в начало следующей строки надо на экран
вывести следующие символы:
0dh – возврат каретки <CR>
0Ah – перевод строки <LF>

27. Пример:

предположим надо вывести текст:
Начало программы.
Введите данные:_
* * * * * *
; в сегмент данных
str1 db ‘Начало программы’, 0dh, 0Ah, ‘Введите
данные: ‘, ‘$’
* * * * * *
; в сегмент команд
mov ah, 09h
lea dx, str1
int 21h

28. Ввод информации с клавиатуры.

Ввод информации осуществляется функцией
ОС с номером 10 (или 0Ah).
Функция позволяет ввести в отведенную
область памяти ASCII коды символов,
соответствующих нажатым на клавиатуре
клавишам до символа <CR> - enter .

29. Для организации ввода необходимо:

1) В сегменте данных отвести место под вводимые данные
( по 1-му байту на 1 вводимый символ) .
В первом байте отведенной области должно
находиться максимально возможное с точки зрения
программиста число вводимых символов, включая Enter
. Во втором байте этой области после ввода будет
находиться число реально введенных символов, не
считая enter. В остальных байтах будут располагаться
введенные символы, включая enter.
2). 2. Занести в регистр ah значение 0Аh - номер функции
ОС “ввод строки символов”
3. Занести в регистр dx смещение (адрес) начала
отведенной области для ввода строки (п.1)
4. Выполнить команду Int 21h – вызов функции ОС

30. Пример:

; в сегмент данных
str1 db 10,11 dup(?) ; область под ввод.
; в сегмент команд
mov ah, 0ah ; функция ввода
lea dx, str1 ; dx смещение области ввода
int 21h ; вызов функции

31. Результат

1. Компьютер перейдет в режим ожидания ввода с
клавиатуры.
2. Предположим с клавиатуры ввели символы abc.
После нажатия клавиши enter в области str1 будет
находиться введенная строка.
3. Первый байт веденной строки находиться по
адресу str1+2. По адресу str1 находится значение
10, а по адресу str1+1 – значение 3.
Замечание: Выполнение команды int 21h меняет
регистр ах. Поэтому после int21h необходимо
следить за правильными значениями регистров al,
ah

32. Пример программы:

С клавиатуры вводится последовательность
символов не более 10-ти. Вывести на экран
эту последовательность в обратном
порядке последовательности
Ввод: abcd
Вывод: dcba

33. Определение сегментов и стандартная часть

sseg segment para stack ‘stack’
db 64 dup(?)
sseg ends
; сегмент данных
dseg segment
str1 db ‘Введите исходную строку: $’
str2 db 10,11 dup(?) ; область ввода
str3 db 10dup(?), ‘$’ ; область вывода
str4 db 0Ah, 0Dh, ‘Результат: ’ , 0Ah, 0Dh, ‘$’
dseg ends
; сегмент команд
cseg segment
assume cs: cseg, ds: dseg, ss:sseg
main proc far ; начало программы
; стандартная часть
push ds
xor ax, ax
push ax
mov ax, dseg
mov ds, ax

34. Вывод подсказки и ввод исходных данных

; вывод подсказки
mov ah, 09h
lea dx, str1
int 21h
; ввод исходной строки
mov ah, 0Ah
lea dx, str2
int 21h

35. Обработка

mov cx, str2+1 ; число реально введенных
; символов
mov di, cx
dec di
; di указывает на последний
; символ в str2
lea si, str2+2 ; смещение 1-го символа
; строки str2
met: mov al, [si] ; взять очередной символ
; исходной строки
mov str3[di], al ; пересылка в
; результирующую строку
inc si
; взять следующий символ
; исходной строки
dec di ; перейти к следующему символу результата
loop met

36. Вывод результата

; вывод подсказки о результате
mov ah, 09h
lea dx, str4
int 21h
; вывод результата
mov ah, 09h
lea dx, str3
int 21h
Ret ; выход
main endp
cseg ends
end main

37. Результат работы программы.

• Введите исходную строку: abcd
• Результат: dabc

38. Команды обработки битов

39.

• Манипулируют группами битов в регистрах
или ячейках памяти.
• Выделяются следующие группы команд:
• логические команды
• команды сдвига

40. Логические команды

• OR, AND, XOR, TEST, NOT.
• Формат первых 4-х команд:
команда приемник, источник
допустимые форматы:
рег.
рег.
рег.
знач.
рег.
яч. пам.
яч. пам. рег.
яч. пам. знач.
---------------------------------------16 бит
16 бит
8 бит
8 бит

41. Ограничения на команды:

не допускается операция вида:
яч. пам. – яч. пам.
непосредственное значение не может быть
приемником
приемник и источник не могут быть
одновременно сегментными регистрами
регистр cs не может быть приемником

42. Команда NOT:

• Формат
• Not приемник
8 или 16 бит
• Приемником не может быть cs.

43. Выполнение

• Логические команды обрабатывают
содержимое источника бит за битом
последовательно, и помещают результат в
приемник. Эти команды устанавливают
флаги ZF и SF.
• Команда Not работает только с
приемником обрабатывает его бит за битом
и помещает результат в приемник.

44. Действия логических команд: Команда OR

• Логическое сложение (логическое или).
• Команда OR сравнивает каждый бит источника
соответствующим битом приемника. Если хотя
бы 1 из сравниваемых битов =1 то бит в
результате равен 1.
• 0 or 0 = 0
• 0 or 1 = 1
• 1 or 0 = 1
• 1 or 1 =1

45. Команда AND

• логическое умножение (логическое и).
• Сравнивает последовательно биты источника с
соответствующими битами приемника. Если
хотя бы 1 из сравниваемых битов приемника
источника равен нулю то соответствующий бит
результата в приемнике равен нулю.
• 0 and 0 = 0
• 0 and 1 = 0
• 1 and 0 = 0
• 1 and 1 =1

46. Команда XOR

• Исключающее или.
• Сравнивает последовательно биты источника с
соответствующими битами приемника. Если
сравниваемые биты равны, то бит результата в
приемнике равен нулю.
• 0 xor 0 = 0
• 1 xor 0 = 1
• 0 xor 1 = 1
• 1 xor 1 = 0

47. Команда Test

• Логическое сравнение.
• Сравнивает последовательно биты
источника с соответствующими битами
приемника. По действию аналогично And
но не меняет приемник, а только
устанавливает флаги.

48. Команда Not

• Логическое отрицание. Меняет биты
приемника на противоположные.

49. Применение

• Логические операции часто используются
для установки в двоичных разрядах
регистров и ячеек необходимых значений.
• 1. Для установки 0 в двоичном разряде
необходимо логически умножить этот
разряд на ноль.
• 2. Для установки единицы в двоичном
разряде достаточно логически сложить этот
разряд с единицей.

50. Пример 1. Преобразование двоичной цифры в символьное значение.

Для преобразования двоичной цифры в её ASCII
код в регистре достаточно логически сложить
значение регистра со значением 30h
• mov al, 4 ; al содержит двоичное значение
;цифры 4 (т.е. значение 00000100)
• or al, 00110000b ; Эквивалентно or al, 30h
• ; результат al = 00110100 – ASCII код символа
; ‘4’

51. Пример 2. Преобразования ASCII кода символа цифры в её двоичное представление

• Необходимо убрать единицы в 4-х старших
битах ASCII кода символа. Для этого
достаточно логически умножить ASCII код
на 0Fh
• mov al, ‘4’ ; al = 00110100
• and al, 0Fh ; al = 00000100 (al = 4)

52. Пример 3. Умножение на 4

• mov cl, 2
• shl al, cl ; al= al*4

53. Общие примеры

• mov al, 11000101b
• mov bh, 01011100b
• and al, bh ; al = 01000100b
• or al, bh ; al = 01011100b
• xor al, al ; al = 00000000b

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

• Команды логического сдвига
• Команды арифметического сдвига
• Команды циклического сдвига

55. Формат команд

• команда приемник, сдвиг
• допустимые значения:
• рег.
знач.
• яч. пам. знач.
• яч. пам. Cl
• рег.
Cl
• ---------------------------------8 бит
8 бит
• 16 бит
8 или 16 бит

56. Выполнение

• Команды осуществляют сдвиг приемника
влево или вправо на величину
определенную сдвигом. Результат
заносится в приемник.
• Сдвиг может быть либо значением, равным
1, либо целым без знака в регистре cl.
• Особенностью всех команд сдвига является
то, что вышедший за пределы приемника
бит переносится во флаг переноса CF.

57. Команды логического сдвига

• SHL/SHR – сдвинуть логически операнд
влево/вправо.
• Команда сдвигает операнд, занося в
освобожденные биты значение 0.
SHL
CF
…..
SHR
0
…..
CF

58. Команды арифметического сдвига

• SAL/SAR – сдвинуть арифметически
влево/вправо.
• Команда SAL аналогичен команде SHL, но при
этом заносит 1 в флаг переполнения OF, если
при сдвиге знак операнда меняется. Команда
SAR смещает операнд вправо. Вышедший бит
помещается в CF, а освободившиеся биты
замещаются старшим битом.
• Команду SAR иногда называют сдвигом с
сохранением знака.

59. Схема работы

60. Команды циклического сдвига

• Обычный циклический сдвиг ROL/ROR –
сдвинуть циклически влево/вправо.
Команды сдвигают операнд. Вышедший за
пределы операнда бит помещается в CF и
переносится в операнд с противоположной
стороны.

61. Схема работы

62. Циклический сдвиг с учетом флага переноса

• Сдвиг влево/вправо с учетом флага
переноса RCL/RCR.
• Команды сдвигают операнд, текущий флаг
переноса заносится в операнд с
противоположной стороны, а вышедший
бит заносится во флаг переноса.

63. Схема работы

64. Примеры команд

• mov bl, 10110100b
• mov al, bl; пусть CF = 1
• sal al, 1 ;al = 01101000b, CF=1
• mov al, bl
• sar al, 1 ; al=11011010b

65. Применение

• 1. Поскольку логический сдвиг вправо на 1
уменьшает операнд в 2 раза, а логический сдвиг
влево на 1 увеличивает операнд в 2 раза, то
логические сдвиги удобно использовать для
быстрого умножения и деления на степень
двойки.
• 2. Сдвиги удобно использовать для анализа
отдельных битов операндов.
• 3. Сдвиги удобно использовать для обнуления
последовательности битов в операндах.

66. Пример программы

• Пусть имеется некоторый символ в ASCII
коде. Необходимо напечатать его 8-ое
представление.
• Для решения этой задачи используется
правило перевода двоичных чисел в
восьмеричную систему счисления. Для
такого перевода необходимо взять каждые
три двоичных разряда (считая справа) и
заменить их одной восьмеричной цифрой.

67. Пример перевода


Двоичное
000
001
010
011
100
101
110
111
Восьмеричное
0
1
2
3
4
5
6
7
00 110 100
-- --- --64
0011011000110100

68.


dseg segment
simv db ‘4’ ; Исходный символ в ASCII коде
rez db 3dup(?) ; Поле результата
dseg ends
* * * * *
mov al, simv ; al=00110100
and al, 00000111b ; Взяли последние три бита
or al, 30h ; al=00110100 – Получили их ASCII -код
mov rez+2, al ; поместить в третий байт результата
mov cl, 3
shr simv, cl ; simv = 00000110b ; сдвинуть вправо исходную строку
mov al, simv
and al, 00000111 ; al=00000110b ; взять из нее последние три бита
or al, 30h ; al = 00110110b ; получить ASCII код
mov rez+1, al ; al=’6’ ; Занести второй символ результата
;ещё один шаг
Самостоятельно переписать программу с использованием цикла.
English     Русский Rules