| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Что обзначают биты mod |
| Автор: sidslog 13.11.2006, 10:32 | ||
Например, есть команда
Вот ее запись из файла lst 89 89 0000r или 100010 01 10 001 001 0000r dw mod reg rm mod определяет способ адрессации. Можете пояснить, почему именно 10. |
| Автор: BUGOR 13.11.2006, 10:56 |
| Есть правила формирования, они довольно сложные для начального восприятия, прочти о них лучше в манах интела. так же для удобства составлены таблицы всех возможных значении, они опять же есть в манах интела. |
| Автор: sgi1981 14.11.2006, 00:55 | ||
это расшифровывается так: 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 15.11.2006, 14:20 | ||
Тогда еще вопрос, а почему смещение mas именно 2 байта. Mas задается так
Зависит оно от размера, или от чего-то другого(количества базовых регистров)? |
| Автор: BUGOR 15.11.2006, 14:48 | ||||||
Зависит оно грубо говоря от разрядности приложения, т.е. если у тебя 16ти разрядное приложение, то компилятор будет считать, что операнды размером 2 байта, если же ты используешь 32х разрядные операнды, то компилятор к команде добавляет префикс размера операнда(66h), т.е. смотри, рассмотрим на аналогичном примере:
Программа выполняется на 32х битной платформе, а значит компилятор добавляет префикс размера операнда: 66 - префикс 89 - опкод 8B - modr/m - [EBX]+смещ_32 6C024000 - непосредственный операнд Теперь давай насильно вместо 66h поставим однобайтовую команду, например NOP, её код 90h, видим такую картину:
Ну, тут без комментарием |
| Автор: sidslog 15.11.2006, 15:47 |
| А 01 тогда когда используется? |
| Автор: BUGOR 15.11.2006, 16:02 | ||
Обычно при пожаре О каком 01 речь? |
| Автор: sidslog 15.11.2006, 16:06 |
Все о тех же битах mod |
| Автор: BUGOR 15.11.2006, 16:32 |
| Цитирую: "mod = 01 - поле смещения в команде присутствует, занимает один байт и модифицируется содержимым базового и/или индексного регистра." Операция MOV с 8битным смещением кодируется совсем иначе, т.е. имеет свой опкод(88h) и поэтому не нуждается в префиксах. Это ты имел ввиду? |
| Автор: sidslog 15.11.2006, 16:34 |
| Нет, я имел в виду, когда используется 8-битное смещение |
| Автор: BUGOR 15.11.2006, 17:54 |
| Ну когда это нужно программисту, тогда и используется... Что-то я не понял вопроса |
| Автор: sidslog 15.11.2006, 21:15 |
| Вопрос такой: чем обусловлено использование разных смещений (8, 16-битных или без смещения), когда мы используем массивы. Насколько я понимаю, непосредственное смещение просто прибавляется к адресу в сегменте. Адрес определяется суммой базового и индексного регистров. Если можно,хотя я чувствую что вопрос глупый, объясните, зачем используется непосредственное смещение, которое описывается в битах mod. |
| Автор: sgi1981 16.11.2006, 13:09 | ||||
Потому что твой массив находится в сегменте данных не с самого начала сегмента данных, а по какому-то смещению. Ведь до этого массива вероятнее всего присутствуют еще какие-то данные в том же сегменте. Вот для этого и указывается непосредственное смещение начала массива элементов в сегменте данных. А доступ к конкретному элементу осуществляется сложением с этим непосредственным смещением смещения элемента массива относительно начала массива, то бишь так как оно это смещение элемента массива относительно начала массива меняется, то для его изменения применяют регистр общего назначения или несколько регистров таких и в ходе выполнения программы в этот (эти) регистр (регистры) записывается необходимое смещение, чтобы ты мог получить доступ к нужному элементу массива в зависимости от других целочисленных значений.
Экономией памяти под машинный код. |
| Автор: sidslog 16.11.2006, 13:31 |
| Спасибо большое всем. Разобрался. |