Привіт Гість ( Вхід | Реєстрація )

> учим Cи
A1ex01
Aug 27 2013, 23:12
Пост #1


round catcher)
********

Група: Trusted Members
Повідомлень: 1 395
З нами з: 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);
}



--------------------
Stats: RC5-72 OGR-(26 /27 /28 ) Mag@(free-dc /boinc)
support: BTC 3Po6aejsoZM7bQvo138fuYwaLc67bzMfEr
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
2 Сторінки V < 1 2  
Reply to this topicStart new topic
Відповідей(15 - 26)
A1ex01
Sep 1 2013, 23:00
Пост #16


round catcher)
********

Група: Trusted Members
Повідомлень: 1 395
З нами з: 27-August 08
З: Kyiv
Користувач №: 809
Стать: Чол
Парк машин:
хз*X2/2/500/хз*5870 ц7x64



(Rilian @ Sep 1 2013, 18:11) *

статья которую надо читать перед написанием нового проекта http://habrahabr.ru/post/117193/

и закинуть такие справочники подальше smile.gif

1) пользы по ссылке мало
2) какие справочники? и где взять лучше?

задача #1:
написать прогу для вычисления хешей sha2 для 64 байтовых блоков из входного файла и запись результата в другой файл
т.е. прочитал 64 байт, получил хеш, записал и так далее. На выходе файл будет в ~2 раза меньше исходного
смогеш?)

up:
условия уточнил, 512bit (SHA-256), а не байт, что равно 64байт


--------------------
Stats: RC5-72 OGR-(26 /27 /28 ) Mag@(free-dc /boinc)
support: BTC 3Po6aejsoZM7bQvo138fuYwaLc67bzMfEr
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Rilian
Sep 1 2013, 23:10
Пост #17


interstellar
**********

Група: Team member
Повідомлень: 17 343
З нами з: 22-February 06
З: Торонто
Користувач №: 184
Стать: НеСкажу
Free-DC_CPID
Парк машин:
ноут и кусок сервера



QUOTE(A1ex01 @ Sep 2 2013, 00:00) *

какие справочники? и где взять лучше?

смысл в статье в том что ЩЯС куча современных методологий и бест-практисов, а также библиотек для решения практически всех распространенных задач. И совет не изобретать велосипеды и думать что ты умнее компилятора

---
По теме, каков объем исходных данных ?


--------------------
(Show/Hide)

Миссия проекта Help Fight Childhood Cancer (Помоги Победить Детский Рак) - подобрать белки, блокирующие некоторые виды рака. Подключайтесь!
IPB Image
IPB Image

IPB Image

IPB Image
IPB Image

общая статистика: BOINCstats * FreeDC команда: BOINC команда Ukraine

IPB Image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
A1ex01
Sep 1 2013, 23:15
Пост #18


round catcher)
********

Група: Trusted Members
Повідомлень: 1 395
З нами з: 27-August 08
З: Kyiv
Користувач №: 809
Стать: Чол
Парк машин:
хз*X2/2/500/хз*5870 ц7x64



(Rilian @ Sep 2 2013, 00:10) *


---
По теме, каков объем исходных данных ?

анлим) (0,1-100Гига)
можно начать с Килобайт (Кибибайт)

ап:
также интересует как у руби с битовым вращением? на си можно вставить asm rol/ror eax,ecx...


--------------------
Stats: RC5-72 OGR-(26 /27 /28 ) Mag@(free-dc /boinc)
support: BTC 3Po6aejsoZM7bQvo138fuYwaLc67bzMfEr
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Rilian
Sep 2 2013, 00:00
Пост #19


interstellar
**********

Група: Team member
Повідомлень: 17 343
З нами з: 22-February 06
З: Торонто
Користувач №: 184
Стать: НеСкажу
Free-DC_CPID
Парк машин:
ноут и кусок сервера



QUOTE(A1ex01 @ Sep 2 2013, 00:15) *

QUOTE(Rilian @ Sep 2 2013, 00:10) *


---
По теме, каков объем исходных данных ?

анлим) (0,1-100Гига)
можно начать с Килобайт (Кибибайт)

ап:
также интересует как у руби с битовым вращением? на си можно вставить asm rol/ror eax,ecx...

руби это интерпретируемый язык, но ты можешь делать биндинги на C, в которых, в свою очередь, юзать что угодно

для потоковой обработки руби/питон тебе не поможет. Парсинг входящих бинарных данных на С это довольно простая задача

я почему спрашиваю, потому что посчитать данные это одно дело, а вот использовать их эффективно - совсем другое

если тебе надо рейнбоу тейбл то сразу задумайся о структуре для хранения и поиска


--------------------
(Show/Hide)

Миссия проекта Help Fight Childhood Cancer (Помоги Победить Детский Рак) - подобрать белки, блокирующие некоторые виды рака. Подключайтесь!
IPB Image
IPB Image

IPB Image

IPB Image
IPB Image

общая статистика: BOINCstats * FreeDC команда: BOINC команда Ukraine

IPB Image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
A1ex01
Sep 2 2013, 11:15
Пост #20


round catcher)
********

Група: Trusted Members
Повідомлень: 1 395
З нами з: 27-August 08
З: Kyiv
Користувач №: 809
Стать: Чол
Парк машин:
хз*X2/2/500/хз*5870 ц7x64



(Rilian @ Aug 28 2013, 00:19) *

A1ex01, емае, учи Руби! Могу тебе мастер класс устроить в Киеве
(Rilian @ Sep 2 2013, 01:00) *

для потоковой обработки руби/питон тебе не поможет. Парсинг входящих бинарных данных на С это довольно простая задача

Рилиан, ты бы в тему въехал сначала, а потом советы))


--------------------
Stats: RC5-72 OGR-(26 /27 /28 ) Mag@(free-dc /boinc)
support: BTC 3Po6aejsoZM7bQvo138fuYwaLc67bzMfEr
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Rilian
Sep 2 2013, 13:49
Пост #21


interstellar
**********

Група: Team member
Повідомлень: 17 343
З нами з: 22-February 06
З: Торонто
Користувач №: 184
Стать: НеСкажу
Free-DC_CPID
Парк машин:
ноут и кусок сервера



обычно ядро обработки пишется на чем-то низкоуровневом, а все остальное например на руби для удобства работы и запуска этих самых низкоуровневых обработчиков

например, тебе надо будет данные брать из сети. Это удобнее сделать на Руби чем на С. Иначе 99% времени будешь бороться с утечками памяти, вместо решения задачи


--------------------
(Show/Hide)

Миссия проекта Help Fight Childhood Cancer (Помоги Победить Детский Рак) - подобрать белки, блокирующие некоторые виды рака. Подключайтесь!
IPB Image
IPB Image

IPB Image

IPB Image
IPB Image

общая статистика: BOINCstats * FreeDC команда: BOINC команда Ukraine

IPB Image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
whynot
Sep 7 2013, 21:34
Пост #22


кранчер зі стажем
******

Група: Validating
Повідомлень: 384
З нами з: 8-December 08
Користувач №: 882
Стать: Чол
Free-DC_CPID
jabber:whynot@jabster.pl



QUOTE(A1ex01 @ Sep 2 2013, 00:00) *

смогеш?)


легко

CODE

    perl -MDigest -we '
    $aa=Digest->new("SHA-256");
    while(read STDIN,$ab,64){ $aa->add($ab); print $aa->b64digest,"\n" }'


Подвернул для читаемости. Отдавал в base64, потому что когда бинарное сыпется в терминал, то становится совершенно не смешно.



--------------------
--
А ты готов к третьему майдану?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
A1ex01
Sep 8 2013, 15:46
Пост #23


round catcher)
********

Група: Trusted Members
Повідомлень: 1 395
З нами з: 27-August 08
З: Kyiv
Користувач №: 809
Стать: Чол
Парк машин:
хз*X2/2/500/хз*5870 ц7x64



лепота)
теперь задача№2
модифицировать код так, чтобы из файла2 можно было получить файл1


--------------------
Stats: RC5-72 OGR-(26 /27 /28 ) Mag@(free-dc /boinc)
support: BTC 3Po6aejsoZM7bQvo138fuYwaLc67bzMfEr
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Alien
Sep 8 2013, 15:56
Пост #24


Разработчик MolDynGrid
*******

Група: Trusted Members
Повідомлень: 584
З нами з: 7-October 07
Користувач №: 594
Стать: Чол
Парк машин:
Q6600 2.4@3.0GHz\Asus p5kc\8Gb\8600GT\2 SATA: Sams 500Gb+ 500Gb + Seagate 400Gb



