· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Что такое .FPO (masm)?

Посл.отвђт Сообщенiе


Дата: Авг 4, 2003 17:54:02

Залез я тут в папочку \Microsoft Visual Studio .NET\Vc7\crt\src\intel.
А там кучка *.asm файликов - strlen.asm, strncat.asm, memccpy.asm, memcmp.asm и т.п.
В общем, рантайм библиотечка на асме (masm). Довольно все грамотно написано.

Так вот. Во многих файлах встречается такая сторока:
.FPO    ( 0, 3, 0, 0, 0, 0 )

Цифры от файла к файлу отличаются, точнее только вторая, все остальные всегда 0.

Попробовал к себе запихнуть. Компилятор написал:
: warning A4020: directive ignored outside a procedure

Запихнул внутрь процедуры - все скомпилилось без ошибок, но в код ничего не добавилось.
Доки по этому поводу молчат. Попробовал в сети поискать - на полную строку находится пару ссылок на какие-то китаезные борды, но там все равно только вопрос - ответа нет. Поиск "FPO" ".FPO" ".FPO (" и т.п. ни кчему хорошему не приводит :( Очень сильно я не парился и решил спросить.

Кто знает, что это такое?


Дата: Авг 4, 2003 18:25:40

Four-F
\Microsoft Visual Studio .NET\Vc7\crt\src\intel.
Даааа, был я там :)))

Но такого не заметил. Гляну.
Но процентов на 99,99% -- это макро
Не смотри, что он начинрается с точки, и такое можно.

Но могу заявить, что в Доках по MASM даже новых такого нет


Дата: Авг 4, 2003 18:27:34

Хотя... Гляну... Ты не пробывал смотреть в ML (бинарик)
Там кстати есть некоторые UnDoc... вещи...
Надо глянуть на .FLO


Дата: Авг 4, 2003 18:41:48

FPO - floating pointer omission
Вот часть дампа со случайно взятого файла:
dumpbin.exe /FPO sh30w32.dll >fpo.txt
Dump of file sh30w32.dll
File Type: DLL

FPO Data (222)
                                             Use Has  Frame
RVA      Proc Size   Locals  Regs   Prolog  BP  SEH  Type   Params
00001000        96        0     2        2   N   N    fpo        4  _MemPoolShrink@4
00001060       144        8     4       21   Y   N    fpo        0




Дата: Авг 4, 2003 18:55:28

volodya
ТО есть это новая секция?


Дата: Авг 4, 2003 19:17:50 · Поправил: _alex_

Вот что google нашел:

.FPO Directive
--------------

FPO stands for Frame Pointer Omission. The .FPO directive is a feature
added to MASM386 5.10.NT that controls the emission of debug records
to the .debug$F segment or section of the object file. These records
are the same records that the Microsoft Visual C++ 1.10 or Microsoft
Fortran PowerStation compilers emit when they perform frame pointer
elimination under /Oy and /Ox optimization control, respectively.
Unlike the compiler, MASM never performs any such optimization. it
simply passes on the information supplied by the programmer within
this directive to the object file.

The .FPO directive does not have to be used in order to debug assembly
programs under the Microsoft Visual C++ 1.10 or Microsoft Fortran
PowerStation debuggers whether they are stand alone Windows NT
applications or mixed language C\Assembly or Fortran\Assembly Windows
NT applications. This directive has been implemented to provide better
backward compatibility with assembly code written for MASM386 5.10.NT,
which is provided with the Windows NT DDK.

The FPO directive should only be used on naked procedures or those
procedures not declared with proto and called with invoke. Also you do
not need to use the .FPO directive to debug naked procedures or on
procedures that use proto and invoke.


The following 6 parameters are used within the directive as follows.

.FPO ( number of bytes in a procedures local variables divided by 4,
number of bytes in a procedures parameters divided by 4,
number of bytes in a procedure prologue,
number of registers saved by a procedures prologue,
If EBP is allocated,
Frame Type )


Parameters Range
---------- -----
number of bytes in local variables / 4 >= 0
number of bytes in parameters / 4 0 - 65535
number of bytes in the procedure prologue 0 - 255
number of registers saved 0 - 7
If EBP is allocated 0 = false, 1 = true
Frame Type 0 - 2

The valid values for the Frame Type parameter above are

FRAME_FPO 0
FRAME_TRAP 1
FRAME_TSS 2

The C compiler only generates entries with FRAME_FPO. The other two
types are used inside the Windows NT kernel to all stack traces
across trap and tss frames that can appear in ring 0 code.

Example Usages:

