如何在汇编程序中将二进制数据写入文件?

时间:2010-01-05 09:13:53

标签: c inline-assembly

我尝试通过sys_write syscall(到stdout或文件)进行二进制写入,但我只能有文本文件。如何使用无文本(二进制)字节?

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

尝试使用此示例,如果它们不是文本字节,则不能写入14个字节(无文本字节的文件长度为0!)。

3 个答案:

答案 0 :(得分:0)

我不确定你的问题是什么。只要在%edx中传递正确的长度,sys_write就会将缓冲区中的任何值写入%ebx中的文件描述符。这包括0到255范围内的任何值(即整个字节范围)。

也许您应该发布用于打开文件的代码。但即使您以文本模式打开文件,也应该使用任何值。

还有一些想法可以看看:你是否刷新输出?你关闭文件了吗?如果不这样做,那么字符串可能仍然挂在等待刷新的缓冲区中。

答案 1 :(得分:0)

我认为你错过了汇编程序中的编程点。

汇编程序是一个文本文件。您在问题中包含的片段是文字。我不知道它是否是正确的文本,但它必须是文本。

在编译期间,文本将转换为机器代码;二进制,如果你愿意。

如果要定义要由程序输出的二进制字符,则需要指定代表这些二进制代码的文本,并通过编译将其转换为程序可以输出的字节块。

我无法告诉你文本表示对于你需要的二进制文件是什么,这需要更详细地理解汇编语言和你的程序。

答案 2 :(得分:0)

是的,你是对的。这不是二进制数据问题,而是pxor结果。这是我的考验,真的只是为了我的理解。好吧,在sys_write系统调用中,当我将%ecx指向存储pxor xmm0值'mov -0x40(%rbp),%ecx'的内存时,我创建了0长度文件!相反,如果我指向bigbuff'-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;"
);

}