Отправляет email-рассылки с помощью сервиса Sendsay

Assembler - Просто и Эффективно.

  Все выпуски  

Assembler - Просто и Эффективно. Глава #3


Информационный Канал Subscribe.Ru


Assembler

Глава #3 - регистры процессора.

В этой главе вы узнаете о регистрах, используемых в программировании под Windows. Регистры - встроенные в процессор ячейки памяти.
   -------------------------------

  Регистры общего назначения.
Существует восемь 32 битных регистров общего назначения, называемые: eax, ebx, ecx, edx, esi, edi, ebp, esp. В этих регистрах (кроме esp), можно хранить любые данные, и производить разнообразные операции. Для записи числа в регистр, и копирования чисел из одного регистра в другой используется команда процессора mov.

  Пример:
mov eax,123 - поместить в регистр eax число 123.
mov ecx,eax - поместить в регистр ecx число из регистра eax
После выполнения команд, значение регистров eax и ecx будет 123.

К младшему слову регистра общего назначения можно обращаться как к 16 битному регистру, если убрать из названия символ "e": ax, bx, cx, dx, si, di, bp, sp.
К каждому байту младшего слова регистров eax, ebx, ecx, edx можно обращаться по именам: al и ah для eax, bl и bh для ebx, cl и ch для ecx, dl и dh для edx.

  Пример:
Если поместить в регистр eax число 12345678h, то в ax будет 5678h, в al - 78h, а в ah - 56h.

При использовании команды mov и многих других, разрядность источника и приемника должны совпадать.
   -------------------------------

  Регистр флагов.
В процессоре имеется регистр eflags, который отображает результат выполнения некоторых команд. Другие его назначения мы пока рассматривать не будем.
Команда cmp сравнивает значение регистра с числом или регистром, и устанавливает соответствующие биты eflags, анализируя которые, можно узнать результат сравнения:

Бит#НазваниеРавен 1 если:
0CF флаг переносаосуществился перенос или заем.
2PF флаг четности.младший байт результата содержит четное число установленных бит
4AF флаг полупереноса.произошел перенос или заем из третьего бита в четвертый.
6ZF флаг ноля.результат равен 0
7SF флаг знака.число отрицательное. Значение флага равно знаковому биту числа.
11OF флаг переполнения.результат не помещается в операнде назначения.
Бит #10 - флаг DF, его значение влияет на работу строковых команд.

Cmp возвращает такой же результат, как и при вычитании из первого операнда второго.
Регистр eflags в основном используется командами условного перехода. Эти команды меняют ход выполнения программы, и используются для всевозможных ветвлений алгоритма, циклов и т.д.

Пока рассмотрим одну команду условного перехода: jz. Переход осуществится, если ZF=1.

   -------------------------------
.386
 .model flat,stdcall

MB_YESNO equ 4h
IDYES equ 6

extrn MessageBoxA:proc
extrn ExitProcess:proc
 .data
MsgTitle  db 'Пример #2',0
MsgBody db 'Нажмите любую кнопку.',0
MsgYes  db 'Нажата кнопка ДА',0
MsgNo  db 'Нажата кнопка НЕТ',0
 .code
start:
 call MessageBoxA,0,offset MsgBody,offset MsgTitle,MB_YESNO
 cmp eax,IDYES
 jz UserClickYesButton
 call MessageBoxA,0,offset MsgNo,offset MsgTitle,0
 call ExitProcess,0
UserClickYesButton:
 call MessageBoxA,0,offset MsgYes,offset MsgTitle,0
 call ExitProcess,0
ends
end start
   -------------------------------
Как компилировать исходник показано в Главе #1

Откройте .exe файл отладчиком. Если у вас установлен SoftIce, используйте Symbol Loader из меню "пуск". Отладчик позволяет просматривать и изменять содержимое регистров и т.д в процессе выполнения программы. SoftIce показывает значение каждого флага в виде букв в правом верхнем углу.
Выполнение программы остановится на первой команде. Для выполнения инструкций нажмите F10. После исполнения строчки call MessageBoxA, содержимое регистров изменится.

Функции Windows возвращают значение в регистр EAX. Просмотрев в MSDN'е описание MessageBox, вы узнаете, что если пользователь нажмет кнопку Yes, вернется значение IDYES. IDYES - это константа равная 6. Значение констант можно узнать в файле windows.inc, который находится в папке с компилятором.

cmp eax,IDYES ;Сравниваем значение, возвращенное функцией и 
   ;устанавливаем флаги в eflags.
jz UserClickYesButton ;если ZF установлен (если eax=IDYES),
    ;то перейти на метку UserClickYesButton
Если будет возвращено другое значение, то переход не осуществится.
   -------------------------------

  Регистр EIP
Значение этого регистра всегда равно адресу текущей инструкции в оперативной памяти. Команды процессора не могут обращаться к регистру EIP по имени, но его содержимое устанавливается командами условного и безусловного переходов, и т.д. После выполнения текущей инструкции, значение eip автоматически изменяется процессором.
   -------------------------------

Из следующей главы вы узнаете о назначении регистров cs,ds,ss,es,fs,gs, а также о использовании оперативной памяти в защищенном режиме (для пользовательских программ под Windows). Рассмотрим новые функции ОС.

  Общий пример
Если вы не знаете о представлении чисел в компьютере, смотрите архив рассылки, главу #2.
Значение регистра ecx равно 00 00 00 00h.
Вычтем из регистра cl единицу. Ecx станет равным 00 00 00 FFh.Флаги: SF AF PF CF=1 .ZF OF=0.
Прибавим к ecx единицу. Ecx будет равен 00 00 01 00h, соответственно cx=01 00h, ch=01h и cl=00h. Флаги: OF SF ZF CF=0; AF PF=1
Для сложения и вычитания используйте команды add и sub. Откомпилируйте и откройте отладчиком этот пример:
   -------------------------------
.386
 .model flat,stdcall
extrn ExitProcess:proc
 .data
 db 0
 .code
start:
 mov eax,0
 sub cl,1
 add ecx,1
 call ExitProcess,0
ends
end start
   -------------------------------

 Содержание дальнейших выпусков зависит от вас. Будут разъясняться те темы, которые непонятны большинству читателей. Сайт рассылки: asm32.nm.ru. Присылайте свои вопросы и предложения по адресу: asm32@nm.ru .
   -------------------------------


Автор рассылки Владимир Пронин. Любое коммерческое использование материалов рассылки без ведома и прямого согласия автора запрещено.
Письма присланные автору рассылки могут быть опубликованы целиком или частично без предварительного уведомления. Если вы не хотите, чтобы ваше письмо было опубликовано укажите это в начале письма.


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.asm32
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное