Posts Tagged ‘сорс’

Нищо интересно

Friday, May 16th, 2008

Ами в последната седмица няма нищо интересно, за което да се пише. Заверките и изпитите са тук, всичко живо е изнервено. Курсовите работи и проектите тровят живота до дупка. Жегата в Пловдив и следобедното слънце блеснало в стаята ми допълнително нажежава атмосферата.
Който не е видял котката на Ебаси, lol-ната от мен - може да го стори тук.
Драснах едно тъпо PHP скриптче за смяна на тапета - можете да си го свалите от тук. Това което прави е да сваля случайно дупе от babene.ru в temp директория и да ви го лепва на десктопа. Можете да си го пъхнете в crontab и всеки ден да сте с изненадващ нов тапет.
FreeBSD-то на виртуалната машина все още върви. Разкарах му Х-а и почна да се държи по-добре :)
Виртуалната машина перманентно превзе един от десктопите ми с Windows XP и си направих 7-ми десктоп във Fluxbox-a. Чудя се как нормалните хора живеят само с един десктоп в Windows.
Открих топлата вода с Last.FM - можете да видите моя профил тук.

Имената на функциите всъщност били указатели

Wednesday, March 26th, 2008

Днес ни показаха един пиниз, според който имената на функциите в С са всъщност указатели към началния адрес на функцията като алгоритмична структура в кодовия сегмент на програмата. Т.е. като имаш адреса можеш да стартираш функцията.
Ето една програма, която показва файдата от цялата работа:

  1.  
  2. #include <stdio.h>
  3. int test (int a){
  4.         printf("A: %d\n",a);
  5.         return a;
  6. }
  7. int druga (int a){
  8.         printf("B: %d\n",a);
  9.         return a-1;
  10. }
  11. int plqk (int (*test) (int a)){
  12.         printf("Rez ot test(%d)\n",(*test) (3));
  13.         return 0;
  14. }
  15. int main(void){
  16.         plqk(test);
  17.         plqk(druga);
  18.         plqk(main);
  19.         int * p = (int *) test;
  20.         printf("test: %p\n",test);
  21.         printf("druga: %p\n",druga);
  22.         printf("p: %p\n",p);
  23.         return 0;
  24. }
  25.  

За неразбралите - функцията plqk() извиква някоя от другите функции, като точно коя се записва във формалния параметър на бляк() :)

Асемблер за линукс

Thursday, March 13th, 2008

Днес доста учудващо ни накараха да пишем на асемблер, че и за x86 линукс. Сорса почти ни го метнаха на готово, ама се оказа че е доста елементарно. Което ме вкарва в малко размисъл относно природата на 'машинната инструкция' и 'асемблера', ама тези размишления са в разрез на всякакви правила и заучени положения и ако ги спомена някой разбирач ще ме насмели :)

$ vim test.asm
section .data
msg db 'hello world',0xA ; зареждаме текстов низ "здрасти" като променливата msg е указател към началния адрес (ех, това С), 0хА е знак 10, който познайте какво прави
len equ $-msg ; променливата $ (долар) указвала текущия адрес, така че дължината на низа "здравей" ще се сметне лесно
section .text
global _start
_start: ; входна точка
mov EAX, 0x04 ; изписването на текст на конзолата ставало през syscall от кърнела - функция с параметри. В ЕАХ се зарежда номера на функцията, а в следващите регистри параметрите. Функция номер 4 е изписване, която приема следните параметри:
mov EBX, 0x01 ; файлов дескриптор където ще се изписва
mov ECX, msg ; съобщението
mov EDX, len ; дължината му
int 0x80 ; а самото извикване на функцията става през прекъсване на 80h. Единственото възможно прекъсване (wtf)
mov EAX, 0x01 ; пак ще извикваме функция, но този път за край на програмата (функция 1 - return)
int 0x80
$ nasm -f elf test.asm # асемблираме кода
$ ld -o test test.o # свързваме
$ ./test # изпълняваме
hello world
$ ls -lh test* # да видим общия размер на всичко току що създадено
-rwxr-xr-x 1 ivanatora users 757 2008-03-14 20:26 test*
-rw-r--r-- 1 ivanatora users 193 2008-03-14 20:30 test.asm
-rw-r--r-- 1 ivanatora users 704 2008-03-14 20:30 test.o

Да видим същия резултат постигнат на С:

$ vim hello.c
#include <stdio.h>
int main(void){
printf("Hello world\n");
return 0;
}
$ gcc -o hello hello.c
$ ./hello
Hello world
$ ls -lh hello*
-rwxr-xr-x 1 ivanatora users 6.2K 2008-03-14 20:37 hello*
-rw-r--r-- 1 ivanatora users 74 2008-03-14 20:37 hello.c

Десет пъти по-голям изпълним файл. Ако същото се компилира пък в M$ Visual Studio, няма да говоря за размера :)

ПП. Егх тоя гаден WordPress, нито шрифта е хубав нито индентациите са си на мястото, а и на всичкото отгоре се опитва да ми затвори тага <stdio.h>

Не можах да издържа :)

Sunday, February 3rd, 2008

Внимавайте как си кръщавате децата :)
Exploit

The march of progress

Saturday, November 17th, 2007

Това го видях на един друг блог и ме накара да се замисля :)
От къде са тръгнали синтактичните правила и на къде отиват.

The March of Progress

1980: C
printf("%10.2f", x);

1988: C++
cout < < setw(10) << setprecision(2) << showpoint << x;

1996: Java
java.text.NumberFormat formatter = java.text.NumberFormat.getNumberInstance();
formatter.setMinimumFractionDigits(2); formatter.setMaximumFractionDigits(2);
String s = formatter.format(x); for (int i = s.length(); i < 10; i++) System.out.print(' ');
System.out.print(s);

2004: Java
System.out.printf("%10.2f", x);