Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 19.02.2009, 04:26   #1
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию Экскурс в команды ассемблера


Команда MOV - пересылка данных RtM или MtR
Семантика:
MOV r8/r16/r32,m8/m16/m32
MOV m8/m16/m32,r8/r16/r32
MOV r8/r16/r32,r8/r16/r32

Команда копирует данные из регистра в память или наоборот так же возможна пересылка из регистра в регистр. В выскоуровневых языка реализована в виде присваивания.
MOV EAX,dword ptr[rMem]
Перешлет двойное слово расположенное по адресу rMem в регистр EAX
MOV EAX,0Ah
Преобразует 0Ah в двойное слово - 0000000Ah и перешлет его в EAX
Важно понимать что если вы работаете с каким то регистром и пересылаете в него данные, то размер операнда будет преобразован в размер регистра.
Незаполненые участики операнда заполняются нулями. Вот как в нашем примере - 0Ah ведь на самом деле по размер байт, но он дополнен нулями, что
бы занулить остальные 3 байта регистра. Вот скажем команда.
MOV AX,0Ah
Дополнит 0Ah до вида 000Ah - слова. Таким образом из всего EAX-а занулится только один байт, тоесть E-часть останется неизменной.


Команда ADD - сложение двух операндов RtM или MtR
Семантика:
ADD r8/r16/r32,m8/m16/m32
ADD m8/m16/m32,r8/r16/r32
ADD r8/r16/r32,r8/r16/r32

Команда выполняет сложение двух чисел, находящихся в регистре и памяти или же в регистре и регистре.
ADD EAX,dword ptr[rMem]
Прибавит к EAX двойное слово которое находится по адресу rMem.
ADD EAX,0Ah
Прибавит 0Ah к EAX . Тут никаких преобразований не происходит так как не требуется. Но размер операнда прибавляемого к операнду применику,
должен соотвествовать размеру последнего. Если при сложении двух операндов происходит переполнение операнда применика -
самый старший бит результата сложения(именно тот который не помещаеться в операнд применик) устанавливается как флаг CF(Carry Flag).
В ассемблере предусмотрены две инструкции которые как раз дают возможность работать с этим битом.

Команда SUB - вычитание двух операндов RtM или MtR
Семантика:
SUB r8/r16/r32,m8/m16/m32
SUB m8/m16/m32,r8/r16/r32
SUB r8/r16/r32,r8/r16/r32

Команда выполняет сложение двух чисел, находящихся в регистре и памяти или же в регистре и регистре.
SUB EAX,dword ptr[rMem]
Прибавит к EAX двойное слово которое находится по адресу rMem.
SUB EAX,0Ah
Вычтет 0Ah из EAX . Аналогично ADD, тут преобразования тоже не происходят. Но как и при ADD, размер операндов должен быть одинаковым.
Флаг CF(Carry Flag - флаг переноса) не устанавливается, по понятным причинам.


Команда ADC - сложение двух операндов, при переполнении операнда применика, лишний бит устанавливается в CF.

Семантика:
ADC r8/r16/r32,m8/m16/m32
ADC m8/m16/m32,r8/r16/r32
ADC r8/r16/r32,r8/r16/r32

Как видно семнтика аналогична ADD.
MOV EAX,0FFFFFFFFh ;Это для наглядности.
ADC EAX,1

В EAX окажутся нули, а вот CF будет установлен в TRUE(1).


Команда SBB - вычитание двух операндов, с заемом из CF.

Семантика:
SBB r8/r16/r32,m8/m16/m32
SBB m8/m16/m32,r8/r16/r32
SBB r8/r16/r32,r8/r16/r32

Семантика аналогична SUB, а вот принцип работы несколько иной.
Допустим произошло переполнение например такое:
MOV EAX,0FFFFFFFFh
ADC EAX,1

Теперь происходит наша команда:
SBB,EAX,0Ah
Как это работает? Очень просто. На самом деле 0Ah отнимается не от того что в EAX а от совсемстного числа состоящего из старшей части - CF и младшей EAX
Тоесть фактически в качестве первого операнда выступает число 100000000h. Результатом будет то что в EAX окажеться 0FFFFFFF5h.

