我尝试通过sys_write
系统调用(到标准输出或文件)进行二进制写入,但我只能拥有文本文件。如何也有无文本(二进制)字节?
"mov %eax, %ebx;"
"mov $4, %eax;"
"mov -0x40(%rbp), %ecx;"
"mov $14, %edx;"
"int $0x80;"
尝试使用此示例,如果它们不是文本字节,我将无法写入 14 个字节(无文本字节的文件长度为 0!)。
我尝试通过sys_write
系统调用(到标准输出或文件)进行二进制写入,但我只能拥有文本文件。如何也有无文本(二进制)字节?
"mov %eax, %ebx;"
"mov $4, %eax;"
"mov -0x40(%rbp), %ecx;"
"mov $14, %edx;"
"int $0x80;"
尝试使用此示例,如果它们不是文本字节,我将无法写入 14 个字节(无文本字节的文件长度为 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;"
);
}
我认为您错过了在 Assembler 中编程的意义。
汇编程序是一个文本文件。您在问题中包含的片段是文本。我不知道它是否是正确的文字,但它必须是文字。
在编译期间,文本被转换为机器码;二进制如果你愿意。
如果要定义程序输出的二进制字符,则需要指定表示这些二进制代码的文本,并将通过编译转换为程序可以输出的字节块。
我无法告诉您所需的二进制文件的文本表示形式是什么,这需要对汇编语言和您的程序都有更详细的了解。
我不确定你的问题是什么。只要你传入正确的长度%edx
,sys_write
就会将缓冲区中的任何值写入到文件描述符中%ebx
。这包括 0 到 255 范围内的任何值(即整个字节范围)。
也许您也应该发布用于打开文件的代码。但是,即使您以文本模式打开文件,写入文件仍然可以使用任何值。
更多的想法在哪里看:你刷新输出吗?你关闭文件吗?如果不这样做,则字符串可能仍会挂在等待刷新的缓冲区中。