gpt4 book ai didi

assembly - 汇编指令 bne 和 br (NIOS II)。它们的偏移量是如何计算的?

转载 作者:行者123 更新时间:2023-12-01 18:35:24 29 4
gpt4 key购买 nike

我有这个汇编代码,我应该将其转换为二进制形式的机器代码:

        .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 + 偏移量或简单地增加了 4。

但是,就我而言,offset/IMM16 值是多少?指令集引用说:

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

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

最佳答案

免责声明:我不完全确定这是什么指令集,因此我将尝试坚持汇编语言通常的情况。

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

which, as I understand it, is the program counter being incremented by 4 + offset or simply by 4.

这是正确的。记住 CPU 基本上总是这样做可能会有所帮助 PC ← PC + 4取指令后将程序计数器移至下一个周期的下一条指令。因此,即使是 NOP 也会产生 PC +=4 的有效结果。 (当指令长度为 4 个字节时)。 Wikipedia还有更多。

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

But, in my case, what is the offset/IMM16 value? The instruction set reference says:

"In the instruction encoding, the offset given by IMM16 is treated as a signed number of bytes relative to the instruction immediately following bne".

My interpretation of this is that the IMM16 value is the "distance" to the next instruction address, but I have no idea if this is correct. The hex-address for bne is 0x40010 and 0x40014 for br, so this would mean that the IMM16 value is 4? (which would result in PC jumping past the 0x40014 address if rA != rB?)

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 .

If that's true, then I still don't understand what IMM16-value br has since there are no following instructions. Maybe it's zero when the label is "stop"? (or what bne would result in if rA != rB and PC ← PC + 4 + σ(IMM16)).

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

关于assembly - 汇编指令 bne 和 br (NIOS II)。它们的偏移量是如何计算的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7634362/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com