Конкретно говоря о части кода C ++ здесь: [ССЫЛКА НА САЙТ]
(Intel X86, .cpp
& .asm
гибридная программа.)
От работы с указателями символов / строк в .asm
Я знаю, что он использует dl
/dx
регистры для их хранения до отображения (в случае 2h
а также 9h
функции).
Как это в случае, когда данные (в частности, значение с плавающей запятой) отправляются в часть C ++ гибрида, а затем обрабатываются с помощью cout
?
Где это значение хранится до cout
превращает его в строку для отображения? (Это регистр, или стек, или что-то еще?)
Материал C ++ более низкого уровня зависит от платформы. Например, чтение символа с клавиатуры. Некоторые платформы не имеют клавиатуры. Некоторые платформы отправляют сообщения, когда персонаж прибывает, другие ждут (опрос порта ввода).
Давайте поговорим на один уровень ниже языка высокого уровня.
За cin
базовый уровень читает символы из входного буфера. Если буфер пуст, нижележащий слой считывает символы из стандартного ввода и сохраняет их в буфере до тех пор, пока не будет обнаружен символ конца строки.
Примечание: есть методы, чтобы обойти этот уровень, все еще используя C ++.
Во многих платформах на основе ОС библиотеки C ++ в конечном итоге вызывают функцию ОС для извлечения одного символа. В Linux ОС делегирует этот запрос Водитель. Драйвер несет ответственность за считывание символа с оборудования и его возврат. Драйвер — это фрагмент кода, который получает символ с клавиатуры.
Есть исключения из этого пути, например трубы. С помощью конвейера ОС перенаправляет запросы от стандартного ввода в файл или устройство, в зависимости от командной строки.
Где хранится это значение до того, как cout преобразует его в строку для отображения? (Это регистр, или стек, или что-то еще?)
Компилятор вызывает функцию, которая преобразует внутреннее представление переменной с плавающей запятой в текстовое представление. Это текстовое представление отправляется cout
функция, символ за символом; или как указатель на строку. Текстовое представление может находиться практически где угодно: стек, куча, кэш и т. Д. Это действительно не имеет значения. Большинство регистров процессора слишком малы, чтобы содержать все символы в текстовом представлении числа с плавающей запятой.
Значение с плавающей запятой может быть сохранено в регистре, в стеке или в других местах перед передачей в функцию преобразования. Зависит от уровня оптимизации компилятора и API для функции преобразования. Компилятор постарается использовать наиболее эффективные типы хранилищ.