Reverse Engineering for Beginners

(avery) #1

CHAPTER 47. STRINGS TRIMMING CHAPTER 47. STRINGS TRIMMING


; jump to exit if loaded byte is zero:
beqz $a0, exit
; decrement str_len:
addiu $v1, -1 ; branch delay slot
loc_6C:
; at this moment, $a0=loaded byte, $a2=0xD (CR symbol) and $a3=0xA (LF symbol)
; loaded byte is CR? jump to loc_7C then:
beq $a0, $a2, loc_7C
addiu $v0, -1 ; branch delay slot
; loaded byte is LF? jump to exit if its not LF':
bne $a0, $a3, exit
or $at, $zero ; branch delay slot, NOP
loc_7C:
; loaded byte is CR at this moment
; jump to loc_5c (loop body begin) if str_len (in $v0) is not zero:
bnez $v0, loc_5C
; simultaneously, store zero at that place in memory:
sb $zero, 0($a1) ; branch delay slot
; "exit" label was named by me manually:
exit:
lw $ra, 0x20+saved_RA($sp)
move $v0, $s0
lw $s0, 0x20+saved_S0($sp)
jr $ra
addiu $sp, 0x20 ; branch delay slot


Registers prefixed with S- are also called “saved temporaries”, so $S0 value is saved in the local stack and restored upon
finish.

Free download pdf