12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- ; Copyright (C) 2016 Jeremiah Orians
- ; This file is part of stage0.
- ;
- ; stage0 is free software: you can redistribute it and/or modify
- ; it under the terms of the GNU General Public License as published by
- ; the Free Software Foundation, either version 3 of the License, or
- ; (at your option) any later version.
- ;
- ; stage0 is distributed in the hope that it will be useful,
- ; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ; GNU General Public License for more details.
- ;
- ; You should have received a copy of the GNU General Public License
- ; along with stage0. If not, see <http://www.gnu.org/licenses/>.
- # We will be using R0 and R1 to pass values to the function
- # R15 will be used as the stack pointer
- :start
- LOADUI R0 @string
- COPY R1 R0
- LOADUI R2 33
- LOADUI R3 44
- LOADUI R4 55
- LOADUI R15 0x600
- CALLI R15 @strcmp
- HALT
- :string
- HALT
- NOP
- ;; Our simple string compare function
- :strcmp
- ;; Preserve registers
- PUSHR R2 R15
- PUSHR R3 R15
- PUSHR R4 R15
- ;; Setup registers
- MOVE R2 R0
- MOVE R3 R1
- LOADUI R4 0
- :cmpbyte
- LOADXU8 R0 R2 R4 ; Get a byte of our first string
- LOADXU8 R1 R3 R4 ; Get a byte of our second string
- ADDUI R4 R4 1 ; Prep for next loop
- CMP R1 R0 R1 ; Compare the bytes
- CMPSKIPI.E R0 0 ; Stop if byte is NULL
- JUMP.E R1 @cmpbyte ; Loop if bytes are equal
- ;; Done
- MOVE R0 R1 ; Prepare for return
- ;; Restore registers
- POPR R4 R15
- POPR R3 R15
- POPR R2 R15
- RET R15
|