1)
aproc proc
.FPO ( 0, 0, 0, 0, 0, 0 ) ; all params are zero.
ret
aproc endp

2)
.code
push +000000001h
call aproc
add esp, 04h
ret

aproc proc
push ebp
mov ebp, esp

.FPO ( 0, 1, 3, 1, 1, 0 ) ; 0 = no locals
; 1 = 4 byte param \ 4
; 3 = bytes in procedure prologue
; 1 = one register saved in prologue
; 1 = if EBP was allocated
; 0 = frame type of FPO

mov eax, dword ptr [ebp+8] ; move the passed param to EAX.

leave
ret 00h
aproc endp


See ERRMSG.TXT for a list of possible error messages that could
be encountered when using the .FPO directive.


Дата: Авг 4, 2003 19:19:02 · Поправил: Four-F

[ Edmond: Не смотри, что он начинрается с точки, и такое можно. ]

Это понятно.


[ Edmond: Но могу заявить, что в Доках по MASM даже новых такого нет ]

Что за новые доки. Ты имеешь ввиду "Microsoft Macro Assembler Reference" в MSDN?



[ Edmond: Ты не пробывал смотреть в ML (бинарик) ]

Да я чтоб время не тратить решил спросить сначала.



[ volodya: FPO - floating pointer omission ]

Ага понятно. Только frame pointer omission
Да в MSDN есть кое-что. Но в любом случае это недокумментированная фича masm. Надо будет посмотреть на досуге.



Хммм......... _alex_, спасибо.


[ _alex_: Насколько я понял, это не масмовская директива. ]

На он ее запросто скушал и ничего не сказал. Ладно, для зацепки достаточно - будем копать. Всем спасибо.


Дата: Авг 4, 2003 19:31:42

Four-F
Коли раскопаешь напиши!!!!


Дата: Авг 5, 2003 14:54:02 · Поправил: Four-F

В общем из всего, что я прочитал по сабжу, следует один главный вывод - нам это не пригодится ;-)

А если кому интересно, то эта шняга нужна для отладки, чтобы отладчик смог локализовать базу стекового кадра процедуры. Причем нужно это только в некоторых случаях, например, если для процедуры не определен прототип и она завется не через invoke.

Ключевые фразы вот:

This directive has been implemented to provide better backward compatibility with assembly code written for MASM386 5.10.NT, which is provided with the Windows NT DDK. - это из доки, которую выше процетировал _alex_.

Сама дока тут:
Release Notes for the Microsoft(R) MASM


When the Microsoft Visual C++® compiler optimizes code, stack frames can be omitted in certain cases. When a stack frame is omitted, the debugger cannot figure out where the local variables for the current function end and the information for the next function begins.
. . .
The debug symbol files contain frame pointer omission (FPO) records that give enough information to find the next function information on the stack without using frame pointers.
- это из статьи "Generating and Deploying Debug Symbols with Microsoft Visual C++ 6.0" в MSDN.


Я маленько побаловался с ней - в объектный файл добавляется секция '.debug$F' и что-то там в нее пихается. На екзешнике скомпилированном обычным образом никак не отражается, что в общем и должно быть, т.к. оно для debug purposes. Если слинковать с /debug /debugtype:cv, то кое-какие изменения происходят. И сгенерированные *.pdb отличаются. Дальше копать я не стал, в связи с полной потерей интереса к сабжу. Вот. Особое спасибо _alex_ за тыканье носом в нужном направлении.


Кстати, Edmond, в той доке, ссылка на котрую выше, в разделе "Part 5: Known Assembler Bugs" есть такое место:
     EQU Redefinition
     ----------------

     EQU can be redefined when a text macro is used, the following example
     illustrates this known bug.

     a EQU <T>
     a EQU <U>   ; This second occurence should generate an error "A2005: 
		 ; symbol redefinition" because once "a" is defined as a 
		 ; text macro it cannot be redefined to be a different kind 
		 ; of symbol.

     y EQU y     ; This statement is syntactically correct, but any attempt  
		 ; to use "y" and you'll receive "error A2123: text macro 
		 ; nesting level too deep".


Может пригодится для твоей статьи по макросам.


Дата: Авг 5, 2003 16:17:43

Four-F
Кстати, Edmond, в той доке, ссылка на котрую выше, в разделе "Part 5: Known Assembler Bugs" есть такое место:
А у меня есть это!!!!
Обижаете :)))


Дата: Авг 5, 2003 19:25:05

Т.е. ты хочешь сказать, что у тя весь патч к 6.13 есть? В том виде как m$ его поставляла. Если да, то давай - для коллекции.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038