Как записать двоичные данные в файл на ассемблере? - PullRequest
0 голосов
/ 05 января 2010

Я пробовал двоичную запись через sys_write syscall (в стандартный вывод или файл), но у меня может быть только текстовый файл.Как также иметь нетекстовые (двоичные) байты?

"mov   %eax,    %ebx;" 
"mov   $4, %eax;" 
"mov   -0x40(%rbp),       %ecx;" 
"mov   $14,      %edx;" 
"int   $0x80;"

В этом примере я не могу записать 14 байтов, если они не являются текстовыми байтами (файлы с нетекстовыми байтами имеют длину 0!).

Ответы [ 3 ]

0 голосов
/ 05 января 2010

Я думаю, вы упускаете смысл программирования в Ассемблере.

Программа на ассемблере представляет собой текстовый файл. Фрагмент, который вы включили в свой вопрос, является текстом. Я не знаю, является ли это правильный текст, но это должен быть текст.

Во время компиляции текст преобразуется в машинный код; двоичный файл, если хотите.

Если вы хотите определить двоичные символы для вывода вашей программой, вам нужно будет указать текст, который представляет эти двоичные коды и будет преобразован путем компиляции в блок байтов, который может выводить программа.

Я не могу сказать вам, какое текстовое представление будет для необходимого вам двоичного файла, что потребовало бы более детального понимания как языка Ассемблера, так и вашей программы.

0 голосов
/ 05 января 2010

Да, вы правы. Это не проблема двоичных данных, а результат pxor. Это мой тест, действительно только для моего понимания. Что ж, в системном вызове sys_write, когда я указываю% ecx в память, где хранится значение pxor xmm0 'mov -0x40 (% rbp),% ecx', тогда у меня создается файл 0 длины! Наоборот, если я укажу на большой бафф «-0x30 (% rbp)», все будет хорошо.

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include <emmintrin.h>

main(int argc, char **argv)


{  

unsigned char __attribute__ ((aligned (16))) *bigbuff = (char *) malloc(16);

unsigned char __attribute__ ((aligned (16))) *buff = (char *) malloc(16);

unsigned char __attribute__ ((aligned (16))) *nome_file = (char *) malloc(16);

bigbuff="gatto sisvestr\n";

buff="micio sisvestro2";

nome_file="nuovo.txt"; //la lunghezza massima del nome è data da malloc!!!


    asm (
        "movdqa -0x30(%rbp), %xmm0;"
        "movdqa -0x20(%rbp), %xmm1;"
        "pxor %xmm1,%xmm0;"
        "movdqa %xmm0,-0x40(%rbp);"
        "movdqa -0x40(%rbp), %xmm2;"
        "movdqa -0x20(%rbp), %xmm1;"
        "pxor %xmm1,%xmm2;"
        "movdqa %xmm2,-0x30(%rbp);"

   "mov $8, %eax;"

   "mov -0x10(%rbp),%ebx;"

   "mov $448, %ecx;" 

   "int $0x80;"

   "mov   %eax,    %ebx;"

    "mov   $4, %eax;" 

    "mov   -0x40(%rbp),       %ecx;" 

    "mov   $14,      %edx;" 

    "int   $0x80;"
);

}
0 голосов
/ 05 января 2010

Я не уверен, в чем твоя проблема. Пока вы передаете правильную длину в %edx, sys_write будет записывать любое значение в буфере в дескриптор файла в %ebx. Это включает любое значение в диапазоне от 0 до 255 (то есть полный диапазон байтов).

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

Еще несколько идей, на которые стоит обратить внимание: вы очищаете вывод? Вы закрываете файл? Если вы этого не сделаете, строка может по-прежнему зависать в буфере, ожидающем очистки.

...