Команда LEA - вычисление эффективного адреса переменной.
Семантика:
LEA r32,m32/m16/m8

Вычисляет эффективный адрес переменной в коде и пересылает его в первый операнд.
Например код:
LEA EAX,sPrintf
Вычислит эффективный адрес переменной sPrintf и поместит его в EAX


Последний раз редактировалось Ivan_32; 28.02.2009 в 08:22.
  Ответить с цитированием
12 пользователя(ей) сказали cпасибо:
Angeal (22.07.2009), Den1S (01.03.2009), DrFauaar (10.01.2010), GuyOfHells (22.10.2012), J-Fobos (22.04.2009), Leo_ня (24.02.2009), PeTaK (29.03.2009), reraider (19.03.2018), shagart (20.02.2009), Travakur92 (22.08.2012), xatayi (06.08.2009), Zhyk (19.02.2009)
Старый 19.02.2009, 19:10   #2
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда AND - логическое И для двух операндов, результат сохраняется в первом.
Семантика:
AND r8/r16/r32,m8/m16/m32
AND m8/m16/m32,r8/r16/r32
AND r8/r16/r32,r8/r16/r32

Для начала выясним что же такое логическое И. В Дискретной математике эту операцию называют конъюнкцией или логическим умножением.
В ассемблере эта операция работает с битами.
Таблица Истинности:
<table width="121" border="1" bordercolor="black" cellpadding="2" cellspacing="0" height="170"><tbody><tr><td width="20" align="center">OP1</td><td width="20" align="center">OP2</td><td width="20" align="center">AND</td></tr><tr><td width="20" align="center">1</td><td width="20" align="center">1</td><td width="20" align="center">1</td></tr> <tr><td width="20" align="center">1</td><td width="20" align="center">0</td><td width="20" align="center">1</td></tr> <tr><td width="20" align="center">0</td><td width="20" align="center">1</td><td width="20" align="center">0</td></tr><tr><td width="20" align="center">0</td><td width="20" align="center">0</td><td width="20" align="center">0</td></tr> </tbody></table>
Для наглядности рассмотри еще один пример.
Применим операцию к двум числам - 6 и 12.
Их интерпертации в двоичной системе счисления:
6 - 0110
8 - 1100
______
|0110|
|1100|
|----|
|0100|

Получилось 0100 - 4.
Используется эта команда когда нужно выделить часть операнда, например таким образом вполне можно выделить первые 4 бита AH
AND AH,00001111h

Последний раз редактировалось Ivan_32; 19.02.2009 в 19:15.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (20.02.2009), xatayi (06.08.2009)
Старый 19.02.2009, 19:21   #3
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда OR - логическое ИЛИ для двух операндов, результат сохраняется в первом.
Семантика:
OR r8/r16/r32,m8/m16/m32
OR m8/m16/m32,r8/r16/r32
OR r8/r16/r32,r8/r16/r32

Для начала выясним что же такое логическое ИЛИ. В Дискретной математике эту операцию называют дизъюнкцией или логическим сложением.
В ассемблере эта операция работает с битами.

Таблица Истинности:
<table border="1" bordercolor="black" cellpadding="2" cellspacing="0"><tbody><tr><td width="20" align="center">OP1</td><td width="20" align="center">OP2</td><td width="20" align="center"> OR</td></tr><tr><td width="20" align="center">1</td><td width="20" align="center">1</td><td width="20" align="center">1</td></tr> <tr><td width="20" align="center">1</td><td width="20" align="center">0</td><td width="20" align="center">1</td></tr> <tr><td width="20" align="center">0</td><td width="20" align="center">1</td><td width="20" align="center">1</td></tr><tr><td width="20" align="center">0</td><td width="20" align="center">0</td><td width="20" align="center">0</td></tr> </tbody></table>
Для наглядности рассмотри еще один пример.
Применим операцию к двум числам - 6 и 12.
Их интерпертации в двоичной системе счисления:

