X
Xamil
Original poster
Давай посмотрим ,как выглядит наша программа внутри
Вот пример одной из программ:
Чтоб посмотреть на внутренности, нам нужен отладчик, я буду использовать GDB
ЗАпускаем его через терминал
Строки №0 -> №2 - Пролог функции.
Строка №3 - Инициализация переменной.Регистер RIP содержит адресс памяти , указывабщий на команду дизассемблированого когда функции main().Значение 0 будет помещено в регистр rbp-4 Именно здесь хранится переменная i.
Строка№8 - в адрессе 0x555555556004 , хранится наш текст
Строка №11 - Начало счетчика цикла.Поместили значение 1 в регистр rbp-4
Также не нужно вдаваться в подробности, мы просто посмотрели как компьютер понимает нашу программу, зная Assembler вам не составит труда понять, что написано на верху.
Следующее о чем хотелось бы рассказать- это циклы и условные операторы, о них рассказывать много не надо, думаю большинство читателей понимают как они устроены, поэтому в крации/
Есть 3 цикла while, until и for:
while и until, это циклы с определенным условием
Цикл for
Основные концепкии Программирования
i-=12;
i*=12;
i/=12;
i%=12;
Операторы сравнения
Вот пример одной из программ:
C:
#include <stdio.h>
int main()
{
int i;
for(i=0; i < 10 ; i++){
printf("Hello UFO!\n");
}
return 0;
}
ЗАпускаем его через терминал
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 |
---------------------------------------------------------------------------------
Строка №3 - Инициализация переменной.Регистер RIP содержит адресс памяти , указывабщий на команду дизассемблированого когда функции main().Значение 0 будет помещено в регистр rbp-4 Именно здесь хранится переменная i.
Строка№8 - в адрессе 0x555555556004 , хранится наш текст
Строка №11 - Начало счетчика цикла.Поместили значение 1 в регистр rbp-4
Также не нужно вдаваться в подробности, мы просто посмотрели как компьютер понимает нашу программу, зная Assembler вам не составит труда понять, что написано на верху.
Следующее о чем хотелось бы рассказать- это циклы и условные операторы, о них рассказывать много не надо, думаю большинство читателей понимают как они устроены, поэтому в крации/
Есть 3 цикла while, until и for:
while и until, это циклы с определенным условием
C:
while( Ты голоден)
{
Найти еду;
Съесть еду;
}
* until(Ты сыт)
{
Найти еду;
Съесть еду;
}
C:
* for(время = 1; время < 5 ; время++)
{
Проехать 1 милю прямо;
}
Основные концепкии Программирования
- Переменные
- Арифметические операторы
- Операторы Сравнения
- Функции
- int (unsigned short)
- float (unsigned short)
- double (unsigned short)
- char
- +
- -
- *
- /
- %
i-=12;
i*=12;
i/=12;
i%=12;
Операторы сравнения
- <
- >
- <=
- >=
- ==
- !=
- ||
- &&
C:
Инициализация Функции/\
int function(int a);
Фунциця/\
int function(a)
{
return 0;
}