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