34 lines
		
	
	
	
		
			500 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
	
		
			500 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#
 | 
						|
! Declare segments (the order is important).
 | 
						|
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
 | 
						|
.sect .text
 | 
						|
 | 
						|
#define EINVAL 22
 | 
						|
 | 
						|
! Perform a Linux system call.
 | 
						|
 | 
						|
.define __syscall
 | 
						|
__syscall:
 | 
						|
	lw r2, 0(sp)        ! syscall number
 | 
						|
	addiu r2, r2, 4000  ! MIPS uses non-standard numbers
 | 
						|
	lw r4, 4(sp)
 | 
						|
	lw r5, 8(sp)
 | 
						|
	lw r6, 12(sp)
 | 
						|
	syscall 0
 | 
						|
 | 
						|
	beq r7, zero, exit  ! branch on success
 | 
						|
	nop
 | 
						|
 | 
						|
	/* The result (in r2) is the errno. */
 | 
						|
	lui at, ha16[_errno]
 | 
						|
	sw r2, lo16[_errno] (at)
 | 
						|
	li r2, -1
 | 
						|
exit:
 | 
						|
	jr ra
 | 
						|
	nop
 | 
						|
 |