round catcher)
Група: Trusted Members
Повідомлень: 1 365
З нами з: 27-August 08
З: Kyiv
Користувач №: 809
Стать: Чол
Парк машин: хз*X2/2/500/хз*5870 ц7x64
|
сабж, а заодно и асм х86 пока меня интересуют консольные приложения(работа с бинарными файлами), остановился на gcc(именно си, а не си++) под линух(debian) предлагаю тут кидать ссылки на интересные мануалы/примеры или просто постить примеры (Show/Hide) ну для начала "хелло... ", кудаж без него) создаем файл hello.c (gedit, например) #include <stdio.h> int main() { printf("Hello ...!\n" ); return(0); }
компильнуть- gcc hello.c запустить файл ./a.out кл-во байт под переменные: #include<stdio.h> /*size of variable types*/ int main() { printf("int=%d short int=%d \n", sizeof(int), sizeof(short int)); printf("signed int=%d unsigned int=%d \n", sizeof(signed int), sizeof(unsigned int)); printf("char=%d unsigned char=%d \n", sizeof(char), sizeof(unsigned char)); return 0; }
работа с файлами (Show/Hide) 1(ru)2(eng)Справочник(ru)int fseek( FILE * filestream, long int offset, int origin ); Функция fseek перемещает указатель позиции в потоке filestream Указатель на объект типа FILE, идентифицируемый поток, offset Количество байт для смещения, относительно некоторого положения указателя, origin Позиция указателя, относительно которой будет выполняться смещение. SEEK_SET -Начало файла, SEEK_CUR -Текущее положение файла, SEEK_END -Конец файла фрагменты asm книг у гугля(тут куча книг, омг)) под линух асм имеет чуть другой форматдоки для мак, оптимизациимой черновик задачи №1(осталось допилить чуток) (Show/Hide) задача #1: написать прогу для вычисления хешей для 64 байтовых блоков из входного файла и запись результата в другой файл т.е. прочитал 64 байт, получил хеш, записал и так далее. На выходе файл будет в ~2 раза меньше исходного #include <stdio.h> unsigned long int rotr (unsigned long int a, char b) {/* analog asm ror a,b */ return ((a>>b)|(a<<(32-b))); }
unsigned long int inFileSize=0, w[64], s0, s1; int i, i2, readedBytes=0; char readBuffer[64];
FILE *myFile, *myFile2; unsigned long int a,b,c,d,e,f,g,h,t1,t2,sum0,sum1,Ma,Ch,k[64] ={ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2}, h0 = 0x6A09E667, h1 = 0xBB67AE85, h2 = 0x3C6EF372, h3 = 0xA54FF53A, h4 = 0x510E527F, h5 = 0x9B05688C, h6 = 0x1F83D9AB, h7 = 0x5BE0CD19;
int main(int argc, char *argv[]) { printf("input file name is '%s'\n", argv[1] ); if (argc==1) return(1); myFile = fopen (argv[1], "rb"); myFile2 = fopen("out", "wb"); do { fseek(myFile, inFileSize++*64, SEEK_SET); readedBytes=fread(readBuffer, 1, 64, myFile); printf("seek@=%d\n", inFileSize); asm ( /* copy 16(10h) doubleWords from readBuffer[] to w[]*/ "movl $0x10, %ecx\n\t" "leal readBuffer,%esi\n\t" "leal w,%edi\n\t" "cld\n\t" "rep movsl\n\t" ); for (i=16; i<64;i++) { s0=rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>3); s1=rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>10); w[i]=w[i-16]+s0+w[i-7]+s1; } a= h0; b= h1; c= h2; d= h3; e= h4; f= h5; g= h6; h= h7;
for (i=0; i<64;i++) { sum0= rotr(a, 2)^rotr(a, 13)^rotr (a, 22); Ma= (a &b)^(a &c)^(b &c); t2= sum0 + Ma; sum1= rotr(e, 6)^rotr(e, 11)^rotr(e, 25); Ch= (e &f)^((~e) &g); t1= h +sum1 +Ch +k[i] +w[i];
h= g; g= f; f= e; e= d +t1; d= c; c= b; b= a; a= t2 +t1; } h0= h0 +a; h1= h1 +b; h2= h2 +c; h3= h3 +d; h4= h4 +e; h5= h5 +f; h6= h6 +g; h7= h7 +h;
w[0]=h0; w[1]=h1; w[2]=h2; w[3]=h3; w[4]=h4; w[5]=h5; w[6]=h6; w[7]=h7;
fwrite(w, 1, 8*4, myFile2); } while (readedBytes==64);
fclose(myFile2); fclose(myFile); printf("bytes readed last time=%d\n Total file size=%d\n", readedBytes, --inFileSize*64+readedBytes); return(0); }
--------------------
|