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