75

Oui, certes, je crois que je vais devoir m'y faire grin

Bon, je reviens à ma question initiale :


Et euh... y a-t-il un moyen pour copier du code dans la pile ? En fait, en asm, je rassemble les pointeurs de libcall/syscall dont j'ai besoin dans la pile, et je les fait précéder à tout hasard de $4EF9 embarrassed

Ca ressemble à ça :
pile améliorée
\RegTable:						; WARNING: will fail using functions > lib@00FF (should use word sized offsets)
	moveq.l	#0,d0
\RegLoop:
	move.b	(a1)+,d0
	bne.s	\Continue
		tst.b	(a1)
		bne.s	\Continue			; End of table: dc.b 0,0
			rts
\Continue:
	pea	(a4)
	RAMC	RAM_kernel::LibsPtr
	addq.l	#4,sp
	moveq.l	#0,d0					; PreOS bug: LibsPtr destroys d0
	move.b	(a2)+,d0
	move.w	#$4EF9,0(a6,d0.w)
	move.l	a0,2(a6,d0.w)
	bra.s	\RegLoop

avec les offsets qui vont bien pour obtenir les numéros des libcall/syscall et l'offset de leur pointeur dans la pile :
superbes tables
ButillibCallsTable:
    dc.b    BUTILLIB_InitCmdLine
    dc.b    BUTILLIB_GetCurrentArgPtr
    dc.b    BUTILLIB_GetNextArgPtr
    dc.b    BUTILLIB_IsArgSwitch
    dc.b    BUTILLIB_IsNextArg
    dc.b    BUTILLIB_GetFilePtr
    dc.b    BUTILLIB_CheckFileType
    dc.b    BUTILLIB_ExecSwitchRoutine
    dc.b    BUTILLIB_SkipDummyLines
    dc.b    BUTILLIB_SkipSpaces
    dc.b    BUTILLIB_SkipLine
    dc.b    BUTILLIB_GetFileHandle
    dc.b    BUTILLIB_GetPrevArgPtr
    dc.b    BUTILLIB_AdvanceToChar
    dc.b    0,0
ButillibCallsOffsets:
    dc.b    INIT_CMDLINE
    dc.b    GET_CURRENT_ARG_PTR
    dc.b    GET_NEXT_ARG_PTR
    dc.b    IS_ARG_SWITCH
    dc.b    IS_NEXT_ARG
    dc.b    GET_FILE_PTR
    dc.b    CHECK_FILE_TYPE
    dc.b    EXEC_SWITCH_ROUTINE
    dc.b    SKIP_DUMMY_LINES
    dc.b    SKIP_SPACES
    dc.b    SKIP_LINE
    dc.b    GET_FILE_HANDLE
    dc.b    GET_PREV_ARG_PTR
    dc.b    ADVANCE_TO_CHAR

PedroMCallsTable:
    dc.b    PEDROM_stdin
    dc.b    PEDROM_printf
    dc.b    PEDROM_fprintf
    dc.b    0,0
PedroMCallsOffsets:
    dc.b    STDERR
    dc.b    PRINTF
    dc.b    FPRINTF

Comme ça avec des appels en jsr non-relogés (et a6 pointeur de stack frame permanent) :
juuuuummmmmmp
		lea	CMDLINE(a6),a0				; Get CMDLINE*
		jsr	GET_NEXT_ARG_PTR(a6)			; Skip current arg
		lea	CMDLINE(a6),a0				; Get CMDLINE*
		jsr	IS_ARG_SWITCH(a6)			; Check if the arg is an switch

Vala, ça me fait tout ce que je veux sans m'embêter. On saute dans la pile et ça rebondit vers la bonne fonction de dll ou de pedrom.

Mais... comment on fait ça en C ? grin


En fait, ce que je ne sais pas faire, c'est enregistrer dans une table les offsets dans une structure (mon stack frame est une structure déclarée extern).
Si j'ai ça : typedef struct machin {int a; short b; void (*bidule)();} machin;, comment connaitre l'offset de bidule pour l'enregistrer dans un tableau ? Ca correspond au label ButillibCallsOffsets.