2016-10-10 2 views
3

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

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

Полный код:

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+ символов? – Ped7g

+0

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

ответ

4

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

mov msg, [esp+8] 

Но вы не можете mov е из памяти в память. Например, на странице this.

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

mov eax, [var1] 
mov [var2], eax 
Смежные вопросы