6 - 0110
8 - 1100
______
|0110|
|1100|
|----|
|1110|

Получилось 1110 - 14.
Эта команда используется когда нужно установить в операнде бит в состояние TRUE(1). Для примера:
OR AH,00100000b
Установит шестой бит в состояние TRUE(1).
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (20.02.2009), xatayi (06.08.2009)
Старый 19.02.2009, 19:28   #4
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда XOR - логическое исключающее ИЛИ для двух операндов, результат сохраняется в первом.
Семантика:
XOR r8/r16/r32,m8/m16/m32
XOR m8/m16/m32,r8/r16/r32
XOR r8/r16/r32,r8/r16/r32

Для начала выясним что же такое логическое исключающее ИЛИ. В Дискретной математике эту операцию называют исключающим ИЛИ.
В ассемблере эта операция работает с битами.
Таблица Истинности:
Таблица Истинности:
<table width="121" border="1" bordercolor="black" cellpadding="2" cellspacing="0" height="170"><tbody><tr><td width="20" align="center">OP1</td><td width="20" align="center">OP2</td><td width="20" align="center">XOR
</td></tr><tr><td width="20" align="center">1</td><td width="20" align="center">1</td><td width="20" align="center">0
</td></tr> <tr><td width="20" align="center">1</td><td width="20" align="center">0</td><td width="20" align="center">1</td></tr> <tr><td width="20" align="center">0</td><td width="20" align="center">1</td><td width="20" align="center">1
</td></tr><tr><td width="20" align="center">0</td><td width="20" align="center">0</td><td width="20" align="center">0</td></tr> </tbody></table>

Для наглядности рассмотри еще один пример.
Применим операцию к двум числам - 6 и 12.
Их интерпертации в двоичной системе счисления:
6 - 0110
8 - 1100
______
|0110|
|1100|
|----|
|1010|

Получилось 1010 - 14.
Эта команда - основа всех алгоритмов шифрования/хеширования.
Имеем шифрующий ключ - 00001000h
При зашифровании такая команда:
XOR AH,00001000h
Как ни странно но когда будем расшифровывать нужно применить одну и ту же команду:
XOR AH,00001000h
Удобство на лицо. Главное что бы этот самый ключ знали только вы и тот кто принимает сообщение.
Конечно такой метод шифрования довольно прост и криптостойкость у него мизерная. Но зато это самый быстрый вариант.
Все остальные основаны на нем.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (28.02.2009), xatayi (06.08.2009)
Старый 19.02.2009, 19:38   #5
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда NOT - логическое отрицание.
Семантика:
NOT r8/r16/r32
NOT m8/m16/m32

Для начала выясним что же такое логическое отрицание.
В ассемблере эта операция работает с битами.
Таблица Истинности:
<table border="1" bordercolor="black" cellpadding="2" cellspacing="0"><tbody><tr><td width="20" align="center">OP1</td><td width="20" align="center">OP2</td></tr><tr><td width="20" align="center">1</td><td width="20" align="center">0</td></tr> <tr><td width="20" align="center">0</td><td width="20" align="center">1</td></tr> </tbody></table>
Для наглядности рассмотри еще один пример.
Применим операцию к числу 10
Его интерпертация в двоичной системе счисления:
10 - 1010
______
|1010|
|----|
|0101|

Получилось 0101 - 5.
Эта команда инвертирует все биты операнда. Иногда бывает очень полезно.

Последний раз редактировалось Ivan_32; 20.02.2009 в 21:57.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (20.02.2009), xatayi (06.08.2009)
Старый 19.02.2009, 19:46   #6
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда SHR побитовый сдвиг с лева на право в операнде.
Семантика:
SHR r8/r16/r32,r8/m8
SHR m8/m16/m32,r8/m8

Двигает биты в прямом смысле этого слова, после битов остаются нули.
Например есть число. 1000b
MOV AL,1000b
SHR AL,2

В результате в AL окажется число 0010b - бит подвинулся ровно на 2 позиции.
Таким образом можно выделить верхнии 4 бита AL:
SHR AL,4
Например было в AL число 11110000b, а станет 00001111b.


