ideal
model tiny
p386
codeseg
push 1234
push 0
ret


segment zap para use32 'code'


; ABSOLUTE CALL
mov eax,555555		; 5, 1
call eax		; 2, 5

mov ebx,555555		; 5, 1
call ebx		; 2, 5

; ABSOLUTE JUMP
mov eax,555555		; 5, 1
jmp eax			; 2, 5

push 555555		; 5, 1
ret			; 1, 5



; IMPLEMENTATIONS OF 'NEXT'

;BYTECODE, CODE ARRAY
;--------------------
movzx eax,[byte esi]	; 3, 3
inc esi			; 1, 1  was lodsb; movzx eax,al ;(4,8)
shl eax,5 ; or 6	; 3, 2
jmp eax			; 2, 5
;TOTAL:			; 9,11


;BYTECODE, INDIRECT THREADED
;---------------------------
INSTRTBL EQU DWORD PTR 666666

movzx ebx,[byte esi]	; 3, 3
inc esi			; 1, 1  was lodsb; movzx eax,al ;(4,8)
jmp [INSTRTBL+ebx*4]	; 7, 6
;TOTAL:			;10,10
; or alternatively
xor ebx,ebx		; 2, 1
mov bl,[esi]		; 2, 1
inc esi			; 1, 1 ; instead of lodsb
jmp [INSTRTBL+ebx*4]	; 2, 6
; TOTAL:		 11, 9

;; usage du "ret" pour le threading
;; -> pas de ESP pour la pile !
;; -> débogage aisé, à condition de patcher les instructions de contrôle
;; qui agiraient sur le pointeur de
;;
;_SP en ESI ->
;_IP en ESP -> ret
;_RP en EDI ->
;_IP en mode débug dans EBP -> push $ ; add EBP, 4; jmp [EBP]
;_

;données relatives à la tâche dans GS: ?

push eax
mov 

;INDIRECT-THREADED
;-----------------
lodsd			; 1, 5
jmp [dword eax]		; 2, 5
; TOTAL			  3,10
; alternatively
mov ebx,[esi]		; 2, 1
add esi,4		; 3, 1
jmp [ebx]		; 2, 5
; TOTAL			  7, 7

;DIRECT-THREADED, SP as index
;----------------------------
ret			; 1, 5
;TOTAL:			  1, 5

;DIRECT-THREADED, SI as index
;----------------------------
lodsd			; 1, 5
jmp eax			; 2, 5
;TOTAL:			  3,10
;alternatively:
;...
add esi,4		; 3, 1
jmp [dword esi]		; 2, 5
;TOTAL:			  5, 6 ; Beware: ++esi instead of esi++
;alternatively:
push [dword esi]	; 2, 4
add esi,4		; 3, 1
ret			; 1, 5
;TOTAL:			; 6,10
;alternatively:

;DIRECT-THREADED, SI as index, 64KB asm code segment
;---------------------------------------------------
lodsw			; 2, 5
jmp ax			; 3, 5
;TOTAL:			  5,10
;alternatively:
add esi,2		; 3, 1 ; or inc esi; inc esi 2, 2
jmp [word esi]		; 3, 5

push [word esi]		; 3, 4
add esi,2		; 3, 1	; or inc esi;inc esi (2,2)
ret			; 1, 5  ;
;TOTAL:			; 7,10 	; or 6,11

ends

end
