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

» Assembler

Автор: AlekXL
Дата сообщения: 11.07.2014 02:44

Цитата:
конечно "глобальны". и после их изменения в защищенном режиме не будут работать все потоки

Что значит: не будут работать? Что значит: все потоки? Во всей системе что ли? lol
Автор: bomzzz
Дата сообщения: 11.07.2014 08:18
причем тут система если молотком по процессору стукнуть
Автор: MERCURY127
Дата сообщения: 11.07.2014 10:33

Цитата:
Что значит: не будут работать? Что значит: все потоки? Во всей системе что ли? lol

регистры CRx/DRx/TRx/MSR являются такими же глобальными, как и все прочие регистры процессора (или ядра, если проц многоядерный). просто они не переключаются при смене контекста, тк являются управляющими регистрами всего процессора, и их назначение мало документировано. это значит, что изменение этих регистров (если оно вообще удаться, тк нужен доступ в нулевое кольцо) приведет к изменению работы всего процессора, безотносительно контекстов и прочей многопоточной белиберды, например, переключит режим трансляции страниц. если это сделать неаккуратно, без предварительной подготовки всего и вся, включая всевозможные устройства, то процессор просто моментально выдаст кучу ошибок и резетнётся. но если вы четко знаете, что делаете, какие биты и в каком порядке менять, то конечно, вперед
Автор: bomzzz
Дата сообщения: 11.07.2014 11:28
почему мало документировано? сейчас ссылку поищу где объясняется как систему написать 32 битную и значение всех регистров объясняется
Автор: MERCURY127
Дата сообщения: 11.07.2014 11:42
этих систем игрушечных любителями опупенсорса понаписано несчетное количество... из них только одна вышла в мейнстрим... и то только потому, что маркетинговые отделы крупных корпораций увидели возможность сэкономить на математике еще больше, чем на винде в сравнении с изначально монопольной UNIX...
Автор: bomzzz
Дата сообщения: 11.07.2014 11:49
там нечего описывать в великом множестве. все действия строго очерчены железом процессора.

Добавлено:
http://sasm.narod.ru/docs/pm/pm_in/main.htm
Автор: MERCURY127
Дата сообщения: 11.07.2014 12:39

Цитата:
все действия строго очерчены железом процессора.
производители матерщинных плат и периферии смотрят на вас с недоумением...

а статья хороша! жаль только, каждая страница заканчивается "зависнет/зависнет/зависнет"... может быть, потому что забыли написать обработчики прерываний? ну там, контроллеры всякие никчемные...
Автор: bomzzz
Дата сообщения: 11.07.2014 13:12
статья отличная. на практике все понятнее. жалко он ее не дописывает.
Автор: AlekXL
Дата сообщения: 12.07.2014 04:28
MERCURY127


Цитата:
просто они не переключаются при смене контекста, тк являются управляющими регистрами всего процессора, и их назначение мало документировано


отладочные регистры включены в структуру-контекст потока. Они видны в Ring3.
Их можно установить в Ring3, посредством SetThreadContext


Спрошу еще раз, и прошу, лишь бы что не говорите: действительно ли они глобальны, или Win меняет их при переключении? Потому что, насколько я знаю, отладочные регистры уникальны в контексте процесса(но не потока).
Автор: ne_viens
Дата сообщения: 12.07.2014 12:38
В контексте потока они уникальны, в другом потоке их значения могут быть уже другими.
Это видно в примере [more].686
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
main BYTE "In main", 0
thread BYTE "In thread", 0
fmat BYTE "New Dr0 value = 0x%X", 0
buf BYTE 40h dup(?)

.code
ASSUME fs:NOTHING
;---------------------------------------------------
handler proc C, pExcept, pFrame, pContext, pDispatch
    mov ecx, pContext
    mov eax, [ecx].CONTEXT.iDr0
    mov [ecx].CONTEXT.regEax, eax
    mov edx, [ecx].CONTEXT.regEdx
    mov [ecx].CONTEXT.iDr0, edx
    add [ecx].CONTEXT.regEip, 2
    xor eax, eax
    ret
handler endp

;---------------------------------------------------
setDr0 proc, newVal
    push OFFSET handler
    push fs:[0]
    mov fs:[0], esp
    mov edx, newVal
    ud2
    pop fs:[0]
    add esp, 4
    ret
setDr0 endp

;---------------------------------------------------
threadProc proc, arg0
    invoke setDr0, 777h
    invoke wsprintf, OFFSET buf, OFFSET fmat, eax
    invoke MessageBoxA, 0, OFFSET buf, OFFSET thread, 0
    ret
threadProc endp

