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