Vladimir
ни одна нормальная операционка не работает с диском через биос
Anonymous
Через контроллер внешних прерываний?
Vladimir
при чём тут прерывания?
Anonymous
Через порты ввода вывода
Vladimir
да
Vladimir
ну и через DMA
Vladimir
PCI
Anonymous
in/out которые
Anonymous
Пины
Anonymous
Да
Vladimir
современное железо часто замапливается в обычное пространство памяти, нежели в пространство портов
Vladimir
порты - это выдумка Intel ) ARM, MIPS и т.д используют исключительно MMIO
Yura
Vladimir
Vladimir
а как к Local APIC обращаешься?
Vladimir
по сути то же MMIO-устройство, только встроенное в проц
Yura
а как к Local APIC обращаешься?
я честно говоря только в реальном режиме писал на лабах... Асм мне очень понравился, асм вставки иногда в с++ делаю. где кстати удобнее всего в винде ассемблерить?
Anonymous
Anonymous
Кароче. Через биос все сильно проще
Anonymous
Капитально проще
Yura
Vladimir
Капитально проще
тут всё в производительность упирается. BIOS не предназначена для высокопроизводительного ввода/вывода. Весь ввод/вывод - синхронный, нереентерабельна и т.п.
Anonymous
А если не через биос - прощайте стандарты
Anonymous
Как работать с тем же видеобуфером, переключать режимы - хз
Vladimir
стандарт BIOS фактически похоронили ещё с приходом Windows.
Anonymous
Но идея то была отличная
Биос и прерывания это как хело ворлд. Кое что можно сделать но все это дичайше устарело
Vladimir
Есть там зачатки асинхронности (int 15h), но развития оно не получило.
Чтобы делать актуальные вещи на пустом месте, придётся прочитать кучу книг...
Anonymous
Anonymous
С каждым устройством свои приколы походу
Вроде ин аут тоже есть, насчёт мимо не помню
Можно почитать коды ядра Линукс 0.01
Vladimir
Которым надо здесь и сейчас с максимальными попугаями и с минимальными трудозатратами на разработку
Там есть загрузчик boot.s сразу с переходом на защищённый
Agent
Можно научиться читать ассемблер и понимать? Голова не взорвётся?
oles
можно даже научиться читать опкоды и понимать
oles
зависит от желания
Anonymous
я с пекарней общаюсь по губам
Aiwan \ (•◡•) / _bot
format PE64 console 5.0
include 'win64wx.inc'
.code
start:
fastcall testarg,1,2,3,4
invoke ExitProcess,0
;---------------------------------
proc testarg v1,v2,v3,v4
mov [rbp+0x10],rcx ;сохраняем в теневую часть стека
mov [rbp+0x18],rdx
mov [rbp+0x20],r8
mov [rbp+0x28],r9
xor rcx,rcx ;что-то делаем с регистрами
xor rdx,rdx
xor r8,r8
xor r9,r9
mov rax,[rbp+0x10] ;используем переданные параметры
add rax,[rbp+0x18]
add rax,[rbp+0x20]
add rax,[rbp+0x28]
ret
endp
.end start
можно ли как нибудь обращаться к параметрам которые сохранены в теневой части по метке типа v1,...,v4. а то через [rbp+0x10] не совсем наглядно и понятно?
Aiwan \ (•◡•) / _bot
((
Anonymous
Я нуб, сам знаешь
Anonymous
Но, держу кулаки
Aiwan \ (•◡•) / _bot
...или тогда fastcall теряет преимущество перед stdcall?
s54820
format PE64 console 5.0
include 'win64wx.inc'
.code
start:
fastcall testarg,1,2,3,4
invoke ExitProcess,0
;---------------------------------
proc testarg v1,v2,v3,v4
mov [rbp+0x10],rcx ;сохраняем в теневую часть стека
mov [rbp+0x18],rdx
mov [rbp+0x20],r8
mov [rbp+0x28],r9
xor rcx,rcx ;что-то делаем с регистрами
xor rdx,rdx
xor r8,r8
xor r9,r9
mov rax,[rbp+0x10] ;используем переданные параметры
add rax,[rbp+0x18]
add rax,[rbp+0x20]
add rax,[rbp+0x28]
ret
endp
.end start
можно ли как нибудь обращаться к параметрам которые сохранены в теневой части по метке типа v1,...,v4. а то через [rbp+0x10] не совсем наглядно и понятно?
mov rax,[v1] чем не устраивает?
Aiwan \ (•◡•) / _bot
кажись уже туплю, видимо не правильно писал когда так пробовал
Ask
только вроде при фасткале засейвить надо сначала параметры
Aiwan \ (•◡•) / _bot
;сохраняем в теневую часть стека
Ask
а ну да ) mov [v1],rcx ...
Aiwan \ (•◡•) / _bot
значит по скорости наверное лучше всетаки использовать stdcall если приходится сохранять в фасте параметры в стек
Viktor
Aiwan \ (•◡•) / _bot
v1,...,v4
Aiwan \ (•◡•) / _bot
proc testarg v1,v2,v3,v4
mov [v1],rcx ;сохраняем в теневую часть стека
mov [v2],rdx
mov [v3],r8
mov [v4],r9
xor rcx,rcx ;что-то делаем с регистрами
xor rdx,rdx
xor r8,r8
xor r9,r9
mov rax,[v1] ;используем переданные параметры
add rax,[v2]
add rax,[v3]
add rax,[v4]
ret
endp
Aiwan \ (•◡•) / _bot
преписал вот так
Viktor
Какое-то странное у MS соглашение о вызовах
Ask
это фасткал, ну от борланда да отличается )
Viktor
Зачем сохранять аргументы в shadow space?
Ask
чтоб регистры юзать
Viktor
Viktor
Хм, из Вики:
For example, a function taking 5 integer arguments will take the first to fourth in registers, and the fifth will be pushed on the top of the shadow space. So when the called function is entered, the stack will be composed of (in ascending order) the return address, followed by the shadow space (32 bytes) followed by the fifth parameter.
Там не наоборот? (shadow space, return address, 5th arg)
Aiwan \ (•◡•) / _bot
На 64 битах они все одинаковые, не?
я так понимаю для винды точно так, эт чтоб вызов системных и своих функций были по одному соглашению, а не плодить cdecl, stdcall, pascal
Aiwan \ (•◡•) / _bot
Viktor
Viktor
А, бля, ascending order
Viktor
Теперь понял
Viktor
Все у вас на Винде не как у людей
електр🟢нік ✙🟠рчбеч ඞ
Ask
нормально все на венде)
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
и стек вот такой после копирования 4х параметров в теневую часть
Viktor
Так, а нахуй оно нужно-то, кроме как для дебаггинга?
Aiwan \ (•◡•) / _bot
что именно?
Viktor
Сохранять параметры из регистров в теневую зону
Ask
чтоб регистры по своему юзать не ?
Aiwan \ (•◡•) / _bot
я в своей функции вызывал системные функции, а она мне там что то портила, поэтому надо было сохранить изначальные параметры туда где они и должны лежать