че никто не делал? нашел три разных примера в инете, менял версии доса, ставил химем.сис и без него ппробовал, открывал-закрывал вентиль а20, делал на двух виртуальных машинах с разными процессорами и на железе. не работает
» Assembler
Было дело, и пример рабочий был. Поищу. Только... Не гонялся бы поп за дешевизною... Тебе лишние проблемы нужны?
[censored]
MERCURY127
какие проблемы? видимо где то ошибка и я ее не могу найти уже часов 14.
меньше на вход и возврат в защищенный режим потратил. может из за виртуалки может из за доса, может из за кода. может фиг знает из за чего. и так как может быть из за чего угодно ошибку никак не вычислить
Добавлено:
не говоря уж что нигде толком не написано про то как это работает. написано "в скрытой части сегментного регистра чета остается" а че остается так никто и не постарался написать
какие проблемы? видимо где то ошибка и я ее не могу найти уже часов 14.
меньше на вход и возврат в защищенный режим потратил. может из за виртуалки может из за доса, может из за кода. может фиг знает из за чего. и так как может быть из за чего угодно ошибку никак не вычислить
Добавлено:
не говоря уж что нигде толком не написано про то как это работает. написано "в скрытой части сегментного регистра чета остается" а че остается так никто и не постарался написать
Потерпи - с компа зайду - объясню, как оно работает
терплю.
Добавлено:
http://devotes.narod.ru/Books/3/ch10_04e.htm вот кроме того что чушь какая то пример не работающий, три ошибки в нем (возможно)
http://www.assembly.happycodings.com/code54.html - вот этот может и работающий но не написано как компилировать ifdef используется.
http://www.df.lth.se/~john_e/gems/gem0022.html - вот этот пример самый лучший возможно.
http://wasm.ru/article.php?article=lfbdos - вот тута пример тоже почти работащий
но ни фига не получается проверить что он установился.
http://en.wikipedia.org/wiki/Unreal_mode вот тут наверно более или менее хорошо написано
Добавлено:
ну я в принчипе то понял. что можно в один (или больше) из сегментных регистров (fs gf лучше всего) при выходе из защищенного режима не грузить специальный для выхода дескриптор дос сегмента, а взять влепить лимит в 4 гига базовый адрес нуль . но вот ни фига не получается потом символ вписать в экран по абсолютному 32 битному адресу
Добавлено:
все блин нашел ошибку - не указал в проверочной программе USE16,
но все ранво жду и пример и практические советы
Добавлено:
http://devotes.narod.ru/Books/3/ch10_04e.htm вот кроме того что чушь какая то пример не работающий, три ошибки в нем (возможно)
http://www.assembly.happycodings.com/code54.html - вот этот может и работающий но не написано как компилировать ifdef используется.
http://www.df.lth.se/~john_e/gems/gem0022.html - вот этот пример самый лучший возможно.
http://wasm.ru/article.php?article=lfbdos - вот тута пример тоже почти работащий
но ни фига не получается проверить что он установился.
http://en.wikipedia.org/wiki/Unreal_mode вот тут наверно более или менее хорошо написано
Добавлено:
ну я в принчипе то понял. что можно в один (или больше) из сегментных регистров (fs gf лучше всего) при выходе из защищенного режима не грузить специальный для выхода дескриптор дос сегмента, а взять влепить лимит в 4 гига базовый адрес нуль . но вот ни фига не получается потом символ вписать в экран по абсолютному 32 битному адресу
Добавлено:
все блин нашел ошибку - не указал в проверочной программе USE16,
но все ранво жду и пример и практические советы
нашел тот исходник
http://www.programmersheaven.com/download/1364/download.aspx
тут главное - помнить: 1) ЭТО не работает ни с одной нормальной осью защищенного режима (Вин3х не в счет); 2) ЭТО не дает возможности исполнять сегменты кода более 64 кб; 3) ЭТО не работает с БИОС и пр цивилизованными личностями.
http://www.programmersheaven.com/download/1364/download.aspx
тут главное - помнить: 1) ЭТО не работает ни с одной нормальной осью защищенного режима (Вин3х не в счет); 2) ЭТО не дает возможности исполнять сегменты кода более 64 кб; 3) ЭТО не работает с БИОС и пр цивилизованными личностями.
да и пусть себе не работает. для доса лучше мечтать не очем. чем все эти менеджеры, прерывания с выделением блоков.
Добавлено:
Цитата:
эта чиво значит?
Добавлено:
Цитата:
ЭТО не работает с БИОС и пр цивилизованными личностями.
эта чиво значит?
Другие название этого хака - Flat/Big/Un-Real Mode
еще здесь некоторые тонкости обсуждаются
http://forum.osdev.org/viewtopic.php?f=1&t=24408
http://www.wasm.ru/forum/viewtopic.php?id=41207
http://www.asmcommunity.net/board/index.php?topic=9564.0
а вообще то... есть еще более интересная вещь - SMM - System Management Mode. Но к сожалению, лично мне способ входа туда неизвестен. Ну кроме как взломать БИОС ...
Добавлено:
Цитата:
Это значит, что биос как минимум не сможет обработать кусок более 64 кб, скорее всего, меньше - ведь он не знает что ты ему не DX, a EDX послал... А в худшем случае - он перезагрузит 16-битные сегменты, и плакал твой бигмак... GPF / segment fault / проблемы со стеком...
еще здесь некоторые тонкости обсуждаются
http://forum.osdev.org/viewtopic.php?f=1&t=24408
http://www.wasm.ru/forum/viewtopic.php?id=41207
http://www.asmcommunity.net/board/index.php?topic=9564.0
а вообще то... есть еще более интересная вещь - SMM - System Management Mode. Но к сожалению, лично мне способ входа туда неизвестен. Ну кроме как взломать БИОС ...
Добавлено:
Цитата:
эта чиво значит?
Это значит, что биос как минимум не сможет обработать кусок более 64 кб, скорее всего, меньше - ведь он не знает что ты ему не DX, a EDX послал... А в худшем случае - он перезагрузит 16-битные сегменты, и плакал твой бигмак... GPF / segment fault / проблемы со стеком...
да лана. защищенный буду дальше каварять.
не знаешь хороший туториал на русском для UDMA?
не знаешь хороший туториал на русском для UDMA?
Цитата:
не знаешь хороший туториал на русском для UDMA?
на русском его и нету. есть это
http://t13.org
http://www.wasm.ru/forum/viewtopic.php?id=13010
http://wasm.ru/article.php?article=atazen02
"Когда была изобретена шина PCI, а контроллер IDE был к ней успешно подключен, появилась возможность реализовать режим DMA, используя ресурсы этой шины. Механизм PCIDMA в корне отличается от ISADMA - отсутствует какой бы то ни было контроллер DMA, для того чтобы осуществлять обмен, устройство должно уметь захватывать шину (функция Busmaster) и самостоятельно организовывать обмен с памятью."
короче ковыряй документацию PCI...
да я нашел чета даже с драйвером только не подписано какие порты за что отвечают
а почему в нереальном режиме старый код нормально работает если DS ES изменить? ЭТО работает только когда 0 в регистре или только когда верхняя часть офсета указана?
Это работает до тех пор, пока не поменяется теневой кэш селектора.
да нет, я не это имел ввиду. видимо старый софт никогда не использует верхнюю часть esi edi которые в основном используются для адрессации (на совсем старых процах кажется только через них можно было адрессовать и ebx). просто какая то софтина особенно самодельная может изменить регистр а потом не обнулить и дос посыпится. наверно так.
а LOADALL у тебя примера нет? начал делать, описания толкового нет. слава богу нашел пример, теперь разбираюсь из огромного кода че куда писать
Добавлено:
вот первая прога задает регистры esi edi (под 8 досом, который с встроенным himem.sys в command.com) и выводит их в бинарном виде. вторая прога, не задает их а просто выводит.
Добавлено:
впрочем дос то не развалился от этого.
а LOADALL у тебя примера нет? начал делать, описания толкового нет. слава богу нашел пример, теперь разбираюсь из огромного кода че куда писать
Добавлено:
вот первая прога задает регистры esi edi (под 8 досом, который с встроенным himem.sys в command.com) и выводит их в бинарном виде. вторая прога, не задает их а просто выводит.
Добавлено:
впрочем дос то не развалился от этого.
Люди, что означает спецификатор "=&r*i" в такой конструкции?
Код:
int L_var_out, L_var_aux, ra, rb;
asm volatile(
"mov %0, %2, lsl #16\n"
"mov %1, %3, lsl #16\n"
"qadd %0, %0, %1\n"
"mov %0, %0, asr #16"
: "=&r*i"(L_var_out),
"=&r*i"(L_var_aux)
: "r"(ra),
"r"(rb));
Код:
int L_var_out, L_var_aux, ra, rb;
asm volatile(
"mov %0, %2, lsl #16\n"
"mov %1, %3, lsl #16\n"
"qadd %0, %0, %1\n"
"mov %0, %0, asr #16"
: "=&r*i"(L_var_out),
"=&r*i"(L_var_aux)
: "r"(ra),
"r"(rb));
Цитата:
=&r вроде понятно, это Write-only в регистр "только для записи", а * и i что значат?
"*" пользовляет указывать предпочтения, при выборе операндов(при неудаче первого, выбирается второй метод). "i" указывает операнд как константу, также можно использовать константы указанные через директивы препроцессора.
не приведи господи АРМ учить...
Добавлено:
bomzzz
LOADALL во первых бывает двух видов: LOADALL286 & LOADALL386, во вторых - требует подготовки сразу ВСЕХ регистров, включая GDTR/IDTR? дескрипторов сегментных регистров и их теневые кеши, а в третьих - требует понимания защищенного режима.
Добавлено:
bomzzz
LOADALL во первых бывает двух видов: LOADALL286 & LOADALL386, во вторых - требует подготовки сразу ВСЕХ регистров, включая GDTR/IDTR? дескрипторов сегментных регистров и их теневые кеши, а в третьих - требует понимания защищенного режима.
MERCURY127
;)
;)
я уже разобрался. LOADALL не работает на процессорах старше 386 и некоторых 486. так как оказалось ни на одном процессоре виртуальных машин комманда не поддерживается, так что даже нет смысла пробовать
bomzzz
Зачем вам нереальный режим, мало памяти для реального режима или ненужны привилегии защищенного?
Зачем вам нереальный режим, мало памяти для реального режима или ненужны привилегии защищенного?
да ни зачем пока. для доса все давно написано. просто разобрался как переводить туда сюда, потом нашел про этот loadall хотел его реализовать. теперь похмел пройдет буду с таблицей прерываний ковыряться. можно какую нибудь прогу написать не требующую доса, если понадобится
Добавлено:
чтоб правильно основы понимать работы процессора
Добавлено:
чтоб правильно основы понимать работы процессора
bomzzz, ня http://www.wasm.ru/forum/files/_415294481__loadall.zip
LOADALL286 была легализована, а вот 386 - заменена на другую, уже легальную, команду SYSRET, с тем же опкодом. но совр процы эмулируют LOADALL286 через биос.
на 486+ существует еще относительно легальный и документированный SMM, который перекрывает LOADALL и нереальный режим вместе взятые. Неизвестно, есть ли команда входа в него, но вот команды выхода RSM есть точно http://ivanlef0u.fr/repo/todo/chpie_smm_keysniff_ENG.pdf учите китайский пригодится...
и лучше бы тебе не унреальными режимами интересоваться, а микрокод патчить - сам себе ESMM сможешь сочинить...
Добавлено:
http://www.ixbt.com/cpu/cpu-errata-new.html
LOADALL286 была легализована, а вот 386 - заменена на другую, уже легальную, команду SYSRET, с тем же опкодом. но совр процы эмулируют LOADALL286 через биос.
на 486+ существует еще относительно легальный и документированный SMM, который перекрывает LOADALL и нереальный режим вместе взятые. Неизвестно, есть ли команда входа в него, но вот команды выхода RSM есть точно http://ivanlef0u.fr/repo/todo/chpie_smm_keysniff_ENG.pdf учите китайский пригодится...
и лучше бы тебе не унреальными режимами интересоваться, а микрокод патчить - сам себе ESMM сможешь сочинить...
Добавлено:
http://www.ixbt.com/cpu/cpu-errata-new.html
Зачем для обнуления регистра писать "xor cx, cx", если можно просто "mov cx, 0"? xor быстрее?
A1exSun
Цитата:
Когда-то давным-давно, еще во времена 386/486-х процессоров, xor действительно был быстрее, чем mov. А вот на современных Intel Core/Core 2 или AMD Llano - далеко не факт.
Цитата:
Зачем для обнуления регистра писать "xor cx, cx", если можно просто "mov cx, 0"? xor быстрее?
Когда-то давным-давно, еще во времена 386/486-х процессоров, xor действительно был быстрее, чем mov. А вот на современных Intel Core/Core 2 или AMD Llano - далеко не факт.
да быстрее, и места меньше занимает. к тому же ноль еще из памяти считывается. абсолютная выгода. можно измерять какой код быстрее. реальное выполнение отличается от теоритического из за доступа в память и как уже отмечено на разных процах по разному.
Добавлено:
Цитата:
может не совсем корректно, код оптимизировал. надо наверно по границе выровнять, может еще что то...
Добавлено:
Цитата:
.586
.model flat, stdcall
option casemap :none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
include \masm32\include\masm32.inc
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
includelib \masm32\lib\masm32.lib
.data?
Ticks LONG64 ?
Ticks1 LONG64 ?
CReg dt ?
FString db 21 dup(?)
.code
start:
invoke GetCurrentProcess
invoke SetPriorityClass,eax,REALTIME_PRIORITY_CLASS
invoke GetCurrentThread
invoke SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL
mov ecx, 2
@@:
rdtsc
mov dword ptr [Ticks], eax
mov dword ptr [Ticks+4], edx
push ecx
;===============================================================
;================== Here insert testing code ===================
;===============================================================
;===============================================================
pop ecx
rdtsc
mov dword ptr [Ticks1],eax
mov dword ptr [Ticks1+4],edx
loop @B
invoke GetCurrentThread
invoke SetThreadPriority,eax,THREAD_PRIORITY_NORMAL
invoke GetCurrentProcess
invoke SetPriorityClass,eax,NORMAL_PRIORITY_CLASS
fild Ticks
fild Ticks1
fsubr
fbstp CReg
lea edi,FString+18
lea esi,CReg
mov ecx, 10
@@:
xor eax, eax
lodsb
ror ax,4
shr ah, 4
add ax, 3030h
std
stosw
cld
loop @B
invoke MessageBox,0, addr FString,0,0
invoke ExitProcess,0
end start
может не совсем корректно, код оптимизировал. надо наверно по границе выровнять, может еще что то...
A1exSun
Короче. mov cx, 0 транслируется в 3 байта, xor cx, cx - в два. Хотя вряд ли это сейчас имеет какое-то значение. Не те времена, когда дискеты были большими, а программы маленькими.
Benchmark
Да не, уже на i80386 и та, и другая команда - 2 такта. Тут надо i8086 вспоминать.
Добавлено:
bomzzz
Цитата:
Как и весь прочий код. 0 здесь является частью команды, а не считывается ещё откуда-нибудь.
Короче. mov cx, 0 транслируется в 3 байта, xor cx, cx - в два. Хотя вряд ли это сейчас имеет какое-то значение. Не те времена, когда дискеты были большими, а программы маленькими.
Benchmark
Да не, уже на i80386 и та, и другая команда - 2 такта. Тут надо i8086 вспоминать.
Добавлено:
bomzzz
Цитата:
к тому же ноль еще из памяти считывается.
Как и весь прочий код. 0 здесь является частью команды, а не считывается ещё откуда-нибудь.
эти такты в теории. зависит еще от кучи причин - от использования кеша, который кстати моно в ручную оптимиировать, от доступа в память, от конвейра, от выравнивания к 16 битной границы. чтоб оптимизировать код его надо измерять в ручную
Добавлено:
его все равно надо считать вместе с кодом. даже если он в кеше первого уровня сидит это не тоже самое что в регистре
Добавлено:
его все равно надо считать вместе с кодом. даже если он в кеше первого уровня сидит это не тоже самое что в регистре
xor используется из-за производительности+экономии размера.
В операции mov eax, 0 в любом случае идет чтение из памяти операнда 0(+такая операция занимает в памяти 5 байт), xor eax, eax занимает 2 байта, а так же не читает из памяти операндов, что повышает производительность.
p.s. mov cx, 0 занимает 4 байта, а xor cx, cx 3 байта(обе из-за доп. кода 0x66)
Добавлено:
Цитата:
Является, но все же считывается.
В операции mov eax, 0 в любом случае идет чтение из памяти операнда 0(+такая операция занимает в памяти 5 байт), xor eax, eax занимает 2 байта, а так же не читает из памяти операндов, что повышает производительность.
p.s. mov cx, 0 занимает 4 байта, а xor cx, cx 3 байта(обе из-за доп. кода 0x66)
Добавлено:
Цитата:
Как и весь прочий код. 0 здесь является частью команды, а не считывается ещё откуда-нибудь.
Является, но все же считывается.
ну как не считывается. телепатией передается, чтоб различать mov eax, 0 и mov eax, 1? сичтывается сначала в кеш кода потом процессором оттуда в конвейер
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
Предыдущая тема: .NET GUI компоненты
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.