Ошибка "invalid instruction operands" - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем привет! Небольшая проблема. Выбивает ошибку в 21 строке. Не понимаю что там такого непонятного) Ошибки типа invalid instruction operands. Буду благодарен за помощь неопытному новичку)
.386
.model  flat,stdcall
 
option  casemap:none
 
include     E:\masm32\include\kernel32.inc
include     E:\masm32\include\msvcrt.inc
include     E:\masm32\macros\macros.asm
includelib  E:\masm32\lib\msvcrt.lib
includelib  E:\masm32\lib\kernel32.lib
 
.data
array db 12, 5, 17
elem    db  ?
tpt     db "Result = %d", 0
 
.code
start:
lea bx, array
mov ax, [ebx]+1
mov elem, ax
invoke  crt_printf, ADDR tpt, elem
invoke  ExitProcess, 0
    
end start

Решение задачи: «Ошибка "invalid instruction operands"»

textual
Листинг программы
.386
.model  flat,stdcall
 
option  casemap:none
 
include         E:\masm32\include\kernel32.inc
include         E:\masm32\include\msvcrt.inc
include         E:\masm32\macros\macros.asm
includelib  E:\masm32\lib\msvcrt.lib
includelib  E:\masm32\lib\kernel32.lib
 
.data
array db 12, 5, 17
     db 2,  4, 0
elem    db  ?
tpt db "Result = %d", 0
 
.code
start:
mov si, 4
lea bx, array                          ;если этого строки нет
mov al, [ebx][esi]                  ;а тут вместо [ebx] стоит array все работает прекрасно
mov elem, al
invoke  crt_printf, ADDR tpt, elem
invoke  ExitProcess, 0
    
end start

Объяснение кода листинга программы

  1. .386 - Это версия процессора, которую использует программа. В данном случае, программа рассчитана на работу с процессором Intel 80386.
  2. .model flat, stdcall - Это описание модели памяти и типа вызова функций. В данном случае, используется модель flat (без сегментации), что означает, что все переменные и процедуры располагаются в одном и том же адресном пространстве. Также выбран тип вызова stdcall, который означает, что функция должна очистить свой собственный стек регистров после вызова.
  3. option casemap:none - Это указание компилятору не выполнять преобразование регистра в нижний регистр при сравнении символов.
  4. include E:\masm32\include\kernel32.inc, E:\masm32\include\msvcrt.inc, E:\masm32\macros\macros.asm - Это включение необходимых заголовочных файлов. kernel32.inc и msvcrt.inc содержат определения функций API Windows, а macros.asm содержит макросы, определенные пользователем.
  5. includelib E:\masm32\lib\msvcrt.lib, E:\masm32\lib\kernel32.lib - Это подключение библиотек функций API Windows. msvcrt.lib содержит функции C стандартной библиотеки, а kernel32.lib содержит функции Windows API.
  6. .data - Это раздел, где хранятся данные программы.
  7. array db 12, 5, 17, 2, 4, 0 - Это определение массива 'array', который содержит шесть элементов. Каждый элемент представлен в формате double word (db), и значения элементов равны 12, 5, 17, 2, 4 и 0 соответственно.
  8. elem db ? - Это определение переменной 'elem', которая будет использоваться для хранения результата. Значение переменной изначально неизвестно, поэтому используется символ '?' (вопросительный знак).
  9. tpt db Result = %d, 0 - Это определение строки 'tpt', которая будет использоваться для вывода результата. Строка содержит фразу Result = %d, где '%d' является заполнителем для значения, которое будет заменено на результат.
  10. .code - Это раздел, где хранятся коды программы.
  11. start: - Это метка начала выполнения программы.
  12. mov si, 4 - Это команда, которая устанавливает регистр SI равным 4.
  13. lea bx, array - Это команда, которая устанавливает регистр BX равным адресу массива 'array'.
  14. mov al, [ebx][esi] - Это команда, которая считывает значение из памяти по адресу, который находится в регистре BX (котором находится массив 'array') и регистре SI (который равен 4). Значение считывается в регистр AX.
  15. mov elem, al - Это команда, которая записывает значение из регистра AX в переменную 'elem'.
  16. invoke crt_printf, ADDR tpt, elem - Это команда, которая вызывает функцию 'crt_printf' с тремя аргументами: адресом строки 'tpt', значением переменной 'elem' и аргументом '0', который необходим для правильной работы функции 'crt_printf'.
  17. invoke ExitProcess, 0 - Это команда, которая вызывает функцию 'ExitProcess' с аргументом '0', что означает успешный выход из программы.
  18. end start - Это метка конца выполнения программы. Таким образом, в коде происходит следующее:
  19. Программа устанавливает регистры SI и BX для работы с массивом 'array'.
  20. Программа считывает значение из памяти по адресу массива 'array' и регистрирует его в переменной 'elem'.
  21. Программа вызывает функцию 'crt_printf' для вывода строки 'tpt' и значения переменной 'elem'.
  22. Программа вызывает функцию 'ExitProcess' для завершения работы программы с аргументом '0', указывающим на успешный выход.

Оцени полезность:

8   голосов , оценка 3.625 из 5