Изучение Си (урок 2(

X

Xamil

Original poster
Давай посмотрим ,как выглядит наша программа внутри
Вот пример одной из программ:

C:
#include <stdio.h>

int main()
 {
  int i;
  for(i=0; i < 10 ; i++){
    printf("Hello UFO!\n");
  }
  return 0;
}
Чтоб посмотреть на внутренности, нам нужен отладчик, я буду использовать GDB
ЗАпускаем его через терминал



Bash:
$gdb  -q ./ExampleGdb.out

---------------------------------------------------------------------------------
|  0. 0x0000000000001135 <+0>:    push   rbp                                        |
|  1. 0x0000000000001136 <+1>:    mov    rbp,rsp                                    |
|  2. 0x0000000000001139 <+4>:    sub    rsp,0x10                                    |
|  3. 0x000000000000113d <+8>:    mov    DWORD PTR [rbp-0x4],0x0                    |
|  4. 0x0000000000001144 <+15>:    mov    DWORD PTR [rbp-0x4],0x1                    |   
|  5. 0x000000000000114b <+22>:    jmp    0x1167 <main+50>                            |
|  6. 0x000000000000114d <+24>:    mov    eax,DWORD PTR [rbp-0x4]                    |
|  7. 0x0000000000001150 <+27>:    mov    esi,eax                                    |
|  8. 0x0000000000001152 <+29>:    lea    rdi,[rip+0xeab]        # 0x555555556004    |
|  9. 0x0000000000001159 <+36>:    mov    eax,0x0                                    |
| 10. 0x000000000000115e <+41>:    call   0x1030 <printf@plt>                        |
| 11. 0x0000000000001163 <+46>:    add    DWORD PTR [rbp-0x4],0x1                    |
| 12. 0x0000000000001167 <+50>:    cmp    DWORD PTR [rbp-0x4],0x9                    |
| 13. 0x000000000000116b <+54>:    jle    0x114d <main+24>                            |
| 14. 0x000000000000116d <+56>:    mov    eax,0x0                                    |
| 15. 0x0000000000001172 <+61>:    leave                                              |
| 16. 0x0000000000001173 <+62>:    ret                                                |
---------------------------------------------------------------------------------
Строки №0 -> №2 - Пролог функции.
Строка №3 - Инициализация переменной.Регистер RIP содержит адресс памяти , указывабщий на команду дизассемблированого когда функции main().Значение 0 будет помещено в регистр rbp-4 Именно здесь хранится переменная i.
Строка№8 - в адрессе 0x555555556004 , хранится наш текст
Строка №11 - Начало счетчика цикла.Поместили значение 1 в регистр rbp-4


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

Следующее о чем хотелось бы рассказать- это циклы и условные операторы, о них рассказывать много не надо, думаю большинство читателей понимают как они устроены, поэтому в крации/
Есть 3 цикла while, until и for:
while и until, это циклы с определенным условием

C:
while( Ты голоден)
{
    Найти еду;
    Съесть еду;
}

* until(Ты сыт)

{
    Найти еду;
    Съесть еду;
}
Цикл for
C:
* for(время = 1; время < 5 ; время++)
{
    Проехать 1 милю прямо;
}

Основные концепкии Программирования
  1. Переменные
  2. Арифметические операторы
  3. Операторы Сравнения
  4. Функции
Переменные
  • int (unsigned short)
  • float (unsigned short)
  • double (unsigned short)
  • char
Арифметические оперции
  • +
  • -
  • *
  • /
  • %
i+=12;
i-=12;
i*=12;
i/=12;
i%=12;
Операторы сравнения
  • <
  • >
  • <=
  • >=
  • ==
  • !=
  • ||
  • &&
Функции

C:
Инициализация Функции/\


int function(int a);

Фунциця/\

int function(a)

{


return 0;

}
 

Название темы