我試圖通過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!)。
我不確定你的問題是什麼。只要您在%edx
中傳遞了正確的長度,sys_write
就會將緩衝區中的任何值寫入%ebx
中的文件描述符。這包括從0到255範圍內的任何值(即整個字節範圍)。
也許你應該發佈你用來打開文件的代碼。但即使您在文本模式下打開文件,編寫它仍然應該使用任何值。
一些更多的想法在哪裏看:你沖洗輸出?你關閉文件?如果你不這樣做,那麼這個字符串可能仍然會掛在一個等待被刷新的緩衝區中。
我覺得你錯過了編譯器的編程點。
彙編程序是一個文本文件。你在問題中包含的片段是文本。我不知道是否正確文字,但它必須是文字。
在編譯期間,文本被轉換爲機器碼;二進制如果你願意。
如果要定義二進制字符是你的程序的輸出,你需要指定它代表的二進制代碼,將被編譯轉換成字節的塊,程序可以輸出的文本。
我不能告訴你的文本表示會是什麼您需要的二進制文件,這將需要兩個彙編語言程序的更詳細的瞭解。
是的,你是對的。這不是一個二進制數據問題,而是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;"
);
}