diff options
| -rwxr-xr-x | assemble.go | 48 | ||||
| -rwxr-xr-x | qdma.go | 2 | ||||
| -rwxr-xr-x | symbol.go | 8 | ||||
| -rwxr-xr-x | test6.bin | bin | 246 -> 0 bytes | |||
| -rwxr-xr-x | tests/fibtest.asm | 70 | ||||
| -rwxr-xr-x | tests/fibtest.bin | bin | 0 -> 364 bytes | |||
| -rwxr-xr-x | tests/test5.bin | bin | 56 -> 140 bytes | |||
| -rwxr-xr-x | tests/test6.asm (renamed from test6.asm) | 0 | ||||
| -rwxr-xr-x | tests/test6.bin | bin | 0 -> 246 bytes | |||
| -rwxr-xr-x | tests/test7.asm | 43 | ||||
| -rwxr-xr-x | tests/test7.bin | bin | 0 -> 306 bytes |
11 files changed, 167 insertions, 4 deletions
diff --git a/assemble.go b/assemble.go index e3bb2e5..923fb33 100755 --- a/assemble.go +++ b/assemble.go @@ -36,6 +36,7 @@ var Instructions = map[string]struct { "srl": {true, 2}, "lw": {false, 35}, "sw": {false, 43}, + "lui": {false, 15}, "slt": {true, 42}, "slti": {false, 10}, "sltiu": {false, 11}, @@ -106,8 +107,14 @@ func Encode(inst []string, pc int32) ([]byte, error) { 16) | (RegNums[inst[1]] << 11) | function.opcode } else if function.opcode == 2 || function.opcode == 3 { label, _ := labels[inst[1]] - addr := label.pos + SectionPos[label.section] + addr := label.pos + SectionStart[label.section] ret = (function.opcode << 26) | uint32(addr&0x03FFFFFF) + } else if function.opcode == 15 { + imm, err := strconv.Atoi(inst[2]) + if err != nil { + return nil, err + } + ret = (function.opcode << 26) | (RegNums[inst[1]] << 16) | uint32(imm) } else if function.opcode == 35 || function.opcode == 43 { immReg, err := regexp.Compile("^[0-9]+") if err != nil { @@ -125,11 +132,40 @@ func Encode(inst []string, pc int32) ([]byte, error) { reg := regReg.FindString(inst[2]) ret = (function.opcode << 26) | (RegNums[reg] << 21) | (RegNums[inst[1]] << 16) | (0xFFFF & uint32(imm)) + } else if inst[0] == "la" { + bytes64 := make([]byte, 8) + label, isLabel := labels[inst[2]] + addr := int32(label.pos + SectionStart[label.section]) + if !isLabel { + err := fmt.Errorf("Unknown label: %s\n", inst[2]) + return nil, err + } + lui, err := Parse(fmt.Sprintf("lui %s, %d", inst[1], (addr >> 8))) + if err != nil { + return nil, err + } + ori, err := Parse(fmt.Sprintf("ori %s, %s, %d", inst[1], inst[1], + addr&0xFFFF)) + if err != nil { + return nil, err + } + b1, err := Encode(lui, pc) + if err != nil { + return nil, err + } + b2, err := Encode(ori, pc) + if err != nil { + return nil, err + } + copy(bytes64[:4], b1) + copy(bytes64[4:], b2) + return bytes64, nil } else { label, isLabel := labels[inst[3]] - addr := int32(label.pos + SectionPos[label.section]) + addr := int32(label.pos + SectionStart[label.section]) if isLabel { - imm = int16(addr - pc - 12) + imm = int16(addr - pc - 8) + fmt.Println(inst[3], label.pos, SectionStart[label.section], imm, pc) } else { i, err := strconv.Atoi(inst[3]) if err != nil { @@ -140,6 +176,7 @@ func Encode(inst []string, pc int32) ([]byte, error) { ret = (function.opcode << 26) | (RegNums[inst[2]] << 21) | (RegNums[inst[1]] << 16) | (0xFFFF & uint32(imm)) } + fmt.Println(inst) binary.NativeEndian.PutUint32(bytes, ret) return bytes, nil } @@ -159,6 +196,7 @@ func Assemble(path string, out *os.File) { continue } else if s == ".data" || s == ".rodata" || s == ".bss" { isText = false + i -= 4 continue } else if s == ".text" { isText = true @@ -166,6 +204,7 @@ func Assemble(path string, out *os.File) { } if !isText { + i -= 4 continue } @@ -192,6 +231,9 @@ func Assemble(path string, out *os.File) { if _, err = out.Write(bytes); err != nil { panic(err) } + if len(bytes) == 8 { + i += 4 + } } if err := scanner.Err(); err != nil { @@ -66,7 +66,7 @@ func main() { var fOffset, mOffset uint32 = 0, 0 for j, p := range PHeaders[:i] { - PHeaders[j].offset = uint32(i*PHENSIZE) + fOffset + PHeaders[j].offset = uint32(i*PHENSIZE) + fOffset + EHSIZE fOffset += p.filesz PHeaders[j].vaddr = mOffset mOffset += p.memsz @@ -18,6 +18,7 @@ type PosPair struct { var labels map[string]PosPair = make(map[string]PosPair) var SectionPos [4]uint +var SectionStart [4]uint const ( TEXT = 0 @@ -82,8 +83,15 @@ func LabelFind(path string, dTemp, rTemp *os.File) { if err != nil { panic(err) } + if Section == TEXT && s[0] == "la" { + offset += 4 + } *i += offset } + SectionStart[0] = 0 + SectionStart[1] = SectionPos[0] + SectionStart[2] = SectionPos[1] + SectionPos[1] + SectionStart[3] = SectionPos[2] + SectionPos[2] } func CalcOffset(s []string, Section uint8, dTemp, rTemp *os.File) (uint, error) { diff --git a/test6.bin b/test6.bin Binary files differdeleted file mode 100755 index e81d82c..0000000 --- a/test6.bin +++ /dev/null diff --git a/tests/fibtest.asm b/tests/fibtest.asm new file mode 100755 index 0000000..bd053b9 --- /dev/null +++ b/tests/fibtest.asm @@ -0,0 +1,70 @@ +.data + +str: + .asciiz "Fibinacci Number " + +str2: + .asciiz " is: " + +fib: + .space 40 + +.text + +main: + addi $t0, $zero, 0 + addi $t1, $zero, 1 + add $t3, $zero, $zero + la $t6, fib + addi $t5, $zero, 9 + + loop: + add $t2, $t1, $t0 + add $t1, $zero, $t0 + add $t0, $zero, $t2 + sw $t2, 00($t6) + addi $t3, $t3, 1 + addi $t6, $t6, 4 + bne $t3, $t5, loop + nop + addi $t6, $t6, -4 + loop2: + la $a0, str + jal PrintStr + nop + + add $a0, $zero, $t3 + jal PrintInt + nop + + la $a0, str2 + jal PrintStr + nop + + lw $a0, 00($t6) + jal PrintInt + nop + + addi $a0, $zero, 10 + addi $v0, $zero, 11 + syscall + + addi $t3, $t3, -1 + addi $t6, $t6, -4 + bne $t3, $zero, loop2 + nop + + addi $v0, $zero, 10 + syscall + +PrintInt: + addi $v0, $zero, 1 + syscall + jr $ra + nop + +PrintStr: + addi $v0, $zero, 4 + syscall + jr $ra + nop
\ No newline at end of file diff --git a/tests/fibtest.bin b/tests/fibtest.bin Binary files differnew file mode 100755 index 0000000..167f491 --- /dev/null +++ b/tests/fibtest.bin diff --git a/tests/test5.bin b/tests/test5.bin Binary files differindex dd1cc83..78175de 100755 --- a/tests/test5.bin +++ b/tests/test5.bin diff --git a/test6.asm b/tests/test6.asm index 3c9ab62..3c9ab62 100755 --- a/test6.asm +++ b/tests/test6.asm diff --git a/tests/test6.bin b/tests/test6.bin Binary files differnew file mode 100755 index 0000000..f9ed3d3 --- /dev/null +++ b/tests/test6.bin diff --git a/tests/test7.asm b/tests/test7.asm new file mode 100755 index 0000000..158bf75 --- /dev/null +++ b/tests/test7.asm @@ -0,0 +1,43 @@ +.text + +la $t0, x +lw $a0, 0($t0) +jal PrintInt +nop +la $a0, cats +jal PrintStr +nop +j exit +nop + +PrintInt: + addi $v0, $zero, 1 + syscall + jr $ra + nop + +PrintStr: + addi $v0, $zero, 4 + syscall + jr $ra + nop + +exit: + addi $v0, $zero, 10 + syscall + +.data + +x: .word 0xFFFFFFFF +cats: .asciiz "cats are cool\n" +c: .byte 0 + +.rodata + +g: .word 50 +dogs: .ascii "Dogs are cool\n" +h: .half 255 + +.bss +fib: .space 40 + diff --git a/tests/test7.bin b/tests/test7.bin Binary files differnew file mode 100755 index 0000000..daadfee --- /dev/null +++ b/tests/test7.bin |
