Доброго времени суток. Следует уточнить, что нужно такой справочник, в котором показывается какие регистры изменяются и какие значения, что означают. Сам справочник есть, но там про регистры нет ничего. Есть ли таковые вообще?
Ссылку не дам, но скажу, что: 1. В основном используется stdcall (стек чистит вызываемая ф-ия) 2. При вызове API сохраняют регистры ebx, esi, edi, ebp и ждут от пользовательских ф-ий того же. (Это в большей степени касается callback) 3. API ожидают, что EFLAGS.DF сброшен (cld). Пункт 2 относится только к 32 битам. В 64 сохраняется больше регистров.
я ничего не понял) Вот например, функция GetFileAttributes. передаю путь к файлу. Вызываю. А как мне получить данные, которые она вернула? Через делфи пошагово могу отследить какие регистры были изменены. Но, как я не извращался, они постоянно одинакого меняются.
Code (Text): function GetFileAttributes(lpFileName: PChar): DWORD; stdcall; функция вернёт DWORD Code (Text): var dwTme:dword; begin dwTmp:=GetFileAttributes('file.ext'); ...
эт я понял, что она дворд вернет) то что в еах, я так и думал. Вот если передать строку на файл, вернет 0FFFFFFFFh в случаи с папкой тоже самое) дак как тогда определить?
spencer Ага, про возвращаемое значение я забыл. Luzer Вот пример: Code (Text): main: push ebp ;подготовим стековый кадр. mov ebp, esp ;Этого можно не делать, но ebp надо сохранить. push ebx ;Эти регистры лучше сохранить в main push esi ; т.к. вызывающая ф-ия, вероятно, push edi ; в них что-то сохранила. mov ebx, 0x5 cld ;если мы до этого меняли DF, то перед вызовом его надо восстановить. Иначе some_API_function может осерчать на нас исключением. @@: call some_API_function or eax, eax ;проверим возвращаемое значение. jz @f ;Если 0 -- выйдем мз цикла. sub ebx, 0x1 ;можно не беспокоиться, some_API_function не изменит значение ebx. Этого нельзя сказать про другие регистры, кроме ebp, esi, edi. jnz @b @@: pop edi pop esi pop ebx pop ebp ret
Code (Text): Return Values If the function succeeds, the return value contains the attributes of the specified file or directory. If the function fails, the return value is INVALID_FILE_ATTRIBUTES. To get extended error information, call GetLastError. задаем поиск попапке .../include файлов *.h содержаших фразу INVALID_FILE_ATTRIBUTES нашелся лишь WinBase.h, смотрим в него: #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) вот тебе и 0FFFFFFFFh. Думаю ход мысли понятен и он проясяет описываемую тобою картину
врублися-)) только о существовании справочника я так и не узнал Придется делать, как спэнсэр говорит)
Вот такая вставочка на делфи Code (Text): jmp @start @sa: db "c:\test",0 @start: mov eax, offset @sa inc eax push 0 push eax push eax push 0 call MessageBoxA почему вместо строки, вылезает две кракозябры? ничего не понимаю
с первого взгляда вес корректно, но я бы не стал делфи юзать, тем более для проверки асм вставочек. Поюзай дебагер поставив бряк на call MessageBoxA и погляди что на самом деле лежит в [eax] P/S зачем там inc eax?
inc остался от предыдущего раза, когда я из var'а брал строку... Раньше этот пример и на делфях катил=) з.ы: Почему-то делфя заменяет "\" на пробел... хрень какая-то) косяк ее видать.
Code (Text): jmp @start @sa: db 'c:\test',0 @start: lea eax, @sa+1 push 0 push eax push eax push 0 call MessageBoxA \t - символ табуляции работает только в строках ограниченных двойными кавычками
zet действительно=) Опять путаница. Делаю все в масме Code (Text): .386 .model flat,stdcall option casemap:none extern GetFileAttributes@4:near includelib kernel32.lib .data sss db "C:\test\tets.txt",0 .code start: push offset sss call GetFileAttributes@4 end start testmasm.obj : error LNK2001: unresolved external symbol _GetFileAttributes@4 testmasm.exe : fatal error LNK1120: 1 unresolved externals Тоже самое делаю с FindNextFile - все нормально)) Почему?
Code (Text): .386 .model flat,stdcall option casemap:none extern GetFileAttributesA@4:near includelib \masm32\lib\kernel32.lib .data sss db "C:\test\tets.txt",0 .code start: push offset sss call GetFileAttributesA@4 end start
У меня где-то лежал талмуд на английском языке, где описывались спецификации вызовов процедур. Но блин пока не смог найти. К тому, что уже сказано могу добавить то, что если процедура работает с плавающей точкой, то результат в st0, если MMX, то MM0. При этом полагаться на содержимое других регистров процедура не должна они могут быть любыми. То же относится и к SSE.
Luzer если работаешь с масм то смотри на в .pas а в .inc в самом масме, а там соотвественно или с А или с W. ЕСли бы ты подключил kernel32.inc то никакой буквы A добавлять не нужно было бы, а так как у вас извольте добавлять.