PDA

Просмотр полной версии : Вызов по адресу в HL



Dr.Potapov
12.10.2015, 17:44
Что то я запутался.
Есть значение в HL, фактически адрес. Как сделать вызов подпрограммы по этому адресу?
Спасибо ))

shurik-ua
12.10.2015, 17:51
m0
jp (hl)

my_prog
...
call m0
...

Kakos_nonos
12.10.2015, 17:59
push aa
jp (hl)
aa:

char
12.10.2015, 18:24
call #006f ;)

Dr.Potapov
12.10.2015, 19:13
ух, через какое черезжопие удалось решить... пришлось городить таблицу вызовов ))



;-- user app for test
org #8000

jr startapp
;-- table of need drivers
ttydev db "prscr"
;--

;-- table of core call's
sysc db #cd,0,0
ret
ttyadr db #cd,0,0
ret
;--

startapp
ld d,h
ld e,l
ld hl,sysc
inc hl
ld (hl),e
inc hl
ld (hl),d

ld hl,ttydev
call sysc

ld d,h
ld e,l
ld hl,ttyadr
inc hl
ld (hl),e
inc hl
ld (hl),d


ret

;-- end user app

SAM style
12.10.2015, 19:39
ух, через какое черезжопие удалось решить... пришлось городить таблицу вызовов ))Ой вэй... Чем вариант shurik-ua не устраивает? Сам им пользуюсь.


ttydev:
db "prscr"
startapp:
ld de,ttydev
call callHL ; пусть в HL вернёт нужный адрес (который у тебя ложится в ttyadr+1)
callHL:
jp (hl)И если уж на то пошло...
startapp
ld d,h
ld e,l
ld hl,sysc
inc hl
ld (hl),e
inc hl
ld (hl),dСокращается до
ld (sysc+1),hl

shurik-ua
12.10.2015, 19:50
ух,
зачем было спрашивать, непонятно - неоднократно наблюдаю, человек задаёт вопрос - получает всеобъемлющие варианты ответов - и всё равно делает по своему. (причём выходит как правило лютый *****код)

Dr.Potapov
12.10.2015, 20:04
Ой вэй... Чем вариант shurik-ua не устраивает? Сам им пользуюсь.

Он то как раз на мысль и навел ) спасибо ему.

Дело в том что у меня адрес вызова неопределен изначально (в hl нужные данные только один раз, на старте приложения). За остальными адресами надо слазить в таблицу драйверов. Пользовательская прикладуха ведь на старте только и имеет что в HL адрес подпрограммы которая отдает в HL же адреса нужных драйверов. То есть методом jp (hl) я могу определить только адрес системной функции отдающей адреса драйверов. А потом все, куку. А представьте что приложению нужно обратиться к 2,3,5 драйверам? )

В моем примере я запомнил адрес системной функции и некоего драйвера prscr, который могу вызывать теперь постоянно напрямую из ядра с любыми параметрами. Работает. Шурик помог ) ну или я не вкуриваю всей стройности jp (hl). (((

---------- Post added at 20:04 ---------- Previous post was at 19:57 ----------


зачем было спрашивать, непонятно - неоднократно наблюдаю, человек задаёт вопрос - получает всеобъемлющие варианты ответов - и всё равно делает по своему. (причём выходит как правило лютый *****код)

Да я пока ждал ответ на*****кодил наспех, лишь бы работало.
Все равно не вкуриваю как без таблицы вызовов запомнить в приложении адреса нескольких разных драйверов ((

shurik-ua
12.10.2015, 20:10
я так понял у тебя при входе в user_app должны вызваться несколько драйверов, причём адреса могут меняться от приложения к приложению ?

Dr.Potapov
12.10.2015, 20:16
я так понял у тебя при входе в user_app должны вызваться несколько драйверов
Верно. Произвольное количество. Какому то приложению достаточно tty типа hello world :-), какому то нужен и tty и клавиатура, какому то еще какие то.


причём адреса могут меняться от приложения к приложению ?
Скорее от ядра к ядру (какое то собрано с AY, какое то с мышкой и так далее). По моей задумке, user_app вообще ничего о ядре не знает изначально и запрашивает адрес нужного ему для работы драйвера непосредственно при своей инициализации.

shurik-ua
12.10.2015, 20:29
user_app
push continue_app
ld b,4 ;number of drivers
ld hl,table_end
loop
dec hl
ld d,(hl)
dec hl
ld e,(hl)
push de
djnz loop
ret

table
dw driver1
dw driver2
dw driver3
dw driver4
table_end

continue_app
...



ROP CHAIN style )

Dr.Potapov
12.10.2015, 20:51
ROP CHAIN style )
Меня пока от обычного мутит, даже без возвратного ))) Я мало того что не писал на асме лет 20 уже, так еще и не программист ни разу.

shurik-ua
12.10.2015, 20:58
так еще и не программист ни разу.
и сразу ОСь пишешь )

Dr.Potapov
12.10.2015, 21:02
и сразу ОСь пишешь )
все идут одним и тем же путем - сначала ОСь, потом что по силам )