Привет всем У меня есть вопрос, связанный с 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 операнды памяти памяти
ответ
Да, регистр, который используется как операнд, устраняет двусмысленность. (Заметим, однако, что ax
представляет собой 16-битовый регистр, а не 8-битовый регистр -., Что будет ah
или al
для высокого или низкого байта, соответственно)
Если вы только со ссылкой на память операнды, вы должны использовать BYTE PTR
, WORD PTR
или DWORD PTR
спецификатор для разрешения неоднозначности, например:
mov dword ptr [eax], 0
Этот пример устанавливает 32-битное количество («двойное слово») по адресу, указанному в eax
до 0 .
Независимо от того, является ли операнд m8, m16 или m32, регистр, используемый для адресации в памяти, может быть 8, 16 или 32 бит - все являются действительными afaik.
Чтобы указать, сколько битов должны быть считаны из памяти, вы должны использовать один из спецификаторов размера
byte
,word
илиdword
перед адресом. Например:
idiv byte [bx] ; m8
idiv word [bx] ; m16
idiv dword [bx] ; m32
- 1. x86 - изучение памяти
- 2. x86 ошибка сегментации памяти
- 3. памяти - дос сборки x86
- 4. Операнды хранятся в памяти? (C/C++)
- 5. Ограничение памяти для микропроцессоров x86
- 6. x86: использование значений памяти/обмена?
- 7. Размер переменных в памяти x86
- 8. x86 Распределение Procedure Call Памяти
- 9. Является ли LEA единственной инструкцией в x86 с операндом памяти, который не имеет доступа к памяти?
- 10. Confused от x86 памяти Макет загрузчика ядра
- 11. craft handmade x86 сборка в выделенной памяти
- 12. Сборка - инструкция вызова x86 и адрес памяти?
- 13. C#: модель памяти x86-x64 против ECMA
- 14. Путаница в сегментации памяти в x86
- 15. Рассмотрение памяти с помощью x86 proccesor
- 16. Использование двух операндов памяти в x86
- 17. ограничения заказные памяти на x86 архитектуре
- 18. распределение памяти в x86 Язык ассемблера
- 19. Создать выравнивание адреса памяти на x86
- 20. проверка доступа к памяти сборка x86-64
- 21. x86 - ядро - программы, очистка и перезапись памяти
- 22. x86 assembly-masm32: неправильные операнды команд
- 23. x86 сборка экстремальных новичков: «неверные операнды команд»?
- 24. x86 add и addl операнды добавляются неправильно?
- 25. Распределение памяти распределителя памяти
- 26. Понимание распределения и освобождения памяти памяти памяти
- 27. cv :: Распределение памяти памяти и освобождение памяти
- 28. Android новая утечка памяти памяти/из памяти
- 29. Ошибка памяти памяти SKSpritekit
- 30. Отслеживание памяти C++ памяти
благодарит Мартина. Я просто составил простой код C и получил movl \t -8 (% ebp),% eax cmpl \t -4 (% ebp),% eax - - это «l» в movl и cmpl, о котором вы говорите, были л = = 32-битный пор? Если да, вы знаете индикатор для байта, 2-байтовое и двойное слово? thanks – 2010-12-16 19:47:19
Anshuman уже ответил на это - разница в том, что синтаксис AT & T кодирует тип операнда в командном мнемонике (`movb`,` movw` или `movl`), тогда как синтаксис Intel не является (` mov`). Вот почему для синтаксиса Intel иногда требуется спецификатор, такой как `dword ptr`, чтобы устранить двусмысленность. – 2010-12-17 09:41:02