1 | .code16
|
---|
2 | .globl code16_start
|
---|
3 | .globl code16_end
|
---|
4 |
|
---|
5 | CS_SEG = 0xf
|
---|
6 |
|
---|
7 | code16_start:
|
---|
8 |
|
---|
9 | .globl code16_func1
|
---|
10 |
|
---|
11 | /* basic test */
|
---|
12 | code16_func1 = . - code16_start
|
---|
13 | mov $1, %eax
|
---|
14 | data32 lret
|
---|
15 |
|
---|
16 | /* test push/pop in 16 bit mode */
|
---|
17 | .globl code16_func2
|
---|
18 | code16_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 | /* test various jmp opcodes */
|
---|
28 | .globl code16_func3
|
---|
29 | code16_func3 = . - code16_start
|
---|
30 | jmp 1f
|
---|
31 | nop
|
---|
32 | 1:
|
---|
33 | mov $4, %eax
|
---|
34 | mov $0x12345678, %ebx
|
---|
35 | xor %bx, %bx
|
---|
36 | jz 2f
|
---|
37 | add $2, %ax
|
---|
38 | 2:
|
---|
39 |
|
---|
40 | call myfunc
|
---|
41 |
|
---|
42 | lcall $CS_SEG, $(myfunc2 - code16_start)
|
---|
43 |
|
---|
44 | ljmp $CS_SEG, $(myjmp1 - code16_start)
|
---|
45 | myjmp1_next:
|
---|
46 |
|
---|
47 | cs lcall myfunc2_addr - code16_start
|
---|
48 |
|
---|
49 | cs ljmp myjmp2_addr - code16_start
|
---|
50 | myjmp2_next:
|
---|
51 |
|
---|
52 | data32 lret
|
---|
53 |
|
---|
54 | myfunc2_addr:
|
---|
55 | .short myfunc2 - code16_start
|
---|
56 | .short CS_SEG
|
---|
57 |
|
---|
58 | myjmp2_addr:
|
---|
59 | .short myjmp2 - code16_start
|
---|
60 | .short CS_SEG
|
---|
61 |
|
---|
62 | myjmp1:
|
---|
63 | add $8, %ax
|
---|
64 | jmp myjmp1_next
|
---|
65 |
|
---|
66 | myjmp2:
|
---|
67 | add $16, %ax
|
---|
68 | jmp myjmp2_next
|
---|
69 |
|
---|
70 | myfunc:
|
---|
71 | add $1, %ax
|
---|
72 | ret
|
---|
73 |
|
---|
74 | myfunc2:
|
---|
75 | add $4, %ax
|
---|
76 | lret
|
---|
77 |
|
---|
78 |
|
---|
79 | code16_end:
|
---|