2010-01-05 82 views
0

我試圖通過sys_write系統調用二進制寫入(到標準輸出或文件),但我只能有文本文件。如何也沒有文字(二進制​​)字節?如何在彙編程序中將二進制數據寫入文件?

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

這個例子,我不能寫14個字節的嘗試,如果他們不是文本的字節(由無文本文件字節長度爲0!)。

回答

0

我不確定你的問題是什麼。只要您在%edx中傳遞了正確的長度,sys_write就會將緩衝區中的任何值寫入%ebx中的文件描述符。這包括從0到255範圍內的任何值(即整個字節範圍)。

也許你應該發佈你用來打開文件的代碼。但即使您在文本模式下打開文件,編寫它仍然應該使用任何值。

一些更多的想法在哪裏看:你沖洗輸出?你關閉文件?如果你不這樣做,那麼這個字符串可能仍然會掛在一個等待被刷新的緩衝區中。

0

我覺得你錯過了編譯器的編程點。

彙編程序是一個文本文件。你在問題中包含的片段是文本。我不知道是否正確文字,但它必須是文字。

在編譯期間,文本被轉換爲機器碼;二進制如果你願意。

如果要定義二進制字符是你的程序的輸出,你需要指定它代表的二進制代碼,將被編譯轉換成字節的塊,程序可以輸出的文本。

我不能告訴你的文本表示會是什麼您需要的二進制文件,這將需要兩個彙編語言程序的更詳細的瞭解。

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

}