summaryrefslogtreecommitdiff
blob: 816c24b96f476187f978b95e76c5b679478d8815 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
        .code16
        .globl code16_start
        .globl code16_end

CS_SEG = 0xf

code16_start:

        .globl code16_func1

        /* basic test */
code16_func1 = . - code16_start
        mov $1, %eax
        data32 lret

/* test push/pop in 16 bit mode */
        .globl code16_func2
code16_func2 = . - code16_start
        xor %eax, %eax
        mov $0x12345678, %ebx
        movl %esp, %ecx
        push %bx
        subl %esp, %ecx
        pop %ax
        data32 lret

/* test various jmp opcodes */
        .globl code16_func3
code16_func3 = . - code16_start
        jmp 1f
        nop
1:
        mov $4, %eax
        mov $0x12345678, %ebx
        xor %bx, %bx
        jz 2f
        add $2, %ax
2:

        call myfunc

        lcall $CS_SEG, $(myfunc2 - code16_start)

        ljmp $CS_SEG, $(myjmp1 - code16_start)
myjmp1_next:

        cs lcall *myfunc2_addr - code16_start

        cs ljmp *myjmp2_addr - code16_start
myjmp2_next:

        data32 lret

myfunc2_addr:
        .short myfunc2 - code16_start
        .short CS_SEG

myjmp2_addr:
        .short myjmp2 - code16_start
        .short CS_SEG

myjmp1:
        add $8, %ax
        jmp myjmp1_next

myjmp2:
        add $16, %ax
        jmp myjmp2_next

myfunc:
        add $1, %ax
        ret

myfunc2:
        add $4, %ax
        lret


code16_end: