Аргументы функции printf() - Как и куда записывается число 400 - C (СИ)
Формулировка задачи:
Имеется данный код
Вывод: 400. Вопрос у меня есть, как и куда записывается число 400? Ведь в качестве аргумента передается 400, а не 200 + 200, но где хранится 400 до того как оно отправится в функцию?
#include<stdio.h> int main(){ unsigned char a = 200, b = 200; printf("%d\n", a + b ); system("pause"); }
Решение задачи: «Аргументы функции printf() - Как и куда записывается число 400»
textual
Листинг программы
.file "a.c" .intel_syntax noprefix .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "%d\12\0" LC1: .ascii "pause\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: push ebp mov ebp, esp and esp, -16 sub esp, 32 call ___main mov BYTE PTR [esp+31], -56 mov BYTE PTR [esp+30], -56 movzx edx, BYTE PTR [esp+31] movzx eax, BYTE PTR [esp+30] add eax, edx mov DWORD PTR [esp+4], eax mov DWORD PTR [esp], OFFSET FLAT:LC0 call _printf mov DWORD PTR [esp], OFFSET FLAT:LC1 call _system mov eax, 0 leave ret .ident "GCC: (tdm-1) 5.1.0" .def _printf; .scl 2; .type 32; .endef .def _system; .scl 2; .type 32; .endef
Объяснение кода листинга программы
В коде представлен простейший пример использования функции printf() для вывода числа 400 в консоль. Список действий в коде:
- В начале кода определяются секции .file, .intel_syntax noprefix, .def, .scl, .type, .section, .rdata, .text, .globl, .def, _main, .scl, .type, .endef, которые описывают параметры компиляции и настройки сегментации кода.
- Затем определяются две строки в секции .rdata: LC0 содержит шаблон
%d\12\0
для функции printf(), который выводит число в десятичном формате, а LC1 содержит строкуpause\0
, которая выводит на экран команду для приостановки выполнения программы. - После этого в секции .text располагается код функции _main. При вызове функции _main происходит сохранение регистра ebp, переключение на стек, выделение памяти под локальные переменные, и вызов функции _printf с передачей в неё адреса строки LC0 в качестве аргумента.
- Затем вызывается функция _system с передачей в неё адреса строки LC1 в качестве аргумента.
- После этого в стек добавляется единица, что эквивалентно выполнению команды _system(
pause
). - В конце функции _main регистр eax устанавливается в ноль, что означает успешный конец работы программы.
- Завершается код командой ret, которая возвращает управление в предыдущий контекст вызова функции.
- В конце кода располагается информация об идентификации компилятора и определения функций _printf и _system.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д