операнды памяти сборки x86 - PullRequest
2 голосов
/ 16 декабря 2010

Привет всем У меня есть вопрос, касающийся 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 ... верно ли мое предположение?Поправьте меня, если я ошибаюсь. Любые предложения приветствуются. Спасибо

Ответы [ 2 ]

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

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

idiv byte [bx] ; m8

idiv word [bx] ; m16

idiv dword [bx] ; m32

0 голосов
/ 16 декабря 2010

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

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

mov dword ptr [eax], 0

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

...