В этой главе вы узнаете о регистрах, используемых в программировании под 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 .
——————————-
Автор: Владимир Пронин