Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Как передать управление на код в другом сегменте


Автор: Merlin27 26.10.2006, 10:26
Считываю .com-файл в память и хочу его запустить из ядра ОС.
call far 2000h:100h
jmp far 2000h:100h

Выводят ошибку Illegal immediate. Че делать?

ЗЫ. Ядро у меня в 1000h:100h, пытаюсь соответственно оттуда передать управление процессу.

Подозревая что я чегото в синтаксисе намудрил или что? из загрузчика ведь перехожу на ядро командой call     far 01000h:0100h. Ничче не понимаю. smile 
 Может это изза того что в загрузчике IDEAL а в ядре нет?

Автор: Merlin27 26.10.2006, 11:53
Такс, как передать управление разобрался
Код

    mov ax,2000h
    mov bx,100h
    push ax
    push bx
    mov ds,ax
    mov es,ax
    retf


А вот как вернуться обратно?  smile 

Автор: anwe 26.10.2006, 12:21
Предварительно сохрани свои ds и es и в конце своей программки напиши тот же код, что ты и написал, только на сохраненный адрес.

Автор: Merlin27 26.10.2006, 18:12
А как узнать адрес той команды куда должно вернуться управление? Я не знаю что задать как смещение в сегменте кода, чтобы вернуться в запускающую программу (после окончания работы запускаемой).

Автор: anwe 26.10.2006, 19:22
Если запускаемую программу пишешь ты, до добавь в нее функцию, параметры которой будут браться из запускающей программы и вызови ее перед концом вызываемой. А параметры - необходимый адрес возврата.
Если не твоя - отдельный разговор, совсем другое дело.

Автор: dumb 26.10.2006, 21:09
либо так:
Код

; вызываемая процедура должна просто сделать retf
; ...
    push es ; сохраняем сеги
    push ds
    push cs ; на стек адрес для возврата из процы
    push offset ret_point
;
    mov ax,2000h
    mov bx,100h
    push ax
    push bx
    mov ds,ax
    mov es,ax
    retf
;
ret_point:
    pop ds
    pop es


либо так:
Код

procofs dw 100h
procseg dw 2000h
;...
    call dword ptr procofs
;...


Автор: BNPmaster 26.10.2006, 21:58
Бывает же такое...
Я вот сам зашёл сюда чтобы это спросить.
И тоже пишу учебную ОС для института,
и загрузчик нам тот же дали для первой лабы, и ядро по тому же адресу
располагается 1000:100h.
Я НЕ ШУЧУ!!!!

Ну я вроде уже разобрался как это сделать.
Предположим функция располагается по адресу 0h:1100h,
тогда

xor ax,ax
mov es,ax

mov es:[3102h],ax
mov ax,1100h
mov es:[3100h],ax
mov bx,3100h
call [dword ptr es:[bx]]

Если планируется обращаться всегда по одному и тому же адресу,
то можно и как в этом загрузчике. Если не нравится режим IDEAL,
то его можно включать только для компиляции этой строки.
К примеру

.CODE
ассемблерный текст
................................
IDEAL
call far ptr 0h:1100h
MASM            ;включение режима MASM
...........................

для возврата из подпрограммы -  retf

Автор: Merlin27 27.10.2006, 16:04
Цитата

Если запускаемую программу пишешь ты, до добавь в нее функцию, параметры которой будут браться из запускающей программы и вызови ее перед концом вызываемой. А параметры - необходимый адрес возврата.
Если не твоя - отдельный разговор, совсем другое дело.

Понял раза с 5го smile Конечно я о том же думал, я не знал как найти адрес точки возврата.

Цитата

    push offset ret_point

ВОТ ОНО! А я млин не додумался offset дописать.

dumb,  ты крут. 2 классных примера ;)


BNPmaster, ты написал почти тоже самое что dumb... Про переключение режима не знал - прикольно smile. Вот мне только интересно как ты свободно лазиишь в нулевом сегменте... там же вроде данные BIOS'a. 

Оффтоп: BNPmaster, а ты из какого города? В каком ВУЗе? Этот загрузчик у нас был в методичке... а выдран он из инета. На codenet.ru есть пример оси GlukOS. Вот оттуда и содрана наша методичка smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)