;---------------------------------------------------
start:
    invoke setDr0, 666h
    invoke CreateThread, 0, 0, OFFSET threadProc, 0, 0, 0
    invoke WaitForSingleObject, eax, INFINITE
    invoke setDr0, 0
    invoke wsprintf, OFFSET buf, OFFSET fmat, eax
    invoke MessageBoxA, 0, OFFSET buf, OFFSET main, 0
    invoke ExitProcess, 0
END start
[/more].
Автор: AlekXL
Дата сообщения: 12.07.2014 16:15

Цитата:
В контексте потока они уникальны, в другом потоке их значения могут быть уже другими.
Это видно в примере Подробнее....

да, похоже. [у меня в студии 2013 почему-то после модификации асма корректно не перекомпилится, приходится Rebuild вызывать]

А из этого контекста как-то можно выцепить lastBranchFromIP? В 64-разрядном случае все просто, но вот в случае WOW...
--
А вообще как в масме объявить external на С функцию с сигнатурой
void* __stdcall myfn(int my, char* mys);
??
то есть для связывания статического?
Автор: ne_viens
Дата сообщения: 13.07.2014 15:25
.686
.model flat,stdcall
option casemap:none
includelib someCLib.lib ;void* __stdcall myfn(int my, char* mys); is here

myfn PROTO :DWORD, :DWORD

.code
start:
    invoke myfn, 5, ADDR start
    ret
END start
Автор: AlekXL
Дата сообщения: 13.07.2014 22:12
да, примерно так я и понял:

Код:
myfn PROTO STDCALL :DWORD, :DWORD
Автор: ne_viens
Дата сообщения: 16.07.2014 15:50
Что-то у меня не получается из этих регистров ненулевые значения достать.
Не в 32 битах не в 64. Не на уровне приложения не драйвера.
Даже в FDBG, в котором это всё зародилось, только одни нули.
На Win7 64bit с всеми обновлениями такое.

CS в 64 битном режиме не используется. И в 32 битном от него толку мало, так как память не сегментная- линейный адрес равен виртуальному.
Автор: AlekXL
Дата сообщения: 19.07.2014 16:40

Цитата:
Что-то у меня не получается из этих регистров ненулевые значения достать.

Про какие регистры речь? Сегментные селекторы? Ты пробовал получить сегментный дескриптор? Что в нем? Ладно, база может быть нулевой, но размер-то ни разу не может..



Цитата:
Не в 32 битах не в 64. Не на уровне приложения не драйвера.
Даже в FDBG, в котором это всё зародилось, только одни нули.
На Win7 64bit с всеми обновлениями такое.
CS в 64 битном режиме не используется. И в 32 битном от него толку мало, так как память не сегментная- линейный адрес равен виртуальному.

ну уж у FS, который используется для SEH, стопудово не равен вирт. адрес линейному. Да и насчет CS есть сомнения.


Цитата:
CS в 64 битном режиме не используется
то есть совсем? Там есть сегментные регистры и сегментная виртуализация памяти, или нет??

Цитата:
И в 32 битном от него толку мало, так как память не сегментная
как не сегментная? Я не помню про ring0, но уж в ring3 память всегда сегментная, просто особенность реализации Win, что SS,DS,CS имеют одну базу..
Автор: ne_viens
Дата сообщения: 19.07.2014 17:49
В LastBranchFromIP, LastBranchТоIP, итд нули.

В 32 битах cs всегда равен 0x23, a в 64- 0х33
Ну ладно, есть сегментация... с одним сегментом
Из ml64 даже убрали инструкции чтения и записи регистров cs,ds,es,ss.

Кстати, где-то видел, что из 32бит кода можно вызвать 64битный с jmp 33h:xxxxxxxx
Автор: AlekXL
Дата сообщения: 20.07.2014 12:42

Цитата:
В LastBranchFromIP, LastBranchТоIP, итд нули.

еще бы. в DebugCtl MSR нужно установить флажок.
И на каждый процессор повесить. То бишь, в цикле менять affinity своего драйвера, похоже, и потом писать в этот регистр..


Цитата:
В 32 битах cs всегда равен 0x23, a в 64- 0х33

это селектор. А есть дескриптор селектора, меня он интересует. Достается из нулевого кольца, Неужели не в теме?
вот, накурил

http://msdn.microsoft.com/en-us/library/windows/desktop/ms679363%28v=vs.85%29.aspx
Автор: bomzzz
Дата сообщения: 20.07.2014 18:53
зачем все это? их все равно поменять нельзя и смысла не имеет и значения что в них записано
Автор: MERCURY127
Дата сообщения: 20.07.2014 21:18
Ищу OPTLINK для ДОС последней версии, или самой лучшей на ваше усмотрение... уже не надо, прикрутил HDPMI к 8.0.13.

поковырялся маленько с MZ заглушками для PE/LE/NE файлов, хотел выяснить, насколько маленькими они могут быть. выяснил, что до 64 байт полнофункциональный STUB можно ужать http://sderni.ru/236908
можно и до 32 байт сделать, голый MZ заголовок, выводящий системную мессагу ДОС о нехватке памяти, но зато его моя Win7 x64 не поняла...
Автор: AlekXL
Дата сообщения: 21.07.2014 12:22

Цитата:
зачем все это? их все равно поменять нельзя и смысла не имеет и значения что в них записано
полистай назад, поймешь.
Автор: lormutryas
Дата сообщения: 26.07.2014 01:59
извините
Автор: bomzzz
Дата сообщения: 28.07.2014 12:35
насколько я помню все началось с потоков, а раз есть потоки значит есть система и скорее всего эта система винда
Автор: MERCURY127
Дата сообщения: 07.09.2014 20:18
пара непонятных вопросов

1) какой бывает максимальный размер XBDA aka EBDA? пытаюсь перетащить ее в нижний сегмент, но проги либо бастуют, либо все виснет. сама XBDA заявлена по адресу 9D80:0, т.е откусывает от 640 кб 10 кб, но первый байт равен 06, т.е указывает размер 6 кб... понятно, конечно, что глупо требовать от IvyBridge соблюдения допотопных стандартов, но все же, интересно...

2) компилирую исходник на асме для дос, с указанием создать .map с номерами строк, эпизодически возникает ситуация:

Код: 1353 0000:0A0D 1354 0000:0A0E 1356 0000:0A11 1357 0000:0A15
1359 0000:0A1B 1360 0000:0A20 1361 0000:0A22 1362 0000:0A26
1363 0000:0A29 1365 0000:0A2B 1368 0000:0A30 1369 1363 0000: 1370 0000:0A36 1371 0000:0A38 1372 0000:0A3A 1373 0000:0A3D
1374 0000:0A40 1375 0000:0A44 1376 0000:0A46 1377 0000:0A48
1378 0000:0A49 1379 0000:0A4C 1380 0000:0A4F 1381 0000:0A51
Автор: akaGM
Дата сообщения: 08.09.2014 00:00
MERCURY127

Цитата:
пара непонятных вопросов
у меня тоже непонятный вопрос, один...

а что это ты делаешь? :)
Автор: MERCURY127
Дата сообщения: 08.09.2014 15:05
дурью я маюсь, что ж еще... интересно мне дос ковырять. все давно препарировано и изучено, включил - и готово, не то что современные неповоротливые монстры...

разные ассемблерные исходники (толстые), разные компиляторы, разные линкеры, одна ошибка... почему? вот пример:
http://sderni.ru/241945

не в железе ведь проблема, в самом деле? типа ошибки Пентиум FDIV...
Автор: ne_viens
Дата сообщения: 08.09.2014 17:24
У меня с "C:\temp\asm16>ml /Cx /omf /Fm /Zm /Zi ems40.asm /link /map:full /line /noe /cparam:1" нормальный мап получается. Правда, "MASM : fatal error A1021: cannot find cvpack.exe" выдаёт.
Автор: MERCURY127
Дата сообщения: 08.09.2014 17:55
так мне охота не МС линкером собирать... он не дает возможность управлять размером mz заголовка.

Добавлено:
D:\MLCL>link /nologo /noi /map /line /warn /cparm:1 /align:32 ems40;
LINK : warning L4014: /ALIGNMENT : option ignored for MS-DOS executable file


Добавлено:
а, я понял! это глюк оптлинка. надо написать им. интересно, каков шанс, что исправят...
Автор: MihaNix
Дата сообщения: 10.09.2014 00:32
Начну с начала:
Имеется мать на чипсете i815 под пень 3й
Имеются USB входы.
Нет возможности загрузки с USB - просто тупо BIOS не поддерживает.
Альтернативные прошивки искал не нашел.
Хотелось бы самостоятельно реализовать данный функционал.

Подскажите как на асме будет выглядеть прога для нахождения
и опроса USB портов и если присутствует на нем флэш или HDD...
Грузиться с них хочу.
Автор: YuriyRR
Дата сообщения: 10.09.2014 00:45
MihaNix
Куда ты свою программу опроса USB помещать будешь? в БИОС?
Автор: bomzzz
Дата сообщения: 10.09.2014 00:56
опрос отновительно не очень сложно делается, а вот юсб драйвер ты не сделаешь. альтернативные драйвера есть это PLoP и GRUB. спроси сдеся.
http://forum.ru-board.com/topic.cgi?forum=5&bm=1&topic=32855&start=8940#lt
PLoP выполнен в виде модуля биоса, его можно засунуть в биос материнки или как у меня сделано в флеш память сетевой карты.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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