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