- •1. Представление данных в компьютере: двоичная, шестнадцатиричная системы исчисления, числа со знаком.
- •2.Организация памяти. Модели памяти.
- •3. Регистровая структура процессоров Intel ix86: регистры общего назначения, сегментные регистры, регистр флагов.
- •4. Директивы определения данных
- •5. Способы адресации: регистровая, непосредственная, прямая, косвенная.
- •6. Текстовый и графический режимы видеопамяти. Адресное пространство. Вывод символов и пикселей на экран. Примеры.
- •7. Структура стека. Команды для работы со стеком. Синтаксис. Примеры.
- •8. Прерывания.
- •9. Функции dos: ввод с клавиатуры, печати строки, завершение инициализации.
- •10. Команды двоичной арифметики
- •11. Команды десятичной арифметики языка assembler. Синтаксис. Примеры.
- •12. Логические команды языка ассемблер. Синтаксис. Примеры.
- •13. Команды пересылки данных. Синтаксис. Примеры. Оператор ptr.
- •14. Сдвиговые операторы. Синтаксис.
- •15. Безусловный переход
- •16. Команды сравнения и передачи управления.
- •17. Организация циклов. Синтаксис. Примеры.
- •18. Строковые команды. Синтаксис.
- •19. Расширение mmx
- •20. Структура резидентных программ. Загрузка и выгрузка резидентной программы.
- •21. Драйверы устройств dos. Формат и загрузка драйвера устройства.
- •Символьные устройства осущ-ют послед. Ввод/вывод. Такими устройствами являются console, последовательный порт, часы и принтер.
- •22. Программирование на уровне портов ввода/вывода. Системный таймер.
- •23.Команды ввода-вывода
- •24. Переферийные устройства. Структура fdd, hdd, cd-rom.
14. Сдвиговые операторы. Синтаксис.
К их числу относят shl, sal, shr, sar, ror, rol, rcr, rcl.
shl, sal – осуществляют сдвиг влево числа в первом операнде на 1 бит, либо на n>1 бит.
В последнем случае число n должно быть положительно записано в регистр cl, который задается в качестве второго операнда. Выделяется левый бит помещается в с освобожденный правый бит – в нуль.
mov al, 10010001b
shl al,1; al=00100010b и с=1 (al=al*2)
shl al,1; al=01000100b и с=0 (al=al*2)
sal al,1; al=10001000b и с=0 (al=al*2)
Сдвиг числа влево на 1 бит эквивалентен умножению на 2.
mov al,10010001b
mov cl,3
shl al,cl; al=10001000b и с=0 (al=al*8)
shr подобна shl, но сдвиг осуществляется вправо.
Сдвиг вправо эквивалентен делению на 2.
sar так-же подобно shr, но в отличии от нее не изменяет ставший бит.
mov bl,10001001b
sar bl,1; bl=11000100b; c=1
Использование этой команды позволяет сохранять знак результата.
Команды ror, rol, rcr, rcl называют командами вращения.
Поворот битов осуществляется либо на 1, либо на число, значащееся в регистре cl.
ror подобна shr за исключением того, что правый выдвинутый бит наряду с параметром с помещается в левый выдвинувшийся бит.
rcr и rcl – возвращает бит через признак переноса с.
rol – левый выдвинутый бит наряду с с помещается в правый выдвинутый бит.
15. Безусловный переход
Команды машинной программы выполняются в том порядке, как они записаны в памяти. Но время от времени этот естественный порядок выполнения команд приходится нарушать с тем, чтобы следующей выполнялась не очередная команда программы, а какая-то иная. Такую возможность обеспечивают команды перехода.
Переходы бывают условными и безусловными. Если переход делается только тогда, когда выполнено некоторое условие, то такой переход называется условным, а если он делается независимо от каких-либо условий, то это безусловный переход.
Отметим, что в ПК команды перехода не меняются флаги: какое значение флаги имели до команды перехода, такое же значение они будут иметь и после нее. Дальше мы уже не будем об этом упоминать.
Изучение команд перехода начнем с безусловного перехода.
В ПК имеется несколько машинных команд безусловного перехода, но в ЯА они все обозначаются одинаково:
Безусловный переход (jump): JMP op
Здесь операнд тем или иным способом указывает адрес перехода, т. е. адрес команды, которая должна быть выполнена следующей.
Различают следующие переходы:
- short (короткий). Исп-ся, если адрес перехода находится в пределах со значением -128 to +127 от к-ды jmp
- near (ближний) – если адрес перехода находится в том же сегменте памяти, что и к-да jmp.
- far (дальний) – адрес перехода в другом сегменте. Может выполняться в том же самом сегменте при условии, что в сегментной части операнда указано число, совпадающее с текущим значением регистра cs.
16. Команды сравнения и передачи управления.
Если переход осуществляется только при выполнении некоторого условия и не осуществляется в противном случае, то такой переход называется условным. Условный переход обычно реализуется в два шага: сначала сравниваются некоторые величины, в результате чего соответствующим образом формируются флаги (ZF, SF и т. д.), а затем выполняется собственно условный переход в зависимости от значений флагов. Поэтому мы сейчас рассмотрим и команду сравнения, и команды условного перехода.
Сравнение (compare): CMP op1,op2
Эта команда эквивалентна команде SUB op1,op2 за одним исключением: вычисленная разность op1-op2 никуда не записывается. Поэтому единственный и главный эффект от команды сравнения - это установка флагов, характеризующих полученную разность, или, что то же самое, характеризующих сравниваемые величины ор1 и ор2. Как формируются флаги при вычитании, мы уже рассматривали (см. лаб. 5), поэтому повторяться не будем.
Что же касается команд условного перехода, то их в ПК достаточно много, но в ЯА они все записываются единообразно:
Jxx <метка>
где операнд указывает метку той команды программы, на которую надо сделать переход в случае выполнения некоторого условия, а мнемокод начинается буквой J (от jump), за которой следует одна или несколько букв, в сокращенном виде описывающих это условие.
Все команды условного перехода можно разделить на три группы.
В первую группу входят команды, которые ставятся после команды сравнения. В их мнемокодах с помощью определенных букв описывается тот исход сравнения, при котором надо делать переход. Это такие буквы:
Е - equal (равно)
N - not (не, отрицание)
G - greater (больше) - для чисел со знаком
L - less (меньше) - для чисел со знаком
А - above (выше, больше) - для чисел без знака
В - below (ниже, меньше) - для чисел без знака
Как видно, для условий "меньше" и "больше" введены две системы обозначений. Это связано с тем, что после сравнения чисел со знаком и сравнения чисел без знака надо реагировать на разные значения флагов.
Отметим, что одна и та же команда условного перехода может иметь в ЯА несколько названий-синонимов. Это объясняется тем, что одно и то же условие перехода может быть сформулировано по-разному. Например, условие "меньше" - это в то же время и условие "не верно, что больше или равно", поэтому переход по меньше для знаковых чисел обозначается и как JL, и как JNGE. Какое из этих названий-синонимов использовать - это личное дело автора программы.
Теперь приведем названия всех команд условного перехода, используемых после команды сравнения (через косую черту указаны названия-синонимы):
Мнемокод |
Содержательное условие для перехода после СМР ор1,ор2 |
Состояние флагов для перехода |
для любых чисел | ||
JE |
op1 = op2 |
ZF=1 |
JNE |
op1 <> op2 |
ZF=0 |
для чисел со знаком | ||
JL/JNGE |
op1 < op2 |
SF<>OF |
JLE/JNG |
op1 <= op2 |
SF<>OF или ZF=1 |
JG/JNLE |
op1 > op2 |
SF=OF и ZF=0 |
JGE/JNL |
op1 <= op2 |
SF=OF |
для чисел со знаком | ||
JB/JNAE |
op1 < op2 |
CF=1 |
JBE/JNA |
op1 <= op2 |
CF=1 или ZF=1 |
JA/JNBE |
op1 > op2 |
CF=0 и ZF=0 |
JAE/JNB |
op1 <= op2 |
CF=0 |
(Объясним, к примеру, почему в команде условного перехода "по меньше" для знаковых чисел (JL) проверяется соотношение OF<>SF. Если в команде СМР op1,op2 сравниваемые числа трактуются как знаковые, тогда возможны две комбинации флагов, соответствующие условию op1<op2. Во-первых, если при вычитании op1-op2 не было переполнения мантиссы (OF=0), тогда флаг SF фиксирует настоящий знак разности op1-op2 и потому SF=1 означает, что op1-op2<0, т. е. op1<op2. Во-вторых, если при вычитании произошло переполнение мантиссы (OF=1), тогда результатом команды будет число с противоположным знаком, чем у настоящей разности, и поскольку флаг SF фиксирует не знак настоящей разности, а знак результата команды, то условие SF=0 означает, что у искаженного результата знак положителен, а значит, у настоящей разности знак отрицателен, т. е. op1<op2. Итак, условию op1<op2 соответствует либо OF=0 и SF=1, либо OF=1 и SF=0, что можно записать более коротко: OF<>SF. Именно это условие и указано в таблице для команды JL.)
Пример. Пусть X, Y и Z - переменные размером в слово. Требуется записать в Z максимальное из чисел X и Y.
Решение этой задачи различно для чисел со знаком (см. слева) и для чисел без знака (см. справа), т. к. приходится использовать разные команды условного перехода:
;числа со знаком ;числа без знака
MOV АХ,Х MOV АХ,Х
СМР AX,Y ;х=у? СМР AX,Y
JGE М ;х>=у а M JAE M
MOV AX,Y MOV AX,Y
M: MOV Z,AX M: MOV Z,AX
Во вторую группу команд условного перехода входят те, которые ставятся после команд, отличных от команды сравнения, и которые реагируют на то или иное значение какого-нибудь определенного флага. В мнемокодах этих команд указывается первая буква проверяемого флага, если переход должен быть выполнен при значении 1 у флага, либо эта буква указывается с буквой N (not), если переход надо сделать при нулевом значении флага:
Мнемокод |
Условие перехода |
Мнемокод |
Условие перехода |
JZ |
ZF=1 |
JNZ |
ZF=0 |
JS |
SF=1 |
JNS |
SF=0 |
JC |
CF=1 |
JNC |
CF=0 |
JO |
OF=1 |
JNO |
OF=0 |
JP |
PF=1 |
JNP |
PF=0 |
(Замечание. Легко заметить, что следующие пары мнемокодов эквиваленты: JE и JZ, JNE и JNZ, JB и JC, JNB и JNC.)
Пример. Пусть А, В и С - беззнаковые байтовые переменные. Требуется вычислить С=А*А+В, но если ответ превосходит размер байта, тогда надо передать управление на метку ERROR.
Возможное решение этой задачи:
MOV AL,A
MUL AL
JC ERROR ;A*A > 255 (CF=1) а ERROR
ADD AL,B
JC ERROR ;перенос (CF=1) а ERROR
MOV C,AL
И, наконец, в третью группу входит только одна команда условного перехода, проверяющая не флаги, а значение регистра СХ:
JCXZ <метка>
Действие команды JCXZ (jump if CX is zero) можно описать так:
if CX=0 then goto <метка>