Перейти к содержанию

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


Рекомендуемые сообщения

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

 

[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)

 

[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
Ссылка на комментарий
Поделиться на другие сайты

  • 10 месяцев спустя...

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

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 // прыжёк, если меньше либо равно

  • Понравилось 1
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

  • 2 года спустя...

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

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

image_5166c424f16e3.jpg


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

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

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

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

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

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

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

  • 3 года спустя...

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

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

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

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

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

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

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

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

5904d6ca3be83_x86.thumb.png.d4863ff64e8b

 

 

 

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

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.