我尝试通过sys_write
syscall(到stdout或文件)进行二进制写入,但我只能有文本文件。如何使用无文本(二进制)字节?
"mov %eax, %ebx;"
"mov $4, %eax;"
"mov -0x40(%rbp), %ecx;"
"mov $14, %edx;"
"int $0x80;"
尝试使用此示例,如果它们不是文本字节,则不能写入14个字节(无文本字节的文件长度为0!)。
答案 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;"
);
}