.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: