Ассемблер — это просто хадкорный ассемблер


Объяснение ассемблера на сишных примерах


Основной ассемблерной командой является команда пересылки данных MOV, которую можно уподобить оператору присвоения. c = 0x333 на языке ассемблера записывается так: MOV EAX, 333h (обратите внимание на разницу записи шестнадцатеричных чисел!). Можно так же записать MOV EAX, EBX

(записать в регистр EAX значение регистра EBX).

Указатели заключаются в квадратные скобки. Сишное a = *b

на ассемблере записывается так: MOV EAX, [EBX]. При желании, к указателю можно добавить смещение: a = b[0x66]

эквивалентно: MOV EAX, [EBX + 0x66].

Переменные объявляются директивами DB (переменная в один байт), DW (переменная в одно слово), DD (переменная в двойное слово) и т.д. Знаковость переменных при их объявлении не указывается. Одна и та же переменная в различных участках программы может интерпретироваться и как число со знаком и как число без знака. Для загрузки переменной в указатель применяется либо команда LEA, либо MOV с директивой offset. Покажем это на следующем примере:

 

LEA EDX,b     ;// регистр EDX содержит указатель на переменную b

MOV EBX,a     ;// регистр EBX содержит значение переменной a

MOV ECX, offset a // регистр ECX

содержит указатель на переменную a

 

MOV

[EDX],EBX ;// скопировать переменную a b

 

MOV b, EBX    ;// скопировать переменную a b

 

MOV b, a      ;// !!!ошибка!!! так делать нельзя!!!

              ;// оба аргумента команды MOV не могут быть в памяти!

 

a

DD 66h;// объявляем переменную a типа двойного слова и инициализируем ее числом 66h

b

DD ? ;// объявляем неинициализированную переменную b

типа двойного слова

Листинг 1 основные типа пересылок данных

Теперь перейдем к условным переходам. Никакого "if" на ассемблере нет и эту операцию приходится осуществлять в два этапа. Команда CMP позволяет сравнить два числа, сохраняя результат своей работы во флагах. Флаги — это биты специального регистра, описание которого заняло бы слишком много места и поэтому здесь не рассматривается. Достаточно запомнить три основных состояния: меньше (bellow или less), больше (above или great) и равно (equal). Семейство команд условного перехода Jxx проверяют условие xx и, если оно истинно, совершают прыжок по указанному адресу. Например, JE прыгает, если числа равны (Jump if Equal), а JNE если неравны (Jump if Not Equal). JB/JA работают с беззнаковыми числами, а с JL/JG — со знаковыми. Любы два не противоречащих друг другу условия могут быть скомбинированы друг с другом, например: JBE — переход если одно беззнаковое число меньше другого или равно ему. Безусловный переход осуществляется командой JMP.




Начало  Назад  Вперед



Книжный магазин