diff options
| -rw-r--r-- | mips.html.markdown | 66 | 
1 files changed, 65 insertions, 1 deletions
| diff --git a/mips.html.markdown b/mips.html.markdown index dd7bc7b5..418761bf 100644 --- a/mips.html.markdown +++ b/mips.html.markdown @@ -134,4 +134,68 @@ hello_world .asciiz "Hello World\n"         # Declare a null terminated string      xori $t0, $t1, 0xFFF                    # Bitwise XOR with immediate      nor $t0, $t1, $t2                       # Bitwise NOR -```
\ No newline at end of file +## BRANCHING ## +  _branching: +    # The basic format of these branching instructions typically follow <instr> +    # <reg1> <reg2> <label> where label is the label we want to jump to if the +    # given conditional evaluates to true +    # Sometimes it is easier to write the conditional logic backwards, as seen +    # in the simple if statement example below + +    beq $t0, $t1, reg_eq                    # Will branch to reg_eq if +                                            # $t0 == $t1, otherwise +                                            # execute the next line +    bne $t0, $t1, reg_neq                   # Branches when $t0 != $t1 +    b branch_target                         # Unconditional branch, will always execute +    beqz $t0, req_eq_zero                   # Branches when $t0 == 0 +    bnez $t0, req_neq_zero                  # Branches when $t0 != 0 +    bgt $t0, $t1, t0_gt_t1                  # Branches when $t0 > $t1 +    bge $t0, $t1, t0_gte_t1                 # Branches when $t0 >= $t1 +    bgtz $t0, t0_gt0                        # Branches when $t0 > 0 +    blt $t0, $t1, t0_gt_t1                  # Branches when $t0 < $t1 +    ble $t0, $t1, t0_gte_t1                 # Branches when $t0 <= $t1 +    bltz $t0, t0_lt0                        # Branches when $t0 < 0 +    slt $s0, $t0, $t1                       # Instruction that sends a signal when +                                            # $t0 < $t1 with reuslt in $s0 (1 for true) + +    # Simple if statement +    # if (i == j) +    #     f = g + h; +    #  f = f - i; + +    # Let $s0 = f, $s1 = g, $s2 = h, $s3 = i, $s4 = j +    bne $s3, $s4, L1 # if (i !=j) +    add $s0, $s1, $s2 # f = g + h + +    L1: +      sub $s0, $s0, $s3 # f = f - i +     +    # Below is an example of finding the max of 3 numbers +    # A direct translation in Java from MIPS logic: +    # if (a > b) +    #   if (a > c) +    #     max = a; +    #   else +    #     max = c; +    # else +    #     max = b; +    #   else +    #     max = c; + +    # Let $s0 = a, $s1 = b, $s2 = c, $v0 = return register +    ble $s0, $s1, a_LTE_b                   # if (a <= b) branch(a_LTE_b) +    ble $s0, $s2, max_C                     # if (a > b && a <=c) branch(max_C) +    move $v0, $s1                           # else [a > b && a > c] max = a +    j done                                  # Jump to the end of the program + +    a_LTE_b:                                # Label for when a <= b +      ble $s1, $s2, max_C                   # if (a <= b && b <= c) branch(max_C) +      move $v0, $s1                         # if (a <= b && b > c) max = b +      j done                                # Jump to done + +    max_C: +      move $v0, $s2                         # max = c + +    done:                                   # End of program + +``` | 