как насчет сделать аналогичную тему по питончику? кто у нас в нем спец? =)


--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Waterfall
Sep 11 2013, 16:47
Пост #25


Эрудит
********

Група: Trusted Members
Повідомлень: 1 617
З нами з: 24-May 10
З: Україна,Одеса(Odessa)
Користувач №: 1 401
Стать: Чол
Парк машин:
ПК: Pentium, 2.80 GHz Ноут:DELL Studio, 2.26 GHz



Вам усім, по-моєму, краще сюди http://viknaodessa.od.ua/news/?news=78591 rtfm.gif rilian.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
whynot
Sep 15 2013, 20:15
Пост #26


кранчер зі стажем
******

Група: Validating
Повідомлень: 384
З нами з: 8-December 08
Користувач №: 882
Стать: Чол
Free-DC_CPID
jabber:whynot@jabster.pl



QUOTE(A1ex01 @ Sep 8 2013, 16:46) *

модифицировать код так, чтобы из файла2 можно было получить файл1


Использование глагола "модифицировать" наводит на подозрение, что ТС неадкватно представляет себе задачу.
Вместе с тем, это, конечно, не было легко, но так, "задача на одну трубку":

CODE

perl -MDigest -we '
$aa=Digest->new("SHA-256");
%ac=();$ad=0;
while( $ab=STDIN->getline ){
  chomp $ab;
  $ac{$ab} = [$ad++] }
@ae=((0)x64);
while(1){
  $af=pack "C*",@ae;
  $ag=$aa->add($af)->b64digest;
  exists $ac{$ag} or next;
  push @{$ac{$ag}},$af;
  @{$ac{$ag}}>2 and die "CLASH!: $ag @ae\n";
  print "found: $ag\n";
  keys %ac == grep(@{$ac{$_}}==2,keys %ac) and last }
continue{
  $ae[0]++;
  $ad=0;
  while($ae[$ad]==256){$ae[$ad]=0;$ae[++$ad]++}
  @ae==65 and die "BUSTED!\n";
  printf "\r[%3i]", $ad }
foreach $ad (sort{$a->[0]<=>$b->[0]} values %ac){
  print $ad->[1] }'


Отличия от ТЗ: на вход принимаются base64 encoded, newline terminated строки.
Глюкало мне не нравится;
лучшим решением было бы писать развернутый буфер в STDERR (перенаправленный в /dev/null, ессно, а то будет больно) и лет через этак 200 подсмотреть в этом самом STDERR как далеко ушли.

p.s. 200 лет это если использовать не стоковый Digest::SHA, а какой-нибудь XS на либу, которая считает на какой-нибудь Tesla.

p.p.s. Проверять работоспособность, может быть, можно только на специально подготовленном входе.
Очевидно, проверять на произвольном -- у меня есть лучшее применение циклам.

p.p.p.s. Рекомендуется к прочтению, для повышения адекватности.


--------------------
--
А ты готов к третьему майдану?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
A1ex01
Sep 16 2013, 15:28
Пост #27


round catcher)
********

Група: Trusted Members
Повідомлень: 1 395
З нами з: 27-August 08
З: Kyiv
Користувач №: 809
Стать: Чол
Парк машин:
хз*X2/2/500/хз*5870 ц7x64



(whynot @ Sep 15 2013, 21:15) *

Использование глагола "модифицировать" наводит на подозрение, что ТС неадкватно представляет себе задачу.

улыбнуло, всегда же можно уточнить непонятки...
задача№1 -это архиватор на базе sha2, поэтому предложил его(sha2) модифицировать для возможности обратной распаковки филе2, всего лишь...


--------------------
Stats: RC5-72 OGR-(26 /27 /28 ) Mag@(free-dc /boinc)
support: BTC 3Po6aejsoZM7bQvo138fuYwaLc67bzMfEr
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

2 Сторінки V < 1 2
Reply to this topicStart new topic
1 Користувачів переглядають дану тему (1 Гостей і 0 Прихованих Користувачів)
0 Користувачів:

 



- Lo-Fi Версія Поточний час: 19th March 2024 - 12:32

Invision Power Board v1.3.3 © 1996 IPS, Inc.