1 / 9

Recitation Material of Engineering an Assembler

Learn how to load, recognize, and assemble instructions using an assembler in this comprehensive engineering material.

Download Presentation

Recitation Material of Engineering an Assembler

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Recitation Material of Engineering an Assembler June 11, 2013

  2. Step 1. Program Load • Make sure where the code will be loaded, so that the corresponding address is correct. • In modern assembler, address is determined when source file is loaded ~~~

  3. 0x00400018 0x00000003 [00400024] 23bdfff8  addi $sp, $sp, -8 [00400028] afbf0000  sw $ra, 0($sp) [0040002c] 34020001  ori $v0, $0, 1; 16: li $v0, 1 # 0! = 1 [00400030] 10800006  beq $a0, $0, 24 [zero-0x00400030][00400034] afa40004  sw $a0, 4($sp) [0040003c] 0c100009  jal 0x00400024 [factorial] [00400040] 8fa40004  lw $a0, 4($sp) [00400044] 70821002  mul $v0, $a0, $v0 [00400048] 8fbf0000  lw $ra, 0($sp) [0040004c] 23bd0008  addi $sp, $sp, 8 [00400050] 03e00008  jr $ra [00400054] 23bdfffc  addi $sp, $sp, -4     [main: Entry]    [00400058] afbf0000  sw $ra, 0($sp) [0040005c] 3c011001  lui $at, 4097 [prompt]; 39: la $a0, prompt [00400060] 34240000  ori $a0, $at, 0 [prompt] [00400064] 34020004  ori $v0, $0, 4; 40: li $v0, 4 [00400068] 0000000c  syscall [0040006c] 34020005  ori $v0, $0, 5; 43: li $v0, 5 [00400070] 0000000c  syscall [00400074] 00022021  addu $a0, $0, $v0 [00400078] 0c100009  jal 0x00400024 [factorial]; [0040007c] 00022021  addu $a0, $0, $v0 [00400080] 34020001  ori $a0, $0, 1; 50: li $v0, 1 [00400084] 0000000c  syscall [00400088] 3c011001  lui $at, 4097 [endl]; 53: la $a0, endl [0040008c] 3424001f  ori $a0, $1, 31 [endl] [00400090] 34020004  ori $v0, $0, 4; 54: li $v0, 4 [00400094] 0000000c  syscall [00400098] 34020000  ori $at, $0, 0; 57: li $v0, 0 # Return zero. [0040009c] 8fbf0000  lw $ra, 0($sp) [004000a0] 23bd0004  addi $sp, $sp, 4[004000a4] 03e00008  jr $ra; 61: jr $ra 0x0040007c 0x00000002 0x00400040 0x00000001 0x00400040 0x00400040 0x7ffffdfc $sp step 33

  4. Step 2. Instruction Table • Take addi $sp, $sp, -8 for example Addi is rt imm rs 8 00100000 00000000 00000000 000000000 Which is 0x 20 00 00 00

  5. Step 3. Register Table (optional) • For example, the table could be an array, which is in format: $sp, $a0, $v0, $ra, $t1, $t2, $t3 • Then you can use a lookup-table function, the return value is offset or index of the corresponding value of the register name(Notice the value is in array format).

  6. Lookup –Register Function # the lookup_vartable_func need to be called multiple times lookup_vartable_func: add $sp, $sp -4 # push v1 first sw $v1, 0($sp) add $sp, $sp, -4 # push a0 second sw $a0, 0($sp) add $sp, $sp, -4 # push a1 third sw $a1, 0($sp) add $sp, $sp, -4 # push t7 fourth sw $t7, 0($sp) add $sp, $sp, -4 # push t8 fifth sw $t8, 0($sp) add $sp, $sp, -4 # push s3 sixth sw $s3, 0($sp) add $sp, $sp, -4 # push s3 sw $s4, 0($sp) # now we begin to compare variable with parameter buffer # this_prepare_variable: # set up reference key for variable table li $v0, 0 li $a0, 0 # offset pointer in parameter buffer li $a1, 0 # set matching flag = 0 li $t8, 0x2c # t8 = comma or , li $t7, 0x28 # t7 = left parenthesis or ( lb $v1, parameter_buffer($a0) li $s4, 0 lb $s3, value_buffer($s4)

  7. Lookup –Register Function (Cont. ) this_finish_all_keys: add $v0, $v0, 1 beqz $a1, this_return_match_var li $v0, 0 this_return_match_var: lw $s4, 0($sp) add $sp, $sp, 4 lw $s3, 0($sp) add $sp, $sp, 4 lw $t8, 0($sp) add $sp, $sp, 4 lw $t7, 0($sp) add $sp, $sp, 4 lw $a1, 0($sp) add $sp, $sp, 4 lw $a0, 0($sp) add $sp, $sp, 4 lw $v1, 0($sp) jr $ra this_not_set_cur_flag: add $a0, $a0, 1 add $s4, $s4, 1 lb $s3, value_buffer($s4) lb $v1, parameter_buffer($a0) j this_lookup_variable_table this_finish_compare_one: add $v0, $v0, 1 beqz $a1, this_return_match_var li $s4, 0 add $a0, $a0, 1 lb $s3, value_buffer($s4) lb $v1, parameter_buffer($a0) # reset a1 to be 0 to prepare next comparison li $a1, 0 j this_lookup_variable_table

  8. Step 4. Recognize Token and Assemble Instructions • Shift bit according to recognized opcode say value of $rs is loaded using: lw $t3, register_value_table($s0) sll $t3, $t3, 21 • Say your addiopcode is loaded into $t1 now we assemble them, say: add $t2, $t1, $t3

  9. Step 5. Output instructions • Simply create an output buffer and sequentially copy each instruction first • Copy 0xffffffff ffffffff to separate .text segment and .data segment • Copy all data into .data segment

More Related