usernameak
usernameak
но было
Dmitrij
#abi
2.2.2 The Stack Frame
In addition to registers, each function has a frame on the run-time stack. This stack
grows downwards from high addresses. Table 2.2 shows the stack organization.The end of the input argument area shall be aligned on a 16 (32, if__m256ispassed on stack) byte boundary. In other words, the value(%esp+ 4)is always a multiple of16(32) when control is transferred to the function entry point. The stack pointer,%esp, always points to the end of the latest allocated stack frame.
https://www.uclibc.org/docs/psABI-i386.pdf
R
R
вроде понял
R
s54820
Eugene
Происследовал сейчас на 10-ке.
При возврате из основного потока и из остальных идёт переход на код, который вызывает
push eax
call RtlExitUserThread
s54820
Anonymous
как вернуться из protected mode в real mode
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
а не, можно как то
Aiwan \ (•◡•) / _bot
Официально — ребут. Но был какой-то баг...
Anonymous
официально можно сделать так
Anonymous
щас
Anonymous
cli
mov dx,0x0000
mov cs,dx
mov ds,dx
mov es,dx
mov fs,dx
mov gs,dx
in al,0x70
btr ax,7
out 0x70,al
mov edx,cr0
btr dx,0
mov cr0,edx
jmp far 0x0000:real
real:
jmp short continue
IDT:
db 0xff
dw 0x0000
continue:
lidt fword ptr IDT
Anonymous
и вот дальше не знаю как я даже может быть не правильно прыгнул
Eugene
Да просто младший бит в cr0 сбрось и всё :)
Ну и IDTR вернуть на место надо.
Eugene
А, ну собственно, это уже и сделали :)
cli/sti ещё проставить для надёжности :)
Eugene
Вот любят люди извращаться...
Зачем такие ходы?
jmp far 0x0000:real
real:
jmp short continue
IDT:
db 0xff
dw 0x0000
continue:
lidt fword ptr IDT
когда можно проще:
jmp far 0x0000:real
IDT:
dw 0x3ff
dd 0x0000
real:
lidt fword ptr IDT
???
Eugene
db + dw не забудьте заменить на dw + dd
И не 0xFF, а 0x3FF !!!
Eugene
IDTR хранит 6 байт: слово лимита (1024 байта для ДОСа) и двойное слово базового адреса.
Anonymous
http://www.jbox.dk/sanos/source/sys/osldr/bioscall.asm.html
Anonymous
почему при int 0x10 система зависает по моему правильно настроил IDTR
Anonymous
GUIhandle:
pushad
sgdt fword [storage]
sidt fword [storage+6]
cli
in al,0x70
btr ax,7
out 0x70,al
mov edx,cr0
btr dx,0
mov cr0,edx
jmp far 0x0000:REAL
REAL:
xor dx,dx
mov ds,dx
mov es,dx
mov ss,dx
mov gs,dx
mov dx,0xb800
mov fs,dx
jmp short continue
REAL_IDT:
dw 0xff00
dd 0x00000000
continue:
lidt fword ptr REAL_IDT
mov al,0x11 ; init controler interrupt master slave
out 020h, al
out 0A0h, al
xor al,al ; set offset in IDT hardware descriptor master
out 021h, al
mov al, 0x08 ; ; set offset in IDT hardware descriptor slave
out 0A1h, al
mov al, 00000100b
out 021h, al
mov al, 2
out 0A1h, al
mov al, 00000001b
out 021h, al
out 0A1h, al
sti
in al,0x70
bts ax,7
out 0x70,al
.CallBiosPrint:
mov ah,0x0a
cld
.lp:
lodsb
int 0x10
loop .lp
in al,0x70
btr ax,7
out 0x70,al
cli
lgdt fword ptr storage
lidt fword [storage+6]
mov edx,cr0
bts dx,0
mov cr0,edx
jmp far 0x0008:.Protected
.Protected:
mov dx,0x0010
mov ss,dx
mov ds,dx
mov es,dx
mov gs,dx
mov dx,0x0018
mov fs,dx
mov al,0x11 ; init controler interrupt master slave
out 020h, al
out 0A0h, al
mov al,0x30 ; set offset in IDT hardware descriptor master
out 021h, al
mov al, 0x38 ; ; set offset in IDT hardware descriptor slave
out 0A1h, al
mov al, 00000100b
out 021h, al
mov al, 2
out 0A1h, al
mov al, 00000001b
out 021h, al
out 0A1h, al
in al,0x70
bts ax,7
out 0x70,al
sti
.return:
popad
iretd
Aiwan \ (•◡•) / _bot
какие виды инструкции отсутствуют в celeron'ах?
Anonymous
s54820
GUIhandle:
pushad
sgdt fword [storage]
sidt fword [storage+6]
cli
in al,0x70
btr ax,7
out 0x70,al
mov edx,cr0
btr dx,0
mov cr0,edx
jmp far 0x0000:REAL
REAL:
xor dx,dx
mov ds,dx
mov es,dx
mov ss,dx
mov gs,dx
mov dx,0xb800
mov fs,dx
jmp short continue
REAL_IDT:
dw 0xff00
dd 0x00000000
continue:
lidt fword ptr REAL_IDT
mov al,0x11 ; init controler interrupt master slave
out 020h, al
out 0A0h, al
xor al,al ; set offset in IDT hardware descriptor master
out 021h, al
mov al, 0x08 ; ; set offset in IDT hardware descriptor slave
out 0A1h, al
mov al, 00000100b
out 021h, al
mov al, 2
out 0A1h, al
mov al, 00000001b
out 021h, al
out 0A1h, al
sti
in al,0x70
bts ax,7
out 0x70,al
.CallBiosPrint:
mov ah,0x0a
cld
.lp:
lodsb
int 0x10
loop .lp
in al,0x70
btr ax,7
out 0x70,al
cli
lgdt fword ptr storage
lidt fword [storage+6]
mov edx,cr0
bts dx,0
mov cr0,edx
jmp far 0x0008:.Protected
.Protected:
mov dx,0x0010
mov ss,dx
mov ds,dx
mov es,dx
mov gs,dx
mov dx,0x0018
mov fs,dx
mov al,0x11 ; init controler interrupt master slave
out 020h, al
out 0A0h, al
mov al,0x30 ; set offset in IDT hardware descriptor master
out 021h, al
mov al, 0x38 ; ; set offset in IDT hardware descriptor slave
out 0A1h, al
mov al, 00000100b
out 021h, al
mov al, 2
out 0A1h, al
mov al, 00000001b
out 021h, al
out 0A1h, al
in al,0x70
bts ax,7
out 0x70,al
sti
.return:
popad
iretd
Мне почему-то кажется, что вызывать BIOS, находясь в 32-битном реалмоде — это как-то неправильно. Возможно, стоит сначала загрузить в CS 16-битный дескриптор?
Anonymous
А как? Есть дескрипторы gdt и в real mode?
Anonymous
Это только касается же protected и long
s54820
А как? Есть дескрипторы gdt и в real mode?
В реалмоде при загрузке в сегментный регистр в теневой части обновляется только база, всё остальное остаётся. Поэтому тебе надо в защищённом режиме загрузить в CS 16-битный сегмент, а потом уже убирать флаг в CR0.
Anonymous
я просто думал что когда мы сбрасываем флаг то теневая часть не работает в real mode
Anonymous
а что именно в теневой части работает
Anonymous
только размер инструкции и памяти
Anonymous
и все ?
Anonymous
ага понял
Leon
Leon
А ты ему сам сможешь в рамках одного файла сказать чтобы он сменил режим префиксирования? Я не в курсе совркменных тенденций🙂
Aiwan \ (•◡•) / _bot
а зачем ты полностью путь к инклуд прописываешь? ты ж в родном редакторе работаешь, там можно без полного пути
s54820
Leon
Leon
Eugene
В большинстве известных ассемблеров режим кода задаётся директивами use16, use32, use64, в т.ч. в fasm, nasm, masm/uasm.
Eugene
Так что проблем в этом никаких нет.
Пишешь use32 и eax используется без префиксов, ставишь use16 и компилятор волшебным образом начинает расставлять префиксы :)
Leon
Eugene
В любом.
Всё, что после директивы подразумевает нахождение в этом режиме.
В masm немного сложнее этой всё, но суть та же.
Anonymous
скачай sasm
Anonymous
хорошая ide
Anonymous
могу скинуть бинарник
Anonymous
Hkeyboard:
pushad
sidt fword ptr storage
in al,0x70
bts ax,0x07
out 0x70,al
in al,0x92
btr ax,0x01
out 0x92,al
mov dx,0x0020
mov ds,dx
mov es,dx
mov fs,dx
mov gs,dx
mov ss,dx
jmp far 0x0020:set_RM
RIDTR:
dw 256
dd 0x00000000
set_RM:
mov edx,cr0
and dl,0xfe
mov cr0,edx
jmp far 0x0000:REAL16
use16
REAL16:
xor dx,dx
mov ds,dx
mov es,dx
mov ss,dx
mov fs,dx
mov gs,dx
lidt fword ptr RIDTR
mov ah,0x02
mov ch,byte ptr x
mov cl,byte ptr y
int 0x10
mov ah,0x02
int 0x16
mov ah,0x0a
int 0x10
mov edx,cr0
or dl,0x01
mov cr0,edx
jmp far 0x0008:Protected
use32
Protected:
mov dx,0x010
mov ds,dx
mov es,dx
mov gs,dx
add dx,0x08
mov ss,dx
add dx,0x08
mov fs,dx
mov esp,0x01000000
xor ebp,ebp
lidt fword ptr storage
mov al,0x11
out 0x20,al
out 0xa0,al
mov al,0x30
out 0x21,al
add al,0x08
out 0xa1,al
mov al,0x04
out 0x21,al
mov al,0x02
out 0xa1,al
dec al
out 0x21,al
out 0xa1,al
in al,0x70
btr ax,7
out 0x70,al
call PutChar
.return:
mov al,0x20
out 0x20,al
out 0xa0,al
popad
iretd
Anonymous
перезапускается цп на mov cr0,edx
Anonymous
не знаю почему есть какие то идеи?
Leon
Anonymous
первый
Anonymous
когда из protected в real
usernameak
где можно спросить по программированию под микроконтроллеры, но не на ассемблере?
vector
что вас интересует
Eugene
Для начала...
Не dw 256, а dw 1023
Таблица векторов прерываний имеет размер 256*4=1024 байта!
usernameak
что вас интересует
как заставить position-independent code корректно линковаться на арме
если точнее, то у меня почему-то оно пытается обратиться к глобальным переменным через абсолютный адрес, если они находятся в другом compilation unit
електр🟢нік ✙🟠рчбеч ඞ
Eugene
електр🟢нік ✙🟠рчбеч ඞ
w = 2 bytes
Eugene
Здорово, но это не rw, а dw.
Это величина лимита.
електр🟢нік ✙🟠рчбеч ඞ
стоп, туплю
Eugene
Второй момент: там какое-то маркетание с контроллером прерываний.
Полагаю, что меняется стартовые номера прерываний для IRQ. А обратная процедура есть?
vector
Anonymous
)