Команда SHL побитовый сдвиг с права на лево в операнде.
Семантика:
SHL r8/r16/r32,r8/m8
SHL m8/m16/m32,r8/m8

Двигает биты в прямом смысле этого слова, после битов остаются нули.
Например есть число. 1000b
MOV AL,0011b
SHL AL,2

В результате в AL окажется число 1100b - бит подвинулся ровно на 2 позиции.
Таким образом можно сохранить текущее значение AX, в E-части и продолжить работать с ним без опасений потри данных:
MOV EAX,FFFFh ;Это для наглядности.
SHL EAX,16

Такой вот финт ушами на самом деле очень неплохая оптимизация. Ведь этот сдвиг произойдет быстрее чем пересылка данных из AX в память. Хотя можно конечно и в другой регистр переслать.

Последний раз редактировалось Ivan_32; 19.02.2009 в 19:50.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (20.02.2009), xatayi (06.08.2009)
Старый 19.02.2009, 20:14   #7
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию Некоторые полезные данные.

1. Биты в байте нумерованы с права на лево по возрастанию и начальный номер первого байта не один а ноль и каждый из них имеет свой вес.
Из весов всех установленных в TRUE(1) битов составляется число. Для пример вот число:
<table border="1" bordercolor="black" cellpadding="0" cellspacing="0"><tbody><tr><td align="center">Значение</td><td width="20" align="center">1</td><td width="20" align="center">0
</td><td width="20" align="center">1</td><td width="20" align="center">0
</td><td width="20" align="center">1</td><td width="20" align="center">1</td><td width="20" align="center">1</td><td width="20" align="center">0
</td></tr><tr><td align="center">Номер</td><td width="20" align="center">7
</td><td width="20" align="center">6
</td><td width="20" align="center">5
</td><td width="20" align="center">4
</td><td width="20" align="center">3
</td><td width="20" align="center">2
</td><td width="20" align="center">1</td><td width="20" align="center">0
</td></tr> <tr><td align="center">Вес</td><td width="20" align="center">128
</td><td width="20" align="center">64
</td><td width="20" align="center">32
</td><td width="20" align="center">16
</td><td width="20" align="center">8
</td><td width="20" align="center">4
</td><td width="20" align="center">2
</td><td width="20" align="center">1</td></tr> </tbody></table>7,5,3,2,1
- биты установлены в 1, посчитаем сумму весов этих битов:
128+32+8+4+2=174.

2. Для того что бы обратится к памяти по определенному адресу например 00010000h нужно поставить это число в квадратные скобки [].
Например:
MOV EAX,DWORD PTR[00010000h]
обратится к слову по адресу 00010000h
А вот:
MOV EAX,00010000h
Просто перешлет число 00010000h в EAX.

3. При некоторых операциях а особенно при тех в которых задействуется память, нужно преобразовывать операнд до размерности регистра.
Приставка [SIZE] PTR к операнду сделает это. Вместо [SIZE] нужно ставить DWORD , WORD ,BYTE или операнд нужно размерности, как показывает
практика операндов больше чем DWORD и операндов меньше чем BYTE в x86(32Bit) ассемблере не используется.
Для примера приведем:
MOV AL,BYTE PTR[EBX]
В качестве адресатора(переменная значение которой используется в качестве адреса) выступает EBX, размерность возвращаемого операцией [EBX] 4 байта, естественно в 1-байтовый AL они не поместятся, потому следующая строка в отличие от этой просто не скомпилируется.
MOV AL,[EBX]


4. Точка с запятой это символ однострочного комментария, многострочных в ассемблере вроде бы нет. То есть все что идет в строке за ; считается комментарием.


Последний раз редактировалось Ivan_32; 19.02.2009 в 20:25.
  Ответить с цитированием
7 пользователя(ей) сказали cпасибо:
Den1S (01.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (20.02.2009), xatayi (06.08.2009), Zhyk (19.02.2009)
Старый 19.02.2009, 20:53   #8
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

5. Базовый каркас приложения для MASM:
.586
.model flat,stdcall

;Тут идут include-ы
;И includelib-ы
;А так же прототипы импортируемых функций
include "masm32.inc"
includelib "masm32.lib"
dwtoa proto :DWORD,:DWORD
;Сначала имя функции, потом слово proto, потом ТИП каждого ;аргумента через запятую.
.data
;инициализированные данные
;Задаются с помощью DB Define Byte DW Define Word
;DD Define DoubleWord
;DQ Define QuadWord
;и других типов данных.
;Так же можно автоматизировать повторяющиеся байты - var [размерность-db dw...] [Количество] dup([Значение])
;helloWorld db "Hello world",0

;Каждая строка должна заканчиватся нулевым символом.
WVal dw 1004
DVal dd 15050500
QVal dq 1000100010001000
AVal db 512 dup(0)
.data?
;зарезервированные данные
;Разница этого блока и .data в том что всем переменным здесь присваивается знак ?
WVal dw ?
DVal dd ?
QVal dq ?
AVal db 512 dup(?)
;ВАЖНО: имена переменных в этих двух блоках и во всех остальных не ;должны повторятся, тоесть текущий код неработоспособен.
.const
;константы задаются так же как переменные только они не компилилруются а заменяются при компиляции.
;Задаются они одной командой - equ.
CVal equ 1001
.code
start: ;Метка начала кода, имя можно использовать любое, главное что бы она была.
invoke ExitProcess,0 ; invoke - макрос вызова функции. Без этой функции программа будет как бы некорректно завершатся,
;это ничем не черевато.
Просто ОС будет об этом оповещать.
end start ; это тоже обязательно.

6. Вместо виртуальных адресов в коде, используются метки. Метка задается в любом месте кода и указывается на адрес по которому начинается следущая за меткой команда, для задания метки пишется ее название и за названием двоеточие : Пример использования метки:
mov eax,0
Label: mov edx,0


Метка Label будет содержать адрес именно этой команды,
mov edx,0 и больше никакой. Метки можно так же использовать и в качестве адреса. например это код положит в EAX адрес на который указывает метка:
LEA EAX,Label


Последний раз редактировалось Ivan_32; 26.02.2009 в 07:53.
  Ответить с цитированием
7 пользователя(ей) сказали cпасибо:
Глюконатор (26.02.2009), Den1S (01.03.2009), DrFauaar (10.01.2010), Leo_ня (24.02.2009), PeTaK (29.03.2009), shagart (20.02.2009), xatayi (06.08.2009)
Старый 26.02.2009, 06:49   #9
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Регистры процессора

1. Регистры общего назначения:
[32Bit]EAX - аккумулятор, обычно используется для хранения результатов и промежуточных данных вычислений.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">EAX</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">AX</td></tr><tr align="center"><td width="50">AH</td><td width="50">AL</td></tr></tbody></table>

[32Bit]EBX - база, обычно используется для адресации в памяти.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">EBX</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">BX</td></tr><tr align="center"><td width="50">BH</td><td width="50">BL</td></tr></tbody></table>

[32Bit]ECX - счетчик, обычно используется для организации циклов.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">ECX</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">CX</td></tr><tr align="center"><td width="50">CH</td><td width="50">CL
</td></tr></tbody></table>

[32Bit]EDX - данные, обычно используется для хранения результатов и промежуточных данных и операций ввода/вывода.
Это условные обозначения, никаких ограничений на использование нет.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">EDX</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">DX</td></tr><tr align="center"><td width="50">DH</td><td width="50">DL
</td></tr></tbody></table>


2. Идексные регистры:

[32Bit]ESI - индекс источника.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">ESI</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">SI
</td></tr></tbody></table>

[32Bit]EDI - идндекс приемника.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">EDI</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">DI
</td></tr></tbody></table>

[32Bit]EBP - используется для произвольного доступа к элементам стека.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">EBP</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">BP
</td></tr></tbody></table>


3. Указательные регистры:
[32Bit]ESP - указывает на текущий элемент стека.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">ESP</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">SP</td></tr></tbody></table>

[32Bit]EIP - указывает на следующую инструкцию в сегменте кода.
<table width="200" border="1" cellpadding="0" cellspacing="0"><tbody><tr width="200" align="center"><td colspan="4">EIP
</td></tr><tr align="center"><td colspan="2" rowspan="2" width="100">
</td><td colspan="2" width="100">IP</td></tr></tbody></table>


4. Сегментные регистры:

[16Bit]CS - сегмент кода.
[16Bit]DS - сегмент данных.
[16Bit]SS - сегмент стека.
[16Bit]ES - дополнительный сегмент. Используется в строковых операциях.
[16Bit]FS - дополнительный сегмент без спец. предназначения.
[16Bit]GS - дополнительный сегмент без спец. предназначения.

5.Регистр флагов EFLAGS.
Регистр флагов отдельная тема. Это 32-Битный регистр каждый бит в котором что то означает и играет роль в какой то из операций.
Почти все команды условных переходов зависят от регистра флагов, вернее они проверяют состояние этих флагов.
Мы рассмотрим лишь некоторые из них:

CF - флаг переноса после арифметической операции.
1 - произошел перенос из старшего бита результата в следующий бит(в такой ситуации это буквально сам CF).
0 - переноса не было.

ZF - флаг нуля.
1 - результат последней операции нулевой.
0 - результат последней операции не нулевой.

OF - флаг переполнения.
1 - произошло переполнение.
0 - переполнения не было.

DF - флаг направления в строковых операциях.
1 - направление от старших адресов к младшим.
0 - направление от младших адресов к старшим.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (01.03.2009), DrFauaar (10.01.2010), Leo_ня (26.02.2009), PeTaK (29.03.2009), shagart (28.02.2009), xatayi (06.08.2009)
Старый 26.02.2009, 07:32   #10
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда CMP - сравнение двух операндов, результат сохраняется в битах EFLAGS
Семантика:
CMP r8/r16/r32,m8/m16/m32
CMP m8/m16/m32,r8/r16/r32
CMP r8/r16/r32,r8/r16/r32

Команда сравнивает два операнда вычитая из второго первый и по результатам сравнения выставляет флаги.
Допустим в EAX находится числов 0FFFFh тогда команда:
CMP EAX,0FFFFh
установит ZF в 0 - отличий не найдено.




Команда TEST - тестирует биты операнда 1 по маске в операнде 2.
Семантика:
TEST r8/r16/r32,m8/m16/m32
TEST
m8/m16/m32,r8/r16/r32
TEST r8/r16/r32,r8/r16/r32

Команда тестирует биты первого операнда по маске во втором операнде:
TEST EAX,1000b
проверит установлен ли бит #3 в состояние TRUE(1) если да то ZF будет установлен в 1.
Сравнение битов кроме тех которые в маске(второй операнд) установлены в 1 не происходит.
  Ответить с цитированием
7 пользователя(ей) сказали cпасибо:
Den1S (01.03.2009), DrFauaar (10.01.2010), J-Fobos (22.04.2009), Leo_ня (26.02.2009), PeTaK (29.03.2009), shagart (28.02.2009), xatayi (06.08.2009)
Старый 26.02.2009, 07:46   #11
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда JMP - безусловный переход.
Семантика:
JMP r32/m32

Передает управление коду по адресу в операнде.
JMP 00010000h
Передаст управление коду по адресу 00010000h
Фактически команда помещает в EIP значение 00010000h.

Команда JE - переход если равно.
Семантика:
JE r32/m32

Передает управление коду по адресу в операнде
если ZF=0.
CMP EAX,10h
JE 00010000h

Управление будет передано только если число в EAX равно 10h

Команда JNE - переход если не равно.
Семантика:
JNE r32/m32

Передает управление коду по адресу в операнде
если ZF=0.
CMP EAX,10h
JNE 00010000h

Управление будет передано только если число в EAX не равно 10h

Последний раз редактировалось Ivan_32; 20.06.2009 в 15:24.
  Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
DrFauaar (10.01.2010), Leo_ня (26.02.2009), PeTaK (29.03.2009), xatayi (06.08.2009)
Старый 26.02.2009, 08:36   #12
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда PUSH - пересылка слова или двойного слова в стек.
Семантика:
PUSH r8/r16/r32
PUSH m8/m16/m32

Помещает слово или двойное слово из операнда в стек. Минимальный размер операнда - 2 байта.
Если операнд занимает 1 байт - в стек будет помещен этот байт а недостающий байт будет взят за нули.
PUSH 0FFh
Поместит с стек слово 00FFh
PUSH 0FFFFFFFFh
Поместит в стек двойное слово 0FFFFFFFFh
PUSH EAX
Поместит в стек содержимое регистра EAX.
PUSH AX
Поместит в стек содержимое регистра AX.
PUSH AH
Помсетстит в стек содержимео регистра AH дополненое до слова. То есть, если в AH содержится 0FFh
то в стек попадет 0FFh.
Данная команда не изменяет содержимое операндов.

Команда POP - пересылка данных из стека в операнд приемник.
Семантика:
POP r8/r16/r32
POP m8/m16/m32

Помещает байт\слово\двойное слово из стека в операнд приемник.
POP AL
Поместит байт из стека в AL , байт из стека будет стерт
POP AX
Поместит слово из стека в AX , слово из стека будет стерто
POP EAX
Поместит двойное слово из стека в
EAX , двойное слово из стека будет стерто
POP BYTEVar
Поместит байт из стека в однобайтовую переменную
BYTEVar
, байт из стека будет стерт.
POP WORDVar
Поместит байт из стека в двухбайтовую переменную
WORDVar
, двойное слово из стека будет стерто.
POP DWORDVar
Поместит байт из стека в четырехбайтовую переменную
DWORDVar
, двойное слово из стека будет стерто.
  Ответить с цитированием
5 пользователя(ей) сказали cпасибо:
DrFauaar (10.01.2010), J-Fobos (22.04.2009), Leo_ня (26.02.2009), PeTaK (29.03.2009), xatayi (06.08.2009)
Старый 28.02.2009, 06:53   #13
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда JG - переход если больше.
Семантика:
JG r32/m32

Передает управление коду по адресу в операнде
если первый операнд больше второго операнда, в последнем сравнении.
CMP EAX,10h
JG 00010000h

Управление будет передано только если число в EAX будет больше 10h.
Прим: Сравнение должно происходить с числами со знаком.

Команда JNG - переход если не больше.
Семантика:
JNG r32/m32

Передает управление коду по адресу в операнде
если первый операнд не больше второго операнда, в последнем сравнении.
CMP EAX,10h
JNG 00010000h

Управление будет передано только если число в EAX будет не больше 10h.
Прим: Сравнение должно происходить с числами со знаком.

Команда JL - переход если меньше.
Семантика:
JL r32/m32

Передает управление коду по адресу в операнде
если первый операнд меньше второго операнда, в последнем сравнении.
CMP EAX,10h
JL 00010000h

Управление будет передано только если число в EAX будет меньше 10h.
Прим: Сравнение должно происходить с числами со знаком.

Команда JNL - переход если не меньше.
Семантика:
JNL r32/m32

Передает управление коду по адресу в операнде
если первый операнд больше второго операнда, в последнем сравнении.
CMP EAX,10h
JNL 00010000h

Управление будет передано только если число в EAX будет не меньше 10h.
Прим: Сравнение должно происходить с числами со знаком.



Последний раз редактировалось Ivan_32; 28.02.2009 в 07:07.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (28.02.2009), PeTaK (29.03.2009), shagart (28.02.2009), xatayi (06.08.2009)
Старый 28.02.2009, 07:13   #14
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда JA - переход если больше.
Семантика:
JA r32/m32

Передает управление коду по адресу в операнде
если первый операнд больше второго операнда, в последнем сравнении.
CMP EAX,10h
JA 00010000h

Управление будет передано только если число в EAX будет больше 10h.
Прим: Сравнение должно происходить с числами без знака.

Команда JNA - переход если не больше.
Семантика:
JNA r32/m32

Передает управление коду по адресу в операнде
если первый операнд не больше второго операнда, в последнем сравнении.
CMP EAX,10h
JNA 00010000h

Управление будет передано только если число в EAX будет не больше 10h.
Прим: Сравнение должно происходить с числами без знака.

Команда JB - переход если меньше.
Семантика:
JB r32/m32

Передает управление коду по адресу в операнде
если первый операнд меньше второго операнда, в последнем сравнении.
CMP EAX,10h
JB 00010000h

Управление будет передано только если число в EAX будет меньше 10h.
Прим: Сравнение должно происходить с числами
без знака.

Команда JNB - переход если не меньше.
Семантика:
JNB r32/m32

Передает управление коду по адресу в операнде
если первый операнд больше второго операнда, в последнем сравнении.
CMP EAX,10h
JNB 00010000h

Управление будет передано только если число в EAX будет не меньше 10h.
Прим: Сравнение должно происходить с числами без знака.

Последний раз редактировалось Ivan_32; 15.06.2009 в 00:05.
  Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), PeTaK (29.03.2009), shagart (28.02.2009), xatayi (06.08.2009)
Старый 28.02.2009, 07:52   #15
Заблокирован
 Капитан
Аватар для Ivan_32
 
Ivan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компанииIvan_32 душа компании
Регистрация: 14.05.2008
Сообщений: 253
Популярность: 1015
Сказал(а) спасибо: 666
Поблагодарили 451 раз(а) в 173 сообщениях
Отправить сообщение для Ivan_32 с помощью ICQ Отправить сообщение для Ivan_32 с помощью Telegram Отправить сообщение для Ivan_32 с помощью Skype™
 
По умолчанию

Команда JNAE - переход если не больше и не равно.
Семантика:
JNAE r32/m32

Передает управление коду по адресу в операнде
если первый операнд больше или равен второму операнду, в последнем сравнении.
CMP EAX,10h
JNAE 00010000h

Управление будет передано только если число в EAX будет не больше и не равно 10h.
Прим: Сравнение должно происходить с числами без знака.

Команда JNBE - переход если не меньше или равно.

Семантика:
JNBE r32/m32

Передает управление коду по адресу в операнде
если первый операнд не больше и не равно второму операнду, в последнем сравнении.
CMP EAX,10h
JNBE 00010000h

Управление будет передано только если число в EAX будет не меньше и не равно 10h.
Прим: Сравнение должно происходить с числами без знака.


