1 .code16
2 .globl code16_start
3 .globl code16_end
4
5CS_SEG = 0xf
6
7code16_start:
8
9 .globl code16_func1
10
11
12code16_func1 = . - code16_start
13 mov $1, %eax
14 data32 lret
15
16
17 .globl code16_func2
18code16_func2 = . - code16_start
19 xor %eax, %eax
20 mov $0x12345678, %ebx
21 movl %esp, %ecx
22 push %bx
23 subl %esp, %ecx
24 pop %ax
25 data32 lret
26
27
28 .globl code16_func3
29code16_func3 = . - code16_start
30 jmp 1f
31 nop
321:
33 mov $4, %eax
34 mov $0x12345678, %ebx
35 xor %bx, %bx
36 jz 2f
37 add $2, %ax
382:
39
40 call myfunc
41
42 lcall $CS_SEG, $(myfunc2 - code16_start)
43
44 ljmp $CS_SEG, $(myjmp1 - code16_start)
45myjmp1_next:
46
47 cs lcall *myfunc2_addr - code16_start
48
49 cs ljmp *myjmp2_addr - code16_start
50myjmp2_next:
51
52 data32 lret
53
54myfunc2_addr:
55 .short myfunc2 - code16_start
56 .short CS_SEG
57
58myjmp2_addr:
59 .short myjmp2 - code16_start
60 .short CS_SEG
61
62myjmp1:
63 add $8, %ax
64 jmp myjmp1_next
65
66myjmp2:
67 add $16, %ax
68 jmp myjmp2_next
69
70myfunc:
71 add $1, %ax
72 ret
73
74myfunc2:
75 add $4, %ax
76 lret
77
78
79code16_end:
80