![]() |
|
|
![]()
|
|
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
Например, есть команда
Вот ее запись из файла lst 89 89 0000r или 100010 01 10 001 001 0000r dw mod reg rm mod определяет способ адрессации. Можете пояснить, почему именно 10. |
|||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: нет Всего: 16 |
Есть правила формирования, они довольно сложные для начального восприятия, прочти о них лучше в манах интела. так же для удобства составлены таблицы всех возможных значении, они опять же есть в манах интела.
|
|||
|
||||
| sgi1981 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 16.3.2006 Репутация: 2 Всего: 10 |
это расшифровывается так: 1) определить смещение ячейки памяти операнда-приемника в сегменте данных как сумму 16-разрядных значений регистров di и bx и непосредственного 16-разрядного смещения mas di+bx+mas 2) занести 16-ти разрядное значение из cx в выше определенную ячейку памяти Эффективное смещение операнда-приемника в таком случае вычисляется по формуле [bx+di]+смещ_16 где есть две составляющие смещения 1) регистровая 2) непосредственная (заданная в самой машинной инструкции) (1) и (2) составляющие кодируются в байте modr/m машинной инструкции так: (1) составляющая смещения - трех битным полем r/m, значение которого зависит от комбинации регистров в формуле смещения (в данном случае оно равно 001) (2) составляющая смещения - двух битным полем mod так: если смещение отсутствует - mod = 00 если смещение равно 8 бит - mod = 01 если смещение равно 16 бит - mod = 10 если вместо ячейки памяти используется регистр общего назначения - mod = 11 (в данном случае оно равно 10) Трех битное поле reg байта modr/m кодирует регистр общего назначения в качестве второго операнда. -------------------- Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства. |
|||
|
||||
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
Тогда еще вопрос, а почему смещение mas именно 2 байта. Mas задается так
Зависит оно от размера, или от чего-то другого(количества базовых регистров)? |
|||
|
||||
| BUGOR |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: нет Всего: 16 |
Зависит оно грубо говоря от разрядности приложения, т.е. если у тебя 16ти разрядное приложение, то компилятор будет считать, что операнды размером 2 байта, если же ты используешь 32х разрядные операнды, то компилятор к команде добавляет префикс размера операнда(66h), т.е. смотри, рассмотрим на аналогичном примере:
Программа выполняется на 32х битной платформе, а значит компилятор добавляет префикс размера операнда: 66 - префикс 89 - опкод 8B - modr/m - [EBX]+смещ_32 6C024000 - непосредственный операнд Теперь давай насильно вместо 66h поставим однобайтовую команду, например NOP, её код 90h, видим такую картину:
Ну, тут без комментарием |
||||||
|
|||||||
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
А 01 тогда когда используется?
|
|||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: нет Всего: 16 |
Обычно при пожаре О каком 01 речь? |
|||
|
||||
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
Все о тех же битах mod |
|||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: нет Всего: 16 |
Цитирую:
"mod = 01 - поле смещения в команде присутствует, занимает один байт и модифицируется содержимым базового и/или индексного регистра." Операция MOV с 8битным смещением кодируется совсем иначе, т.е. имеет свой опкод(88h) и поэтому не нуждается в префиксах. Это ты имел ввиду? |
|||
|
||||
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
Нет, я имел в виду, когда используется 8-битное смещение
|
|||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: нет Всего: 16 |
Ну когда это нужно программисту, тогда и используется... Что-то я не понял вопроса
|
|||
|
||||
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
Вопрос такой: чем обусловлено использование разных смещений (8, 16-битных или без смещения), когда мы используем массивы. Насколько я понимаю, непосредственное смещение просто прибавляется к адресу в сегменте. Адрес определяется суммой базового и индексного регистров. Если можно,хотя я чувствую что вопрос глупый, объясните, зачем используется непосредственное смещение, которое описывается в битах mod.
|
|||
|
||||
| sgi1981 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 16.3.2006 Репутация: 2 Всего: 10 |
Потому что твой массив находится в сегменте данных не с самого начала сегмента данных, а по какому-то смещению. Ведь до этого массива вероятнее всего присутствуют еще какие-то данные в том же сегменте. Вот для этого и указывается непосредственное смещение начала массива элементов в сегменте данных. А доступ к конкретному элементу осуществляется сложением с этим непосредственным смещением смещения элемента массива относительно начала массива, то бишь так как оно это смещение элемента массива относительно начала массива меняется, то для его изменения применяют регистр общего назначения или несколько регистров таких и в ходе выполнения программы в этот (эти) регистр (регистры) записывается необходимое смещение, чтобы ты мог получить доступ к нужному элементу массива в зависимости от других целочисленных значений.
Экономией памяти под машинный код. Это сообщение отредактировал(а) sgi1981 - 16.11.2006, 13:11 -------------------- Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства. |
||||
|
|||||
| sidslog |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Где: Москва Репутация: нет Всего: нет |
Спасибо большое всем. Разобрался.
|
|||
|
||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |