Аргументы функции printf() - Как и куда записывается число 400 - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имеется данный код
#include<stdio.h>
int main(){
 
unsigned char a = 200, b = 200;
 
printf("%d\n", a + b );
 
system("pause");    
    
}
Вывод: 400. Вопрос у меня есть, как и куда записывается число 400? Ведь в качестве аргумента передается 400, а не 200 + 200, но где хранится 400 до того как оно отправится в функцию?

Решение задачи: «Аргументы функции 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 в консоль. Список действий в коде:

  1. В начале кода определяются секции .file, .intel_syntax noprefix, .def, .scl, .type, .section, .rdata, .text, .globl, .def, _main, .scl, .type, .endef, которые описывают параметры компиляции и настройки сегментации кода.
  2. Затем определяются две строки в секции .rdata: LC0 содержит шаблон %d\12\0 для функции printf(), который выводит число в десятичном формате, а LC1 содержит строку pause\0, которая выводит на экран команду для приостановки выполнения программы.
  3. После этого в секции .text располагается код функции _main. При вызове функции _main происходит сохранение регистра ebp, переключение на стек, выделение памяти под локальные переменные, и вызов функции _printf с передачей в неё адреса строки LC0 в качестве аргумента.
  4. Затем вызывается функция _system с передачей в неё адреса строки LC1 в качестве аргумента.
  5. После этого в стек добавляется единица, что эквивалентно выполнению команды _system(pause).
  6. В конце функции _main регистр eax устанавливается в ноль, что означает успешный конец работы программы.
  7. Завершается код командой ret, которая возвращает управление в предыдущий контекст вызова функции.
  8. В конце кода располагается информация об идентификации компилятора и определения функций _printf и _system.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.6 из 5
Похожие ответы