55 lines
2.4 KiB
Plaintext
55 lines
2.4 KiB
Plaintext
nasm -f elf64 test1.asm && ld test1.o -o test1
|
||
|
||
|
||
|
||
|
||
Уровень 1: Простейшие (1 байт, без операндов)
|
||
нет_операции (nop) - 0x90
|
||
вернуться (ret) - 0xC3
|
||
вызов_системы (syscall) - 0x0F 0x05
|
||
остановить (hlt) - 0xF4
|
||
установить_перенос (stc) - 0xF9
|
||
сбросить_перенос (clc) - 0xF8
|
||
отладка (int3) - 0xCC
|
||
|
||
Уровень 2: Простые с одним регистром (1-2 байта)
|
||
втолкнуть (push reg) - 0x50+r
|
||
вытолкнуть (pop reg) - 0x58+r
|
||
увеличить (inc reg) - 0x40+r (32-bit), 0x48 0xFF /0 (64-bit)
|
||
уменьшить (dec reg) - 0x48+r (32-bit), 0x48 0xFF /1 (64-bit)
|
||
|
||
Уровень 3: Регистр-регистр (2-3 байта)
|
||
переместить (mov reg, reg) - 0x48 0x89 (modrm)
|
||
прибавить (add reg, reg) - 0x48 0x01 (modrm)
|
||
вычесть (sub reg, reg) - 0x48 0x29 (modrm)
|
||
сравнить (cmp reg, reg) - 0x48 0x39 (modrm)
|
||
|
||
Уровень 4: Регистр-непосредственное значение (3-10 байт)
|
||
переместить_имм (mov reg, imm) - зависит от размера
|
||
прибавить_непосредственно (add reg, imm)
|
||
сравнить_с (cmp reg, imm)
|
||
|
||
Уровень 5: Работа с памятью (3-7 байт)
|
||
загрузить (mov reg, [reg]) - 0x48 0x8B (modrm)
|
||
сохранить (mov [reg], reg) - 0x48 0x89 (modrm)
|
||
втолкнуть_из_памяти (push mem)
|
||
вытолкнуть_в_память (pop mem)
|
||
|
||
Уровень 6: Относительные переходы (5 байт)
|
||
переход (jmp rel32) - 0xE9
|
||
вызвать (call rel32) - 0xE8
|
||
переход_если_равно (je rel32) - 0x0F 0x84
|
||
|
||
Уровень 7: Сложная адресация (6-7 байт)
|
||
загрузить_адрес (lea reg, [rip+disp]) - 0x48 0x8D (modrm+sib+disp)
|
||
|
||
Уровень 8: 8-битные операции (особые случаи)
|
||
загрузить_байт (mov reg8, imm8)
|
||
прибавить_байт (add reg8, reg8)
|
||
работа со старшими байтами (AH, CH, etc.)
|
||
|
||
Уровень 9: Специальные/сложные
|
||
умножить (mul) - 0xF7 /4
|
||
разделить (div) - 0xF7 /6
|
||
строковые операции
|
||
ввод-вывод |