Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Что обзначают биты mod


Автор: sidslog 13.11.2006, 10:32
Например, есть команда
Код

mov mas[di][bx],cx


Вот ее запись из файла 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
Код

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

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

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

Зависит оно от размера, или от чего-то другого(количества базовых регистров)?

Автор: BUGOR 15.11.2006, 14:48
Цитата

Тогда еще вопрос, а почему смещение 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





Автор: sidslog 15.11.2006, 15:47
А 01 тогда когда используется?

Автор: BUGOR 15.11.2006, 16:02
Цитата

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


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

Автор: sidslog 15.11.2006, 16:06
smile)
Все о тех же битах 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
Ну когда это нужно программисту, тогда и используется... Что-то я не понял вопросаsmile

Автор: sidslog 15.11.2006, 21:15
Вопрос такой: чем обусловлено использование разных смещений (8, 16-битных или без смещения), когда мы используем массивы. Насколько  я понимаю, непосредственное смещение просто прибавляется к адресу в сегменте. Адрес определяется суммой базового и индексного регистров. Если можно,хотя я чувствую что вопрос глупый, объясните, зачем используется непосредственное смещение, которое описывается в битах mod.

Автор: sgi1981 16.11.2006, 13:09
Цитата

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

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

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

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

Автор: sidslog 16.11.2006, 13:31
Спасибо большое всем. Разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)