Разберите следующий код c. cl / Fa mycode.c
fflush (stdin) ;
fflush (stdout) ;
fflush (stderr) ;
Это в основном то, как будет выглядеть вывод файла сборки с переключателем / Fa в файле c:
call ___iob_func ; invoke the c function __iob_func
push eax ; invoke fflush with 1 parameter
call _fflush
add esp, 04h ; realign the stack adding 4 bytes to
; the stack pointer (esp).
Итак, очевидно, __iob_func возвращает указатель на массив или структуру информации буфера ввода-вывода; отсюда акроним iob , за которым следует func (__iob_func). я обозначает для ввода, о для вывода, б для буфера и т. д. ......
Это просто функция fflush (stdin). fflush (stdout) повторяет те же 4 строки с единственным отличием для stdout во второй строке:
push eax + 020h
Таким образом, очевидно, каждый член массива состоит из 32 байтов или 8 двойных слов.
Для stderr ассемблер отправляет push eax + 040h или eax + 64 байта
Microsoft Developer Network (MSDN) не документирует функцию __iob_func. Но это объявление, вероятно, будет выглядеть примерно так: lpReturn __iob_func (void)
32-битная сборка обычно возвращает значение функции в регистре eax. И когда значение входного параметра функции описывается как дополнение к регистру (например, eax + 020h), это обычно означает, что оно ссылается на структуру или массив некоторого типа. Таким образом, eax будет начальным адресом структуры или массива. И eax + 020h будет местом в той структуре, где начинается информация для stdout. eax + 040h будет местом, где начинается stderr.
Так что, в принципе, если вы хотите использовать __iob_func в своей программе на c, вам придется создать прототип функции, а затем, возможно, создать собственную личную библиотеку
mylib.def
БИБЛИОТЕКА msvcrt.dll
ЭКСПОРТ
__iob_func
А затем запустите lib для этого файла.
LIB /def:mylib.def / machine: x86
Это должно создать 32-битную библиотеку mylib.lib, которую вы можете использовать для ссылки в вашу программу.