Advertisement
Guest User

C-language-asm

a guest
Dec 10th, 2013
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. Язык Си сделали для того, чтобы не мучиться с ассемблером. Однако, если вы изучаете Си стоит немного изучить ассемблер (хотя бы для x86).
  2. Приведу пример с некоторыми упрощениями (в реальности всё гораздо страшнее).
  3. Как вам должно быть известно, компилятор "транслирует" исходный код в набор инструкций целевого процессора (объектный код, т.е. просто набор команд для процессора).
  4. Допустим, мы пишем:
  5. // функция
  6. int someFunction() {
  7. int i = 0;
  8. i++;
  9. return i;
  10. }
  11. // её вызов
  12. someVariable = someFunction();
  13. Компилятор это превратит в что-то наподобие этого:
  14. // функция
  15. someFunction:
  16. add sp, 4; поднимаем стек на 4 байта для локальной переменной i
  17. mov [sp], 0; записываем значение
  18. inc [sp] ; инкрементируем
  19. ;; У нас есть "договорённость": функции возвращают значение через
  20. ;; регистр ax
  21. mov ax, [sp];
  22. sub sp,4; возвращаем стек в исходное состояние
  23. ret; перейти назад, к месту вызова (определяется регистром IP)
  24. // вызов
  25. call someFunction; сохранить IP в стеке и перейти по метке (адресу)
  26. mov someVariable, ax; записываем результат вызова в переменную
  27. Тут есть неточности, но самое главное: функция возвращает значение через определённый регистр (eax, ax), либо каким-то другим способом.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement