2010-12-16 5 views
2

Привет всем У меня есть вопрос, связанный с x86. В руководстве Intel некоторые инструкции могут принимать разные типы операндов памяти. например. IDIV r/m8 или IDIV r/m16 или IDIV r/m32 или IDIV r/m64 теперь все они IDIV есть возможность узнать, является ли операнд m8, m16, m32 или m64? Я думал, что если операндом является m8, тогда он адресуется 8-разрядным регистром, например. ax, если 32, тогда eax, esp ... Является ли мое предположение правильным? Исправьте меня, если я ошибаюсь Любые предложения приветствуются Спасибоx86 операнды памяти памяти

ответ

0

Да, регистр, который используется как операнд, устраняет двусмысленность. (Заметим, однако, что ax представляет собой 16-битовый регистр, а не 8-битовый регистр -., Что будет ah или al для высокого или низкого байта, соответственно)

Если вы только со ссылкой на память операнды, вы должны использовать BYTE PTR, WORD PTR или DWORD PTR спецификатор для разрешения неоднозначности, например:

mov dword ptr [eax], 0 

Этот пример устанавливает 32-битное количество («двойное слово») по адресу, указанному в eax до 0 .

+0

благодарит Мартина. Я просто составил простой код C и получил movl \t -8 (% ebp),% eax cmpl \t -4 (% ebp),% eax - - это «l» в movl и cmpl, о котором вы говорите, были л = = 32-битный пор? Если да, вы знаете индикатор для байта, 2-байтовое и двойное слово? thanks – 2010-12-16 19:47:19

+2

Anshuman уже ответил на это - разница в том, что синтаксис AT & T кодирует тип операнда в командном мнемонике (`movb`,` movw` или `movl`), тогда как синтаксис Intel не является (` mov`). Вот почему для синтаксиса Intel иногда требуется спецификатор, такой как `dword ptr`, чтобы устранить двусмысленность. – 2010-12-17 09:41:02

0
  1. Независимо от того, является ли операнд m8, m16 или m32, регистр, используемый для адресации в памяти, может быть 8, 16 или 32 бит - все являются действительными afaik.

  2. Чтобы указать, сколько битов должны быть считаны из памяти, вы должны использовать один из спецификаторов размера byte, word или dword перед адресом. Например:

idiv byte [bx] ; m8

idiv word [bx] ; m16

idiv dword [bx] ; m32

Смежные вопросы