· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› c++ and asm

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


Дата: Янв 18, 2003 10:54:46

подскажите плз почему
при вставке асм кода в си++ часто возникает ошибка "acess violation"
это из за защищенного режима если да то как читать/записать значение по адресу сегмент:смещение
пример
void funk()
{
int i;
...
_asm{
mov ax,040h
mov es,ax
mov ebx,dword ptr es:[06ch] // "acess violation"

}
...
}


Дата: Янв 18, 2003 12:32:13 · Поправил: Four-F

[ dre: это из за защищенного режима? ]

Скорее всего да.
То, что ты в es пихаешь - селектор описывающий сегмент.
Либо у тя нет такого (40h) дескриптора,
либо он описывает сегмент в котором нет такого (06Ch) адреса.
Что-либр посоветовать трудно, т.к. по твоему коду не понятно че ты ваще делаешь. Но в любом случае, стоит разобраться с адресацией в защищенном режиме.


Дата: Янв 20, 2003 15:30:56 · Поправил: Pavel

Как я понимаю, тебе нужно в DOS-режиме получить значение системного таймера? Тогда в защищённом режиме сначала надо узнать селектор, соответствующий 40h, и уже его поместить в es.

В DPMI есть такая функция:

Category: DOS extenders
Flags: available only in protected mode
INT 31 P - DPMI 0.9+ - SEGMENT TO DESCRIPTOR

AX = 0002h
BX = real mode segment
Return: CF clear if successful
AX = selector corresponding to real mode segment (64K limit)
CF set on error
AX = error code (DPMI 1.0+) (8011h)
Notes: multiple calls for the same real mode segment return the same selector
the returned descriptor can never be modified or freed
not supported by MS Windows 3.0 in Standard mode

Не знаю, на каком именно C++ ты пишешь, но может быть у него есть готовая аналогичная функция, а может быть, есть свои внутренние переменные, в которых хранятся селекторы для часто используемых сегментов - 0040, B800 и т.д.


Дата: Янв 21, 2003 18:56:34 · Поправил: AsmGuru62

0000:046C is a DOS timer counter (long) - it cannot be accessed from Win32 code. Use 'GetTickCount()' instead.


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