0

我尝试通过sys_write系统调用(到标准输出或文件)进行二进制写入,但我只能拥有文本文件。如何也有无文本(二进制)字节?

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

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

4

3 回答 3

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;"
);

}
于 2010-01-05T11:37:27.280 回答
0

我认为您错过了在 Assembler 中编程的意义。

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

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

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

我无法告诉您所需的二进制文件的文本表示形式是什么,这需要对汇编语言和您的程序都有更详细的了解。

于 2010-01-05T09:31:08.863 回答
0

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

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

更多的想法在哪里看:你刷新输出吗?你关闭文件吗?如果不这样做,则字符串可能仍会挂在等待刷新的缓冲区中。

于 2010-01-05T09:21:11.737 回答