Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: bomzzz
Дата сообщения: 24.12.2011 11:40
че никто не делал? нашел три разных примера в инете, менял версии доса, ставил химем.сис и без него ппробовал, открывал-закрывал вентиль а20, делал на двух виртуальных машинах с разными процессорами и на железе. не работает
Автор: MERCURY127
Дата сообщения: 24.12.2011 11:45
Было дело, и пример рабочий был. Поищу. Только... Не гонялся бы поп за дешевизною... Тебе лишние проблемы нужны?
Автор: akaGM
Дата сообщения: 24.12.2011 11:47
[censored]
Автор: bomzzz
Дата сообщения: 24.12.2011 12:10
MERCURY127
какие проблемы? видимо где то ошибка и я ее не могу найти уже часов 14.
меньше на вход и возврат в защищенный режим потратил. может из за виртуалки может из за доса, может из за кода. может фиг знает из за чего. и так как может быть из за чего угодно ошибку никак не вычислить

Добавлено:
не говоря уж что нигде толком не написано про то как это работает. написано "в скрытой части сегментного регистра чета остается" а че остается так никто и не постарался написать
Автор: MERCURY127
Дата сообщения: 24.12.2011 12:16
Потерпи - с компа зайду - объясню, как оно работает
Автор: bomzzz
Дата сообщения: 24.12.2011 12:23
терплю.

Добавлено:
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,

но все ранво жду и пример и практические советы
Автор: MERCURY127
Дата сообщения: 24.12.2011 14:53
нашел тот исходник
http://www.programmersheaven.com/download/1364/download.aspx
тут главное - помнить: 1) ЭТО не работает ни с одной нормальной осью защищенного режима (Вин3х не в счет); 2) ЭТО не дает возможности исполнять сегменты кода более 64 кб; 3) ЭТО не работает с БИОС и пр цивилизованными личностями.
Автор: bomzzz
Дата сообщения: 24.12.2011 14:57
да и пусть себе не работает. для доса лучше мечтать не очем. чем все эти менеджеры, прерывания с выделением блоков.

Добавлено:

Цитата:
ЭТО не работает с БИОС и пр цивилизованными личностями.

эта чиво значит?
Автор: MERCURY127
Дата сообщения: 24.12.2011 15:14
Другие название этого хака - 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 / проблемы со стеком...
Автор: bomzzz
Дата сообщения: 24.12.2011 15:20
да лана. защищенный буду дальше каварять.
не знаешь хороший туториал на русском для UDMA?
Автор: MERCURY127
Дата сообщения: 24.12.2011 15:31

Цитата:
не знаешь хороший туториал на русском для 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...
Автор: bomzzz
Дата сообщения: 24.12.2011 15:36
да я нашел чета даже с драйвером только не подписано какие порты за что отвечают
Автор: bomzzz
Дата сообщения: 24.12.2011 22:39
а почему в нереальном режиме старый код нормально работает если DS ES изменить? ЭТО работает только когда 0 в регистре или только когда верхняя часть офсета указана?
Автор: MERCURY127
Дата сообщения: 25.12.2011 11:22
Это работает до тех пор, пока не поменяется теневой кэш селектора.
Автор: bomzzz
Дата сообщения: 25.12.2011 11:30
да нет, я не это имел ввиду. видимо старый софт никогда не использует верхнюю часть esi edi которые в основном используются для адрессации (на совсем старых процах кажется только через них можно было адрессовать и ebx). просто какая то софтина особенно самодельная может изменить регистр а потом не обнулить и дос посыпится. наверно так.

а LOADALL у тебя примера нет? начал делать, описания толкового нет. слава богу нашел пример, теперь разбираюсь из огромного кода че куда писать

Добавлено:


вот первая прога задает регистры esi edi (под 8 досом, который с встроенным himem.sys в command.com) и выводит их в бинарном виде. вторая прога, не задает их а просто выводит.

Добавлено:
впрочем дос то не развалился от этого.
Автор: vlary
Дата сообщения: 08.01.2012 18:40
Люди, что означает спецификатор "=&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));
Автор: cp58
Дата сообщения: 09.01.2012 14:47

Цитата:
=&r вроде понятно, это Write-only в регистр "только для записи", а * и i что значат?

"*" пользовляет указывать предпочтения, при выборе операндов(при неудаче первого, выбирается второй метод). "i" указывает операнд как константу, также можно использовать константы указанные через директивы препроцессора.
Автор: MERCURY127
Дата сообщения: 09.01.2012 16:04
не приведи господи АРМ учить...

