MasterGH

Ассемблерные инструкции

8 сообщений в этой теме

Более полные справочники:

 

[ENG]

64-ia-32-architectures-software-developer-vol-2a-manual.pdf

64-ia-32-architectures-software-developer-vol-2b-manual.pdf

Instruction_Set_Reference.pdf

 

CE ASM Basics 1 (*new)

CE ASM Basics 2 (*new)

CE ASM Basics 3 (*new)

 

Cheat Engine Source

Assemblerunit.pas (*new)

 

 

[RU]

Архитектура x86 (*new)

CPU

FPU

SIMD (MMX, SSE, SSE2, SSE3, SSSE3).

Рассмотрим основные инструкции.

  

Инструкции можно разделить на три блока  

 

  • * CPU (работа над целыми числами),   
    * FPU (работа над вещественными),
    * SIMD инструкции (работа с массивами чисел).

 

CPU (окно регистров)

post-3-1281083650,91_thumb.png

CPU(основные команды):

    

Скрытый текст

MOV

    mov рег, рег -записать в левый регистр, значение правого регистра

    mov рег,[]  -записать в регистр значение памяти

    mov [],рег -записать в память значение регистра

    

    Важно. Не забываете указывать размер данных. Байт, 2 байта, 4 байта. Это касается всех инструкций работающих со значением адреса в памяти.

    Пример.

    mov eax,byte [410000] - занести в eax значение байта

    mov eax,word [410000] - занести 2 байта

    mov eax,dword [410000] - занести 4 байта

    

    NOP

    Эта команда самая знакомая команда. Она стерает код. Это даже и не команда вовсе.

    SUB

    sub рег,рег -вычесть из левого правый регистр и сохранить в левом

    sub рег,размер []  - вычесть из регистра значение адреса памяти и сохранить регистре

    sub размер [], рег - вычесть из значения адреса в памяти  значение регистра и сохранить в памяти

    

    ADD

    Тоже самое что и SUB только сложение.

    

    CMP

    cmp рег,рег - сравнить регистры

    cmp рег, размер [] -сравнить значение регистра и значение памяти

    cmp размер [], рег -сравнить значение регистра и значение памяти

    *cmp, обычно, ставят сразу перед прыжком.

    сmp будет выскакивать, только если вы ставите бряк на чтение, ведь, здесь только сравнение ))

    

    DEC

    dec рег - уменьшить значение регистра на единицу

    dec размер [] - вычесть значение регистра из значения в памяти  и сохранить в регистре

    sub размер [], рег - вычесть значение значения в памяти  из регистра и сохранить в регистре

    

    INC

    Тоже самое что и DEC только сложение.

    

    LEA

    Вы будите встречать редко, это работа с регистрами.

    LEA EAX,[EBX+ECX*4+100]

    eax=ebx+ecx*4+100

    Эта инструкция нужна лишь для того чтобы вычислить смещение .Просто знайте о ней.

    

    PUSH

    push число - добавить в стек (времення память) число

    push рег - добавить в стек значение регистра

    push размер [] - добавить в значение памяти определённого размера

    Эту команду геймхакеры часто применяют для того чтобы быстро сохранить какое-то значение регистра, если регистр нужен для расчётов.

    

    POP

    Тоже самое что и PUSH только вытаскивание или восстановление. Вытаскивать нужно в обратном порядке.

    Положили 1 2 3 4 5. Вытаскиваем 5 4 3 2 1. Будьте внимательны.

    push eax

    push ebx

    add eax,ebx

    sub ebx,eax

    pop ebx

    pop eax

    

    PUSHAD Сохранение в стек регистров общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax.

    POPAD Восстановление  регистров общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax

    PUSHF Размещение в вершине стека содержимого регистра флагов flags

    POPF Восстановление флагов

    

    XOR

    Исключающие или

    xor   al, 01; изменить значение бита 0 регистра al на обратное

    

    IMUL

    Целочисленное умножение

    mov  bx,186

    imul   eax,bx,8

    

    DIV

    Без знаковое деление

    •    если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;

    •    если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;

    •    если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.

    mov ax,10234

    mov bl,154

    div bl ;ah=остаток, al=частное

 

