diff --git a/mips.html.markdown b/mips.html.markdown index 45e16e7b..7f759bec 100644 --- a/mips.html.markdown +++ b/mips.html.markdown @@ -39,28 +39,30 @@ gateways and routers. _float: .float 3.14 # 4 bytes _double: .double 7.0 # 8 bytes - .align 2 # Memory alignment of data, where - # number indicates byte alignment in - # powers of 2. (.align 2 represents - # word alignment since 2^2 = 4 bytes) + .align 2 # Memory alignment of data, where + # number indicates byte alignment + # in powers of 2. (.align 2 + # represents word alignment since + # 2^2 = 4 bytes) -.text # Section that contains instructions - # and program logic +.text # Section that contains + # instructions and program logic .globl _main # Declares an instruction label as # global, making it accessible to # other files - _main: # MIPS programs execute instructions - # sequentially, where the code under - # this label will be executed firsts + _main: # MIPS programs execute + # instructions sequentially, where + # the code under this label will be + # executed first # Let's print "hello world" - la $a0, hello_world # Load address of string stored in - # memory - li $v0, 4 # Load the syscall value (indicating - # type of functionality) - syscall # Perform the specified syscall with - # the given argument ($a0) + la $a0, hello_world # Load address of string stored + # in memory + li $v0, 4 # Load the syscall value (number + # indicating which syscall to make) + syscall # Perform the specified syscall + # with the given argument ($a0) # Registers (used to hold data during program execution) # $t0 - $t9 # Temporary registers used for @@ -79,22 +81,24 @@ gateways and routers. # Types of load/store instructions la $t0, label # Copy the address of a value in - # memory specified by the label into - # register $t0 + # memory specified by the label + # into register $t0 lw $t0, label # Copy a word value from memory lw $t1, 4($s0) # Copy a word value from an address - # stored in a register with an offset - # of 4 bytes (addr + 4) - lb $t2, label # Copy a byte value to the lower order - # portion of the register $t2 + # stored in a register with an + # offset of 4 bytes (addr + 4) + lb $t2, label # Copy a byte value to the + # lower order portion of + # the register $t2 lb $t2, 0($s0) # Copy a byte value from the source # address in $s0 with offset 0 # Same idea with 'lh' for halfwords - sw $t0, label # Store word value into memory address - # mapped by label + sw $t0, label # Store word value into + # memory address mapped by label sw $t0, 8($s0) # Store word value into address - # specified in $s0 and offset of 8 bytes + # specified in $s0 and offset of + # 8 bytes # Same idea using 'sb' and 'sh' for bytes and halfwords. 'sa' does not exist ### Math ### @@ -108,20 +112,22 @@ gateways and routers. mul $t2, $t0, $t1 # $t2 = $t0 * $t1 div $t2, $t0, $t1 # $t2 = $t0 / $t1 (Might not be # supported in some versons of MARS) - div $t0, $t1 # Performs $t0 / $t1. Get the quotient - # using 'mflo' and remainder using 'mfhi' + div $t0, $t1 # Performs $t0 / $t1. Get the + # quotient using 'mflo' and + # remainder using 'mfhi' # Bitwise Shifting sll $t0, $t0, 2 # Bitwise shift to the left with # immediate (constant value) of 2 - sllv $t0, $t1, $t2 # Shift left by a variable amount in - # register + sllv $t0, $t1, $t2 # Shift left by a variable amount + # in register srl $t0, $t0, 5 # Bitwise shift to the right (does - # not sign preserve, sign-extends with 0) - srlv $t0, $t1, $t2 # Shift right by a variable amount in - # a register - sra $t0, $t0, 7 # Bitwise arithmetic shift to the right - # (preserves sign) + # not sign preserve, sign-extends + # with 0) + srlv $t0, $t1, $t2 # Shift right by a variable amount + # in a register + sra $t0, $t0, 7 # Bitwise arithmetic shift to + # the right (preserves sign) srav $t0, $t1, $t2 # Shift right by a variable amount # in a register @@ -146,7 +152,8 @@ gateways and routers. # $t0 == $t1, otherwise # execute the next line bne $t0, $t1, reg_neq # Branches when $t0 != $t1 - b branch_target # Unconditional branch, will always execute + 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 @@ -155,8 +162,9 @@ gateways and routers. 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 result in $s0 (1 for true) + slt $s0, $t0, $t1 # Instruction that sends a signal + # when $t0 < $t1 with result in $s0 + # (1 for true) # Simple if statement # if (i == j) @@ -183,14 +191,14 @@ gateways and routers. # 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) + 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 + 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: @@ -204,9 +212,11 @@ gateways and routers. instruction to continue its execution li $t0, 0 while: - bgt $t0, 10, end_while # While $t0 is less than 10, keep iterating + bgt $t0, 10, end_while # While $t0 is less than 10, + # keep iterating addi $t0, $t0, 1 # Increment the value - j while # Jump back to the beginning of the loop + j while # Jump back to the beginning of + # the loop end_while: # 2D Matrix Traversal @@ -246,7 +256,8 @@ gateways and routers. # How about recursion? # This is a bit more work since we need to make sure we save and restore - # the previous PC in $ra since jal will automatically overwrite on each call + # the previous PC in $ra since jal will automatically overwrite + # on each call li $a0, 3 jal fact