Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что обзначают биты mod 
V
    Опции темы
sidslog
Дата 13.11.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



Например, есть команда
Код

mov mas[di][bx],cx


Вот ее запись из файла lst
89 89 0000r    
или
100010   01  10   001  001 0000r
               dw mod  reg   rm
mod определяет способ адрессации. Можете пояснить, почему именно 10.
PM MAIL ICQ GTalk   Вверх
BUGOR
Дата 13.11.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: нет
Всего: 16



Есть правила формирования, они довольно сложные для начального восприятия, прочти о них лучше в манах интела. так же для удобства составлены таблицы всех возможных значении, они опять же есть в манах интела.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
sgi1981
Дата 14.11.2006, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Код

mov mas[di][bx],cx

это расшифровывается так:

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 кодирует регистр общего назначения в качестве второго операнда.



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sidslog
Дата 15.11.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



Тогда еще вопрос, а почему смещение mas именно 2 байта. Mas задается так
Код

mas dw 90,45,62,34,77
    dw 72,97,55,29,87
             ...

Зависит оно от размера, или от чего-то другого(количества базовых регистров)?
PM MAIL ICQ GTalk   Вверх
BUGOR
Дата 15.11.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: нет
Всего: 16



Цитата

Тогда еще вопрос, а почему смещение mas именно 2 байта.


Зависит оно грубо говоря от разрядности приложения, т.е. если у тебя 16ти разрядное приложение, то компилятор будет считать, что  операнды размером 2 байта, если же ты используешь 32х разрядные операнды, то компилятор к команде добавляет префикс размера операнда(66h), т.е. смотри, рассмотрим на аналогичном примере:

Код

0040022C     66:898B 6C024000     MOV WORD PTR DS:[EBX+40026C],CX


Программа выполняется на 32х битной платформе, а значит компилятор добавляет префикс размера операнда:

66 - префикс
89 - опкод
8B - modr/m - [EBX]+смещ_32
6C024000 - непосредственный операнд

Теперь давай насильно вместо 66h поставим однобайтовую команду, например NOP, её код 90h, видим такую картину:

Код

0040022C     90                   NOP
0040022D     898B 6C024000        MOV DWORD PTR DS:[EBX+40026C],ECX


Ну, тут без комментариемsmile







--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
sidslog
Дата 15.11.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



А 01 тогда когда используется?
PM MAIL ICQ GTalk   Вверх
BUGOR
Дата 15.11.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: нет
Всего: 16



Цитата

А 01 тогда когда используется?


Обычно при пожареsmile
О каком 01 речь?


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
sidslog
Дата 15.11.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



smile)
Все о тех же битах mod
PM MAIL ICQ GTalk   Вверх
BUGOR
Дата 15.11.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: нет
Всего: 16



Цитирую:

"mod = 01 - поле смещения в команде присутствует, занимает один байт и модифицируется содержимым базового и/или индексного регистра."

Операция MOV с 8битным смещением кодируется совсем иначе, т.е. имеет свой опкод(88h) и поэтому не нуждается в префиксах.
Это ты имел ввиду?


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
sidslog
Дата 15.11.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



Нет, я имел в виду, когда используется 8-битное смещение
PM MAIL ICQ GTalk   Вверх
BUGOR
Дата 15.11.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: нет
Всего: 16



Ну когда это нужно программисту, тогда и используется... Что-то я не понял вопросаsmile


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
sidslog
Дата 15.11.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



Вопрос такой: чем обусловлено использование разных смещений (8, 16-битных или без смещения), когда мы используем массивы. Насколько  я понимаю, непосредственное смещение просто прибавляется к адресу в сегменте. Адрес определяется суммой базового и индексного регистров. Если можно,хотя я чувствую что вопрос глупый, объясните, зачем используется непосредственное смещение, которое описывается в битах mod.
PM MAIL ICQ GTalk   Вверх
sgi1981
Дата 16.11.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Цитата

Если можно,хотя я чувствую что вопрос глупый, объясните, зачем используется непосредственное смещение, которое описывается в битах mod.

Потому что твой массив находится в сегменте данных не с самого начала сегмента данных, а по какому-то смещению. Ведь до этого массива вероятнее всего присутствуют еще какие-то данные в том же сегменте.
Вот для этого и указывается непосредственное смещение начала массива элементов в сегменте данных.
А доступ к конкретному элементу осуществляется сложением с этим непосредственным смещением смещения элемента массива относительно начала массива, то бишь так как оно это смещение элемента массива относительно начала массива меняется, то для его изменения применяют регистр общего назначения или несколько регистров таких и в ходе выполнения программы в этот (эти) регистр (регистры) записывается необходимое смещение, чтобы ты мог получить доступ к нужному элементу массива в зависимости от других целочисленных значений.
Цитата

чем обусловлено использование разных смещений (8, 16-битных или без смещения), когда мы используем массивы.

Экономией памяти под машинный код.

Это сообщение отредактировал(а) sgi1981 - 16.11.2006, 13:11


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sidslog
Дата 16.11.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.10.2006
Где: Москва

Репутация: нет
Всего: нет



Спасибо большое всем. Разобрался.
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.