<<------------------------->>
<< so we assemble our file >>
<<------------------------->>
james@server:~/0x10c-build> cat kcall.dasm16
; random stuff here
SET J, 7
ADD I, 3
SET A, 0x1000
SET B, 0x1001
SET C, 0x1002
SET PUSH, 0x1004
SET PUSH, 0x1005
SET PUSH, 0x1006
; do a kernel call
.CALL _stubapi_malloc
; more user code
SET [A+0], 0x1
SET [A+1], 0x2
SET [A+2], 0x3
SET [A+3], 0x4
SET [A+4], 0x5
SET [A+5], 0x6
SET [A+6], 0x7
SET [A+7], 0x8
james@server:~/0x10c-build> dtasm/dtasm -o kcall.dobj16 kcall.dasm16
warning: expressions will not be adjusted at link or relocation time. ensure labels are not used as part of expressions.
<<------------------------------------------->>
<< now we have a policy that uses stack-call >>
<<------------------------------------------->>
james@server:~/0x10c-build> cat policy
defaults
{
kernel=/home/james/0x10c-build/kernel/stubsys.dkrn16
symbols=/home/james/0x10c-build/kernel/stubsys.dsym16
direct=false
# use pure stack calling conventioncat
interrupt-call=stack-call
# interrupt call mappings
interrupt-call(_stubapi_malloc)=0x4001
interrupt-call(_stubapi_free)=0x4002
interrupt-call(_stubapi_errno)=0x4003
interrupt-call(_stubapi_exit)=0x4004
interrupt-size(_stubapi_malloc)=6
interrupt-size(_stubapi_free)=1
interrupt-size(_stubapi_errno)=0
interrupt-size(_stubapi_exit)=1
}
format(image):
offset 0x1000
chain image-direct
format(image-direct):
write code
<<--------------------------->>
<< and this is the result... >>
<<--------------------------->>
james@server:~/0x10c-build> dtld/dtld -p policy -o kcall.dcpu16 kcall.dobj16
linker: saved 10 words during optimization.
james@server:~/0x10c-build> DISPLAY= dtdb/dtdb kcall.dcpu16 -c "disasm 0x0 0x30"
Created VM.
Loaded 0x002D words from kcall.dcpu16.
Flashed memory.
0x0000 (0xA0E1): >>> SET J, 0x0007
0x0001 (0x90C2): ADD I, 0x0003
0x0002 (0x7C01): SET A, 0x1000
0x0004 (0x7C21): SET B, 0x1001
0x0006 (0x7C41): SET C, 0x1002
0x0008 (0x7F01): SET PUSH, 0x1004
0x000A (0x7F01): SET PUSH, 0x1005
0x000C (0x7F01): SET PUSH, 0x1006
0x000E (0x0301): SET PUSH, A
0x000F (0x0701): SET PUSH, B
0x0010 (0x0B01): SET PUSH, C
0x0011 (0x6B01): SET PUSH, [SP+0xFFFA]
0x0013 (0x6B01): SET PUSH, [SP+0xFFFA]
0x0015 (0x6B01): SET PUSH, [SP+0xFFFA]
0x0017 (0x7D00): INT [A], 0x4001
0x0019 (0x6401): SET A, [SP]
0x001A (0x7F62): ADD SP, 0x0009
0x001C (0x8A01): SET [A+0x0000], 0x0001
0x001E (0x8E01): SET [A+0x0001], 0x0002
0x0020 (0x9201): SET [A+0x0002], 0x0003
0x0022 (0x9601): SET [A+0x0003], 0x0004
0x0024 (0x9A01): SET [A+0x0004], 0x0005
0x0026 (0x9E01): SET [A+0x0005], 0x0006
0x0028 (0xA201): SET [A+0x0006], 0x0007
0x002A (0xA601): SET [A+0x0007], 0x0008
<<---------------------------------------------------->>
<< let's change the policy to a register call instead >>
<<---------------------------------------------------->>
james@server:~/0x10c-build> vi policy
james@server:~/0x10c-build> cat policy
defaults
{
kernel=/home/james/0x10c-build/kernel/stubsys.dkrn16
symbols=/home/james/0x10c-build/kernel/stubsys.dsym16
direct=false
# use pure stack calling convention
interrupt-call=register-call
# interrupt call mappings
interrupt-call(_stubapi_malloc)=0x4001
interrupt-call(_stubapi_free)=0x4002
interrupt-call(_stubapi_errno)=0x4003
interrupt-call(_stubapi_exit)=0x4004
interrupt-size(_stubapi_malloc)=6
interrupt-size(_stubapi_free)=1
interrupt-size(_stubapi_errno)=0
interrupt-size(_stubapi_exit)=1
}
format(image):
offset 0x1000
chain image-direct
format(image-direct):
write code
<<----------------------------------------------------->>
<< now **WITHOUT RE-ASSEMBLING**, let's see the result >>
<<----------------------------------------------------->>
james@server:~/0x10c-build> dtld/dtld -p policy -o kcall.dcpu16 kcall.dobj16
linker: saved 10 words during optimization.
james@server:~/0x10c-build> DISPLAY= dtdb/dtdb kcall.dcpu16 -c "disasm 0x0 0x30"
Created VM.
Loaded 0x0024 words from kcall.dcpu16.
Flashed memory.
0x0000 (0xA0E1): >>> SET J, 0x0007
0x0001 (0x90C2): ADD I, 0x0003
0x0002 (0x7C01): SET A, 0x1000
0x0004 (0x7C21): SET B, 0x1001
0x0006 (0x7C41): SET C, 0x1002
0x0008 (0x7F01): SET PUSH, 0x1004
0x000A (0x7F01): SET PUSH, 0x1005
0x000C (0x7F01): SET PUSH, 0x1006
0x000E (0x7D00): INT [A], 0x4001
0x0010 (0x6401): SET A, [SP]
0x0011 (0x7F62): ADD SP, 0x0003
0x0013 (0x8A01): SET [A+0x0000], 0x0001
0x0015 (0x8E01): SET [A+0x0001], 0x0002
0x0017 (0x9201): SET [A+0x0002], 0x0003
0x0019 (0x9601): SET [A+0x0003], 0x0004
0x001B (0x9A01): SET [A+0x0004], 0x0005
0x001D (0x9E01): SET [A+0x0005], 0x0006
0x001F (0xA201): SET [A+0x0006], 0x0007
0x0021 (0xA601): SET [A+0x0007], 0x0008
<<------------------------------------------>>
<< verdict: linker policies == fucking cool >>
<<------------------------------------------>>