Ассемблер x86: смещение косвенного операнда в структуре - PullRequest
1 голос
/ 17 ноября 2011

Я создал структуру, которая содержала основную информацию, а также некоторые строки BYTE. Например:

 EXAMPLESTRUCT STRUCT
 somePrompt BYTE 20 DUP (0)
 ;other fields
 EXAMPLESTRUCT ENDS

Мое намерение состояло в том, чтобы создать массив структур с сообщениями, относящимися к этой конкретной структуре, с инициализацией в соответствии с:

ex1 EXAMPLESTRUCT <"Enter first">
ex2 EXAMPLESTRUCT <"Enter second">

Ссылка на адрес поля структуры напрямую (mov edx, OFFSET ex1.somePrompt) работала нормально, но при использовании косвенной адресации я получал ошибку OFFSET:

mov esi,OFFSET ex1
mov edx,OFFSET (EXAMPLESTRUCT PTR [esi]).somePrompt ;Error here

Итак, мой код неверен или это просто незаконное использование OFFSET по какой-то причине?

Единственная работа, которую я нашел, заключалась в том, чтобы заставить структуру содержать указатели, а затем инициализировать их так, чтобы они указывали на уже сделанное сообщение:

WORKAROUND STRUCT
somePTR DWORD ?
;...
WORKAROUND ENDS

.data
msg BYTE "Hello World",0
struct1 WORKAROUND <OFFSET msg>

с последующим отображением сообщения в формате

mov esi,OFFSET struct1
mod edx,(WORKAROUND PTR [esi]).somePTR

Любые другие решения / обходные пути или я должен просто придерживаться указателей?

1 Ответ

1 голос
/ 17 ноября 2011

Вы хотите использовать инструкцию lea.

lea edx,(EXAMPLESTRUCT PTR [esi]).somePrompt

См. Какова цель инструкции LEA? , чтобы немного больше узнать о lea.

OFFSET является конструкцией времени компиляции. Когда вы используете директиву OFFSET, ассемблер должен иметь возможность преобразовать ее в значение во время компиляции. Вот почему вы получили ошибку - потому что ассемблер не может знать, каково будет значение esi.

...