Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Язык Си сделали для того, чтобы не мучиться с ассемблером. Однако, если вы изучаете Си стоит немного изучить ассемблер (хотя бы для x86).
- Приведу пример с некоторыми упрощениями (в реальности всё гораздо страшнее).
- Как вам должно быть известно, компилятор "транслирует" исходный код в набор инструкций целевого процессора (объектный код, т.е. просто набор команд для процессора).
- Допустим, мы пишем:
- // функция
- int someFunction() {
- int i = 0;
- i++;
- return i;
- }
- // её вызов
- someVariable = someFunction();
- Компилятор это превратит в что-то наподобие этого:
- // функция
- someFunction:
- add sp, 4; поднимаем стек на 4 байта для локальной переменной i
- mov [sp], 0; записываем значение
- inc [sp] ; инкрементируем
- ;; У нас есть "договорённость": функции возвращают значение через
- ;; регистр ax
- mov ax, [sp];
- sub sp,4; возвращаем стек в исходное состояние
- ret; перейти назад, к месту вызова (определяется регистром IP)
- // вызов
- call someFunction; сохранить IP в стеке и перейти по метке (адресу)
- mov someVariable, ax; записываем результат вызова в переменную
- Тут есть неточности, но самое главное: функция возвращает значение через определённый регистр (eax, ax), либо каким-то другим способом.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement