#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