FPU (окно регистров)

post-3-1281083698,37_thumb.png

Основные FPU(команды):

    

Скрытый текст

Принцип такой есть 8 регистров ST. Эти регистры как барабан, который можно вращать некоторыми инстукциями. Также можно обратиться к каждомму регистру. Если регистр не указаывается, значит имеете дело с первым ST0 напримере комманды как fld [esi] (тоже самое что fld STO, [esi]).

    

    Существуют инструкции довольно часто встречающиеся:

    fld [] - загрузит из памяти в ST0 //fld St1,[] - загрузит в ST1

    stp [] - скопирует из  STO в память

    fstp [] - выгрузит из  STO в память

    ну и так далее...

    

 

SIMD(окно регистров)

 

post-3-1281083764,42_thumb.png

    Эти регистры встречаются довольно редко и в основном в играх  стратегиях, т.е. в играх в которых участвует большое количество объектов (юнитов, зданий, и т.п.)

    Про эти регистры вы можете посмотреть здесь, если будет нужно.

3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Внесу кое-что своё...

LEA

Скопировать результат второго регистра (объекта) в первый

lea eax,[esi+30] //означает копирование esi+30 в eax.

Удобно для сохранения указателей.

В чём разница между mov и lea?

Разберём на примере:

Предположим, что еах = 00684371.

mov ecx,[eax] // скопирует значение, которое находится по адресу регистра еах (то есть значение адреса 00684371)
lea ecx,[eax] // скопирует значение регистра еах (есх = 00684371)
lea ecx,[eax+4] // скопирует в есх значение регистра со смещением 4 (есх = 00684371 + 4,есх = 00684375)

По прыжкам почему-то не сказано ничего.


//Безусловные прыжки
jmp 0f445566 // прыжёк на адрес 0f445566
jmp +6 // прыжёк на 6 байт вперёд (так можно перепрыгивать через строки без установки флага)

//Условные прыжки, применяются после использования сравнения (cmp)
je // прыгнуть, если сравниваемые величины равны
jne // прыгнуть, если сравниваемые величины не равны
jg // прыгнуть, если при сравнении первое число больше другого
jl // прыгнуть, если при сравнении первое число меньше другого
jge // прыжёк, если больше либо равно
jle // прыжёк, если меньше либо равно

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не сравнивыемые величины, а состояние регистра флагов.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я это описал более доступным языком.

Может и не правильный термин подобрал, но мало кто поймёт, что такое "состояние регистра флагов" (особенно новички).

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Должно Вам пригодится при написании скриптов на встроенном ассемблере CE в любом случае; особенно, если Вы, как и Я до недавнего времени, очень часто "лабелите условные переходы" для собственно говоря элементарного - передачи значения в случае "если..."

В общем наткнулся я на весьма интересную документацию в которой вычитал следующие полезности:

image_5166c424f16e3.jpg


PS Администрации/Модераторам

Спрашиваю Вас о существовании возможности разрешить добавление пользователям в сообщение Таблиц, дабы избежать инклюда "текстовых изображений"

<table>/<tr>/<td>// или же аналог на BB // самы удобный вариант on/add функцию в редакторе :)

Или сохранить данное img[.jpeg] на ftp, дабы с течением времени информация не утерялась по независящам от Нас причинам...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По поводу тегов и прочего я тут ни чем помочь не могу. Копию графического файла я прицепил к твоему посту, если надо отредактируй его.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обновил первый пост.

1. Убраны не работающие ссылки CPU, FPU

2. Добавлены ENG справочники. Открытые в свободный доступ с сайта Intel

3. Добавлена ссылка на CPU команды с одного из сайтов

2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обновил первый пост. Добавлены новые ссылки (отмечены)

Особый интерес представляет сайт по описанию x86 архитектуры на русском. Даже скриншот прилагаю, чтобы показать содержание

Скрытый текст

5904d6ca3be83_x86.thumb.png.d4863ff64e8b

 

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас