usernameak
Это где такое требование?
не помню в каком CC
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
вроде понял
Eugene
в энтрипоинте у нас запушен адрес возврата?
В винде нет, насколько я знаю (а вот в потоках вроде да). В линуксе запушены параметры, переменные окружения и ещё что-то там, т.е. считай, что нет
Eugene
А в винде бывает код без потоков?
Отдельный потолок когда создаёшь.
s54820
В винде нет, насколько я знаю (а вот в потоках вроде да). В линуксе запушены параметры, переменные окружения и ещё что-то там, т.е. считай, что нет
Нет, в винде есть BaseProcessStart/BaseThreadStart, которые вызывают entrypoint или ThreadProc, а в при возврате в них — ExitProcess/ExitThread соответственно. Поэтому адрес возврата в стеке точно есть.
Eugene
Происследовал сейчас на 10-ке. При возврате из основного потока и из остальных идёт переход на код, который вызывает push eax call RtlExitUserThread
Anonymous
как вернуться из protected mode в real mode
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'ах?
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
s54820
я просто думал что когда мы сбрасываем флаг то теневая часть не работает в real mode
Она работает, и это позволяет делать всякие https://ru.wikipedia.org/wiki/Unreal_mode
Anonymous
а что именно в теневой части работает
Anonymous
только размер инструкции и памяти
Anonymous
и все ?
Eugene
а что именно в теневой части работает
Лимит. Можно установить лимит на 2 Гб и обращаться к 2 Гб памяти через 32-битные регистры.
Anonymous
ага понял
s54820
Только db 66h не забываем где нужно
Насколько древним должен быть ассемблер, чтобы он не умел сам расставлять префиксы?
Leon
А ты ему сам сможешь в рамках одного файла сказать чтобы он сменил режим префиксирования? Я не в курсе совркменных тенденций🙂
Aiwan \ (•◡•) / _bot
фасм это круто
а зачем ты полностью путь к инклуд прописываешь? ты ж в родном редакторе работаешь, там можно без полного пути
Eugene
А ты ему сам сможешь в рамках одного файла сказать чтобы он сменил режим префиксирования? Я не в курсе совркменных тенденций🙂
Не надо ничего ему говорить. Напишешь mov ax,[bx], не будет префиксов. Напишешь mov eax,[ebx], будет 2 префикса. Он сам поймёт, раз используются E-регистры.
Leon
Не надо ничего ему говорить. Напишешь mov ax,[bx], не будет префиксов. Напишешь mov eax,[ebx], будет 2 префикса. Он сам поймёт, раз используются E-регистры.
Проблема в том что в 16 и 32 битном режимах влияние префиксов противоположно. Режим задается флагом в теневой части CS. При работе в нереальном режиме до перехода в него, во время и после надо учитывать именнто то какой флаг в этой теневой части в каждый момент времени и как твой код будет восприниматься и как соответчвенно db66h на это повлияет.
Leon
Не надо ничего ему говорить. Напишешь mov ax,[bx], не будет префиксов. Напишешь mov eax,[ebx], будет 2 префикса. Он сам поймёт, раз используются E-регистры.
В обыычном32 битном режиме твой MOV будет без флагов и проц будет все делать в 32 битах а опкод идентичен 16 битному муву в 16 битном режиме
Eugene
В большинстве известных ассемблеров режим кода задаётся директивами use16, use32, use64, в т.ч. в fasm, nasm, masm/uasm.
Eugene
Так что проблем в этом никаких нет. Пишешь use32 и eax используется без префиксов, ставишь use16 и компилятор волшебным образом начинает расставлять префиксы :)
Eugene
В любом. Всё, что после директивы подразумевает нахождение в этом режиме. В masm немного сложнее этой всё, но суть та же.
R
а зачем ты полностью путь к инклуд прописываешь? ты ж в родном редакторе работаешь, там можно без полного пути
иде фасма глючная, говорит не найден и все нах, приходится полный путь писать. Переменную среды INCLUDE и конфиг игнорит
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
перезапускается цп на mov cr0,edx
Чисто для теста попробу eax
Eugene
перезапускается цп на mov cr0,edx
Какое именно? У тебя их там 2 шт.
Anonymous
первый
Anonymous
когда из protected в real
usernameak
где можно спросить по программированию под микроконтроллеры, но не на ассемблере?
vector
что вас интересует
Eugene
когда из protected в real
А точка старта вообще где?
Eugene
Для начала... Не dw 256, а dw 1023 Таблица векторов прерываний имеет размер 256*4=1024 байта!
usernameak
что вас интересует
как заставить position-independent code корректно линковаться на арме если точнее, то у меня почему-то оно пытается обратиться к глобальным переменным через абсолютный адрес, если они находятся в другом compilation unit
Eugene
електр🟢нік ✙🟠рчбеч ඞ
w = 2 bytes
Eugene
Здорово, но это не rw, а dw. Это величина лимита.
електр🟢нік ✙🟠рчбеч ඞ
стоп, туплю
Eugene
Второй момент: там какое-то маркетание с контроллером прерываний. Полагаю, что меняется стартовые номера прерываний для IRQ. А обратная процедура есть?
R
скачай sasm
о спс не знал о таком
Anonymous
)