4

我有这个汇编代码,我应该将其翻译成二进制形式的机器代码:

        .text
        .align 2
        .global main
        .equ val,0x4712         

main:                           
        movi r16,val
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop
.end 

而且我不确定如何解释“bne r16,r0,loop”和“br stop”。

我的指令集参考说 bne 指令这样做:

if(rA != rB)
then PC ← PC + 4 + σ(IMM16)
else PC ← PC +4

据我了解,程序计数器增加了 4 + offset 或简单地增加了 4。

但是,就我而言,偏移量/IMM16 值是多少?指令集参考说:

“在指令编码中,IMM16 给出的偏移量被视为相对于紧跟 bne 的指令的有符号字节数”。

我对此的解释是,IMM16 值是到下一条指令地址的“距离”,但我不知道这是否正确。bne 的十六进制地址是 0x40010 和 br 的 0x40014,所以这意味着 IMM16 的值是 4?(如果 rA != rB 会导致 PC 跳过 0x40014 地址?)

4

1 回答 1

4

免责声明:我不完全确定这是什么指令集,所以我会尽量坚持汇编语言通常的情况。

if(rA != rB) 然后 PC ← PC + 4 + σ(IMM16) 否则 PC ← PC +4

据我了解,程序计数器增加了 4 + offset 或简单地增加了 4。

这是对的。请记住,CPU 基本上总是会PC ← PC + 4在获取指令后将程序计数器移动到下一个周期的下一条指令,这可能会有所帮助。因此,即使是 NOP 也会产生PC +=4(当指令长度为 4 个字节时)的有效结果。维基百科有更多。

此外,由于 IMM16 可能为负数,因此您可以向后跳。

但是,就我而言,偏移量/IMM16 值是多少?指令集参考说:

“在指令编码中,IMM16 给出的偏移量被视为相对于紧跟 bne 的指令的有符号字节数”。

我对此的解释是,IMM16 值是到下一条指令地址的“距离”,但我不知道这是否正确。bne 的十六进制地址是 0x40010 和 br 的 0x40014,所以这意味着 IMM16 的值是 4?(如果 rA != rB 会导致 PC 跳过 0x40014 地址?)

IMM16 值距离,但它是到您要跳转到的指令的距离(以字节为单位),以防万一rA != rB!所以在这种情况下,你希望立即数是从后面的指令bne(因为距离是相对于后面的指令)到你想跳转到的地方的距离(loop)。在这种情况下(如果我的计算是正确的)address(jump-target) - (address(bne-instruction) + 4) = 0x40008 - (0x40010 + 4) = -12 = ~12 + 1 = 0xfff4 (16-bit)

当您担心指令编码时,请注意应用于立即数的 sigma 函数。我将进行有根据的猜测,并假设它将立即数乘以 4,然后指令编码将包含要跳转的指令数减一。也就是说,-12 字节可能会被编码为 16 位有符号值0xfffc = -3,因为我们想要将两条指令跳回bne,因此从后面的指令中跳回 3条指令 bne

如果这是真的,那么我仍然不明白 IMM16-value br 有什么,因为没有以下说明。标签为“停止”时可能为零?(或者如果 rA != rB 并且 PC ← PC + 4 + σ(IMM16) 会导致什么结果)。

请注意,br可能有不同的编码(例如,它可能是绝对偏移量,也可能是不同的大小)。我对手头的指令集不够熟悉,无法知道,但我可以给出大致的想法:您并没有真正使用以下指令的地址,而是使用当前指令的地址 + 4 (如果后面有一条指令,则该指令的地址是该指令的地址)。

于 2011-10-03T19:05:16.063 回答