В этой главе вы узнаете о регистрах,
используемых в программировании под 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 если: |
0 | CF флаг переноса | осуществился перенос или заем. |
2 | PF флаг четности. | младший байт результата содержит четное число установленных бит |
4 | AF флаг полупереноса. | произошел перенос или заем из третьего бита в четвертый. |
6 | ZF флаг ноля. | результат равен 0 |
7 | SF флаг знака. | число отрицательное. Значение флага равно знаковому биту числа. |
11 | OF флаг переполнения. | результат не помещается в операнде назначения. |
Бит #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 .
——————————-
Автор: Владимир Пронин