Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Кто-нибудь объясните подробно следующую схему... |
Посл.ответ | Сообщение |
|
Создано: 24 июня 2006 01:32 · Личное сообщение · #1 |
|
Создано: 24 июня 2006 02:00 · Личное сообщение · #2 Я рад, что хоть кто-то сюда приходит обучаться, дельным вещам. Но всё-таки, постарайся сам приложить усилия и дело пойдёт. В дальнейшем, пожалуйста, конкретизируй вопросы. Ибо пересказывать пол учебника по Асму здесь никто не станет. Для того чтобы понять устройство команд процессора, нужно потыркаться самому в отладчике или хотя бы в Hiew'e. А ещё в этом деле мне очень помогли обучалки Svin'a: www.wasm.ru/toollist.php?list=22 ----- Всем привет, я вернулся ![]() |
|
Создано: 24 июня 2006 13:05 · Личное сообщение · #3 Там мануал на английском,а я в нем мало что понимаю. ![]() 1)Объясните мне следующую схему: 1. Prefixes 2. Code 3. byte mod r/m 4. byte sib 5. offset in command 6. imm. operand. Т.е. объясните, что обозначает каждый из пунктов. 2) Почему когда в FASM'е комманды типа "mov eax,1" FASM вставляет преффикс 66, а перед "xor eax,eax" ничего не вставляет. ![]() ![]() |
|
Создано: 24 июня 2006 13:47 · Личное сообщение · #4 |
|
Создано: 24 июня 2006 14:08 · Поправил: sniperZ · Личное сообщение · #5 |
|
Создано: 24 июня 2006 15:43 · Личное сообщение · #6 sniperZ пишет: 2) Почему когда в FASM'е комманды типа "mov eax,1" FASM вставляет преффикс 66, а перед "xor eax,eax" ничего не вставляет. По умолчанию (без директивы use32) FASM считает, что файл будет исполняться в 16-битной среде (то есть в сегменте памяти с 16-битными адресами и размерами операндов). Команда Ассемблера mov EAX,1 и mov AX,1 имеет общий опкод. Причина в том, что трактовка этого кода зависит от режима разрядности операндов. В защищённом режиме в каждом дескрипторе сегмента есть так называемый бит D, который и определяет режим адресации и размера операнда (16 или 32 бита). Само собой, в Win32 программы имеют именно 32-битный, размера адресов и операндов. 66h – префикс размера операнда. По сути дела этот префикс меняет значение размера операнда установленное битом D на противоположное. Показываю одни и теже байты. В 16-битной трактовке: 00000000: 66B801000000 mov eax,1
В 32-битной трактовке: 00000000: 66B80100 mov ax,1
sniperZ пишет: В каком,а лучше На русском учебник Юрова (все три тома). Правда читать его сложно. ----- Всем привет, я вернулся ![]() |
|
Создано: 24 июня 2006 19:53 · Личное сообщение · #7 |
|
Создано: 24 июня 2006 20:00 · Личное сообщение · #8 |
|
Создано: 25 июня 2006 00:03 · Личное сообщение · #9 |
|
Создано: 25 июня 2006 01:03 · Личное сообщение · #10 sniperZ пишет: Опкод mov - B8. Cразу врубиться очень трудно. Со временем ты сам начнешь замечать закономерности. Если взять все опкоды команды mov вместе с CR и DR регистрами, то их по справке МАСМа 30 штук. Ты привёл пример: mov EAX,5 Каждая команда может отвечать на три вопроса: Что делать? С чем делать? Как делать? (последний вопрос необязателен). Для того чтобы сформировать машинный код команды, нам нужно знать ответ все вопросы. Твой пример нужно трактовать так: поместить в регистр общего назначения непосредственный операнд. А если на языке справочников то так: mov r16,imm16 или mov r32, imm32 Смотрим в справочнике опкод – B8. А дальше как я уже сказал выше, всё зависит от режима адресации. В 32-битном коде: опкод операнд (dword) B8 05000000 В 16-битном коде: Префикс опкод операнд (dword) 66 B8 01000000 Если хочешь разобраться по настоящему, скачай дизассемблер MR-Rem'a: www.wasm.ru/baixado.php?mode=tool&id=350 И не стоит так сразу во всё лезть, а тем более заваливать форум торопливыми вопросами. ЗЫ Тише едешь – больше увидишь. ----- Всем привет, я вернулся ![]() |
![]() |
eXeL@B —› Программирование —› Кто-нибудь объясните подробно следующую схему... |