Команда JNLE - переход если не меньше и не равно.
Семантика:
JNLE r32/m32

Передает управление коду по адресу в операнде
если первый операнд не меньше не равен второму операнду, в последнем сравнении.
CMP EAX,10h
JNLE 00010000h

Управление будет передано только если число в EAX будет не меньше и не равно 10h.
Прим: Сравнение должно происходить с числами со знаком.


Команда JNGE - переход если не больше и не равно
Семантика:
JNGE r32/m32

Передает управление коду по адресу в операнде
если первый операнд не больше и не равен второму операнду, в последнем сравнении.
CMP EAX,10h
JNGE 00010000h

Управление будет передано только если число в EAX будет не больше и не равно 10h.
Прим: Сравнение должно происходить с числами со знаком.

Последний раз редактировалось Ivan_32; 15.06.2009 в 09:47.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
Den1S (15.03.2009), DrFauaar (10.01.2010), Leo_ня (28.02.2009), PeTaK (29.03.2009), shagart (28.02.2009), xatayi (06.08.2009)
Ответ

Метки
ассемблера, команды, мини-экскурс

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ID, GM команды off/java. Loreg Lineage 2 17 24.04.2016 04:19
[Обсуждение] Gm команды и еще немного Апрель Баги и читы Perfect World 18 06.05.2010 21:29
Gm команды -(NY)- Треп 2 16.11.2008 14:20
Ragnarok Online GM-Команды Loreg Треп 1 07.10.2008 18:49

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 03:33.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net