Добавлено:
bomzzz
LOADALL во первых бывает двух видов: LOADALL286 & LOADALL386, во вторых - требует подготовки сразу ВСЕХ регистров, включая GDTR/IDTR? дескрипторов сегментных регистров и их теневые кеши, а в третьих - требует понимания защищенного режима.
Автор: akaGM
Дата сообщения: 09.01.2012 22:14
MERCURY127
;)
Автор: bomzzz
Дата сообщения: 09.01.2012 22:27
я уже разобрался. LOADALL не работает на процессорах старше 386 и некоторых 486. так как оказалось ни на одном процессоре виртуальных машин комманда не поддерживается, так что даже нет смысла пробовать
Автор: cp58
Дата сообщения: 10.01.2012 00:04
bomzzz
Зачем вам нереальный режим, мало памяти для реального режима или ненужны привилегии защищенного?
Автор: bomzzz
Дата сообщения: 10.01.2012 00:09
да ни зачем пока. для доса все давно написано. просто разобрался как переводить туда сюда, потом нашел про этот loadall хотел его реализовать. теперь похмел пройдет буду с таблицей прерываний ковыряться. можно какую нибудь прогу написать не требующую доса, если понадобится

Добавлено:
чтоб правильно основы понимать работы процессора
Автор: MERCURY127
Дата сообщения: 10.01.2012 17:05
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
Автор: A1exSun
Дата сообщения: 15.01.2012 21:48
Зачем для обнуления регистра писать "xor cx, cx", если можно просто "mov cx, 0"? xor быстрее?
Автор: Benchmark
Дата сообщения: 15.01.2012 22:15
A1exSun

Цитата:
Зачем для обнуления регистра писать "xor cx, cx", если можно просто "mov cx, 0"? xor быстрее?


Когда-то давным-давно, еще во времена 386/486-х процессоров, xor действительно был быстрее, чем mov. А вот на современных Intel Core/Core 2 или AMD Llano - далеко не факт.
Автор: bomzzz
Дата сообщения: 15.01.2012 22:23
да быстрее, и места меньше занимает. к тому же ноль еще из памяти считывается. абсолютная выгода. можно измерять какой код быстрее. реальное выполнение отличается от теоритического из за доступа в память и как уже отмечено на разных процах по разному.



Добавлено:

Цитата:

.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

может не совсем корректно, код оптимизировал. надо наверно по границе выровнять, может еще что то...
Автор: Abs62
Дата сообщения: 15.01.2012 22:26
A1exSun
Короче. mov cx, 0 транслируется в 3 байта, xor cx, cx - в два. Хотя вряд ли это сейчас имеет какое-то значение. Не те времена, когда дискеты были большими, а программы маленькими.

Benchmark
Да не, уже на i80386 и та, и другая команда - 2 такта. Тут надо i8086 вспоминать.

Добавлено:
bomzzz

Цитата:
к тому же ноль еще из памяти считывается.

Как и весь прочий код. 0 здесь является частью команды, а не считывается ещё откуда-нибудь.
Автор: bomzzz
Дата сообщения: 15.01.2012 22:31
эти такты в теории. зависит еще от кучи причин - от использования кеша, который кстати моно в ручную оптимиировать, от доступа в память, от конвейра, от выравнивания к 16 битной границы. чтоб оптимизировать код его надо измерять в ручную

Добавлено:
его все равно надо считать вместе с кодом. даже если он в кеше первого уровня сидит это не тоже самое что в регистре
Автор: cp58
Дата сообщения: 16.01.2012 19:01
xor используется из-за производительности+экономии размера.
В операции mov eax, 0 в любом случае идет чтение из памяти операнда 0(+такая операция занимает в памяти 5 байт), xor eax, eax занимает 2 байта, а так же не читает из памяти операндов, что повышает производительность.
p.s. mov cx, 0 занимает 4 байта, а xor cx, cx 3 байта(обе из-за доп. кода 0x66)

Добавлено:

Цитата:
Как и весь прочий код. 0 здесь является частью команды, а не считывается ещё откуда-нибудь.

Является, но все же считывается.
Автор: bomzzz
Дата сообщения: 16.01.2012 20:44
ну как не считывается. телепатией передается, чтоб различать mov eax, 0 и mov eax, 1? сичтывается сначала в кеш кода потом процессором оттуда в конвейер

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.