80 lines
1.3 KiB
ArmAsm
80 lines
1.3 KiB
ArmAsm
.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:
|