Ошибка недопустимой комбинации кода операции и операндов

#assembly #x86 #nasm

#сборка #x86 #nasm

Вопрос:

Я пытаюсь написать программу, которая принимает двоичный ввод из текстового файла и отправляет его в качестве параметра функции сборки. Эта функция сборки должна вывести этот двоичный ввод на экран. Входные данные отправляются из кода c в код сборки по его адресу.

Когда я пытаюсь собрать свой asm-файл, я получаю сообщение об ошибке «недопустимая комбинация кода операции и операндов» в mov msg, [esp 8] строке. Я хочу скопировать мой char аргумент из стека в мою статическую переменную. Почему это недопустимая инструкция?

Полный код:

 segment .data
        len equ 31
segment .bss
        msg resb 0
segment .text
global sequence_generator

sequence_generator:

       push ebp
       mov ebp, esp
       mov msg, [esp 8]

       mov eax,4
       mov ebx,1
       mov ecx,msg
       mov edx,len
       int 80h

       pop ebp
       ret
  

Комментарии:

1. mov msg, [esp 8] как вы думаете, что это делает? И это msg resb 0 ? И edx предполагается, что значение равно фиксированному 31? Таким образом, код C всегда будет отправлять 31 символов?

2. Кстати, если это действительно двоичные данные, они будут содержать непечатаемые символы, что не очень хорошо работает в Linux, поэтому, вероятно, вы можете захотеть выполнить некоторую обработку над ними, чтобы изменить непечатаемые значения на '.' или напечатать шестнадцатеричные значения вместо самих байтов. (таким образом, из данных " " (тройной пробел) вы будете печатать "20 20 20" )

Ответ №1:

Интересно, что вы пытались сделать в этой строке:

 mov msg, [esp 8]
  

Но вам не разрешено переходить mov из памяти в память. Обратитесь, например, к этой странице.

Если вы хотите переместить что-либо из памяти в память, используйте регистр в качестве временного хранилища. Например:

 mov eax, [var1]
mov [var2], eax