Поиск:

Ответ в темуСоздание новой темы Создание опроса
> masm32, invoke, ошибка при компиляции 
V
    Опции темы
race1
Дата 24.11.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Привет!

Пытаюсь вызвать ф-ю GetTextExtentPoint32 и получаю ошибку.

Код

GameTimer proc
    local dc: HDC
    local textWidth: POINT
    local sptr: DWORD
...
    mov sptr, ptr$(s)
...
    mov s, 0
    mov sptr, cat$(sptr, "Игрок 2, очки: ", ustr$(FDude2Count))
...
    ; варианты, описанные ниже
...
    invoke TextOut, dc, 10, 10, "kva", 3


Вариант номер один:

Код

    invoke GetTextExtentPoint32, dc, sptr, len(sptr), ptr$(textWidth)


Компилируется нормально, но видимо происходит Access Violation, в итоге последующий invoke ничего не рисует (OllyDbg пишет в статусной строке AV когда F8 строку invoke GetTextExtentPoint32 ...

Вариант номер два:

Код

    invoke GetTextExtentPoint32, dc, sptr, len(sptr), addr textWidth


Получаю ошибку при компиляции: error A2133: register value overwritten by INVOKE

Ну в общем много вариантов перепробовал, потому что не уверен как правильно smile Хотя например 

Код
invoke GetClientRect, hWnd, addr clientRect


работает как надо. Структуры SIZE и POINT одинаковы, и там и там два LONG.

Помогите пожалуйста, что здесь не так.
PM MAIL ICQ   Вверх
Mikl_
Дата 25.11.2008, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



race1, второй аргумент GetTextExtentPoint32 адрес строки, третий аргумент количество символов в строке (видимо ссылаться нужно на строку s) тоже самое будет с TextOut, dc, 10, 10, "kva", 3 -- ассемблер это не С, которая расположит "kva" в локальном буфере, а потом удалит его, здесь всё делается ручками  smile 
IMHO нужно так invoke GetTextExtentPoint32, dc, offset s, length(s), addr textWidth


Это сообщение отредактировал(а) Mikl_ - 25.11.2008, 12:44
PM MAIL   Вверх
dumb
Дата 25.11.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



необходимо избегать применения макросов в параметрах invoke, так как они(макросы) используют для возврата значения регистр eax, и в результате получается "борьба" за этот регистр.

и если при использовании ADDR(встроенный макрос) компилятор отслеживает "незаконные" изменения eax и ругается(error A2133), то в случае ptr$ все происходит с "тихой сапой":

например в твоем случае, вследствие выноса вызовов функций "наверх", получается:
Код

push        sptr
call        szLen
lea         eax,textWidth ; ops. результат len перетерт адресом textWidth
mov         word ptr [eax],0
push        eax
push        eax
push        sptr
push        dc
call        GetTextExtentPoint32

как результат: GetTextExtentPoint32 пытается прочитать слишком много(например 12FFF0) из sptr - AV.
PM MAIL   Вверх
race1
Дата 25.11.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Цитата(dumb @  25.11.2008,  17:27 Найти цитируемый пост)
необходимо избегать применения макросов в параметрах invoke, так как они(макросы) используют для возврата значения регистр eax, и в результате получается "борьба" за этот регистр.


О, да! То что надо! smile Переделал так:

Код

mov tmpDWORD, len(sptr)
invoke GetTextExtentPoint32, dc, sptr, tmpDWORD, addr textWidth


и заработало!

Спасибо smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.