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


Объяснение ассемблера на сишных примерах - часть 2


Конструкция CMP/Jxx больше всего похожа на Бейсковское IF xxx GOTO, чем на Си. Вот несколько примеров ее использования:

 

CMP EAX, EBX         ;// сравнить EAX

и EBX

JZ xxx               ;// если они равны переход на xxx

 

CMP

[ECX], EDX       ;// сравнить *ECX

и EDX

JAE yyy                    ;// если беззнаковый *ECX

>= EDX

перейти на yyy

Листинг 2 основные типы условных переходов

Вызов функций на ассемблере реализуется намного сложнее, чем на Си. Во-первых, существует по меньшей мере два типа соглашений — Си и Паскаль. В Си-соглашении параметры в функцию передаются справа налево, а из стека их вычищает вызывающий функцию код. В Паскаль соглашении все происходит наоборот! Аргументы передаются слева направо, а из стека из вычищает сама функция. Большинство API-функций операционный системы Windows придерживаются комбинированного соглашения stdcall, при котором аргументы заносятся в соответствии с Си-соглашением, а из стека вычищаются по соглашению Паскаль. Возвращаемое функцией значение помещается в регистр EAX или (для передачи 64-разрядных значений используется регистровая пара EDX:EAX). Разумеется, этих соглашением необходимо придерживаться только при вызове внешних функций (API, библиотек и т. д.)."Внутренние" функции им следовать не обязаны и могут передавать аргументы любым мыслимым способом, например, через регистры.

Вот простейший пример вызовафункции:

 

PUSH offset LibName        ;// засылаем в стек смещение строки

CALL LoadLibrary           ;// вызов функции

MOV h, EAX                  ;// EAX содержит возращенное значение

Листинг 3 вызов API-функции операционной системы




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



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