2016-05-04 2 views
2

Код ниже - это лишь небольшая часть программы, которую я сейчас пытаюсь написать, но никакие другие части программы не имеют отношения к делу, поэтому я только вставил то, что было необходимо. Во всяком случае, я пытаюсь переместить значение, хранящееся в inputLoopCounter, в ecx, чтобы определить, сколько раз цикл должен выполняться. Однако, когда я пытаюсь собрать эту программу, я получаю ошибку, указанную в заголовке вопроса. Может ли кто-нибудь объяснить причину этого?x86 сборка экстремальных новичков: «неверные операнды команд»?

.data 
inputLoopCounter BYTE -1 

.code 
mov ecx,inputLoopCounter 
+0

Не эксперт x86, но, возможно, проблема заключается в том, что «BYTE» помещает в регистр, который ожидает 32-битное значение? Возможно, просто загрузите 'cl'. На самом деле, возможно, вам придется использовать скобки [] при загрузке из памяти. Я оставлю это для настоящих экспертов, которые скоро будут здесь :) –

+1

Или 'movsx ecx, byte ptr [inputLoopCounter]', если вы действительно хотите, чтобы ваша переменная была байтом, но все же хотите загрузить ее в регистр dword. – Michael

+0

@Michael Если для него не обязательно быть байтом, возможно ли изменить BYTE на DWORD, чтобы заставить его работать? EDIT: Спасибо, Хосе Мануэль Абарка Родригес, вы ответили на мой вопрос. Это была очень любительская ошибка. – Proto

ответ

3

Одним из возможных решений было бы заменить inputLoopCounter BYTE -1 на inputLoopCounter DWORD -1.

0

MASM запоминает информацию о символах, поэтому foo BYTE -1 подразумевает размер операнда для инструкций, которые загружаются с него.

Другой важный аромат языка ассемблера Intel-синтаксиса (NASM), будет с удовольствием собирать инструкцию, которая загружает 4B от [inputLoopCounter], независимо от того, что inputLoopCounter является ярлыком для.

В NASM mov [inputLoopCounter], 0 является синтаксической ошибкой, поскольку из операндов не подразумевается размер операнда. (И в MASM это будет mov byte ptr [inputLoopCounter], 0.)

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