Reputation: 31
I'm stuck at converting the below MIPS instruction to machine code
sb $t3, 40($s2)
beq $s0, $s1, Lab1
j Lab1
jr $s0
So far, I have
101000 10010 01011 101000
000100 10000 10001 0x00400000
How do I go from here? Since 0x00400000 is address not value, I don't think I translate it into binary. And so on... I can't really find an example to go on from here.
Upvotes: 0
Views: 9868
Reputation: 41972
The encoding depends on the instruction type.
For relative branch like beq
, the immediate is the offset so you need to specify the distance between the current instruction and the branch target. For example to skip next 3 instructions you need beq $s0, $s1, +3
which encodes as
opcode $s0 $s1 +3
000100 10000 10001 0000 0000 0000 0011
For absolute jump you need to make sure that the target and the current instruction's high 6 bits are the same. The immediate address is the target's low 26 bits shifted by 2. The j instruction's format is 0000 10ii iiii iiii iiii iiii iiii iiii
so j 0x00400000
will be encoded as
0000 1000 0001 0000 0000 0000 0000 0000
You can read more about the encoding in this question as well as the courses here:
The instruction encoding is also available here
But why do you use both conditional branch and jump to Lab1
right beside each other? It's useless because eventually it will jump without doing anything
Upvotes: 1
Reputation: 31
Ah I think I'm getting a better idea now by looking at MIPS: Calculating BEQ into Hexadecimal Machine Code and Lưu's answer.
beq $s0, $s1, Lab1
=>000100 10000 10001 0x00400000
=>0001 0010 0001 0001 (0x004000040 + 1 away instruction)
=>0001 0010 0001 0001 0000 0000 0000 0101
=12110001
j Lab1
=>0000 1000 0001 0000 0000 0000 0000 0000
=08100000
jr $s0
=>0000 0000 0000 0000 0000 0000 0000 1000
=02000008
So this is what I got. If any error please let me know.
Upvotes: 0
Reputation: 2483
Immediate values in MIPS instructions are encoded directly as their binary representations.
Upvotes: 0