Assembly 计算偏移量

Assembly 计算偏移量,assembly,mips,spim,Assembly,Mips,Spim,我有一个家庭作业的问题 我在0x8888888上有一条BNE指令,我需要告诉您合法的跳转范围是多少 我的理论是偏移量告诉我我可以: 从0x88888-4*215 至0x8888+4*(215-1) 我真的不明白这是怎么回事,有人能解释一下吗?说: 分支指令使用有符号的16位偏移字段;因此,它们可以向前跳转215-1条指令(不是字节)或向后跳转215条指令 由于指令似乎总是4字节宽,因此您的推理似乎是正确的,但您已经交换了符号 最大向后分支(朝向较低地址)为215-1条指令,即32767条指令

我有一个家庭作业的问题

我在
0x8888888
上有一条
BNE
指令,我需要告诉您合法的跳转范围是多少

我的理论是偏移量告诉我我可以:

  • 从0x88888-4*215
  • 至0x8888+4*(215-1)
我真的不明白这是怎么回事,有人能解释一下吗?

说:

分支指令使用有符号的16位偏移字段;因此,它们可以向前跳转215-1条指令(不是字节)或向后跳转215条指令

由于指令似乎总是4字节宽,因此您的推理似乎是正确的,但您已经交换了符号

最大向后分支(朝向较低地址)为215-1条指令,即32767条指令或131068字节,因此您可以达到
0x888888-131068=8886888c


类似地,最大正向分支会将您带到
0x8888888+131072=0x888a8888

查找显示指令编码的指令参考,如

s和t保持被比较的寄存器,5位,每一位给出寄存器0-31。低16位是以指令为单位的偏移量

(对于mips)从程序员的角度来看,假设程序计数器前面有1条指令,4个字节。因此,对于地址0x888888,使用地址0x888888+4=0x8888888C进行计算


指令编码使用两个补码,因此最大的前向分支是0x7FFF指令,即0x7FFF指令。您忘了告诉我们您使用的是什么指令集。不同的CPU有不同的指令集。如果我们没有告诉任何事情,它可以连接到我们使用的程序吗?spim模拟器和modelsim?是的,spim是MIPS指令集的模拟器。我不知道这方面的任何细节,但已经在你的问题中添加了标签。希望其他人能过来,知道细节。谢谢你的解释,但我还是不明白,为什么要在第9行做2位偏移?左移2等于乘以4。每条指令有4个字节,所以要将指令单位转换为字节单位,可以将指令数乘以4,得到字节数。同样地,除以4(算术右移)可以从字节数得到指令数。只需查看地址,一条指令位于地址0x2000,下一条指令位于地址0x2004和0x2008,依此类推。每条指令4字节。如果我有60英寸,那是多少英尺?除以12,5英尺。如果我有3英尺,那是多少英寸?乘以12,36英寸。32位固定指令长度处理器上的5条指令。每字节8位的32位为32/8=4字节。5条指令乘以4等于20个字节。如果我想将0.123转换成百分比,我除以100%表示除以100%,所以0.123是12.3%。或者把它想象成移位2,乘以数字系统中的基数的平方等于2的左移位,乘以十进制数乘以100,你向左移位2个位置,3乘以100等于300,用零填充空格。4000除以10表示右移1=400。更改为基数2时,系统中的基数除以乘方2即为右移2。0b1000/four=0b10,0b011*8th=0b011000三档左移。
000100ss sssttttt CCCCCCCC CCCCCCCC
0x8888888C + 0x0001FFC = 0x888A8888
0x8888888C + 0xFFFE000 = 0x88868888
00002030 <back>:
    2034:
    2038:   1443fffd    bne v0,v1,2030 <back>
    203c:   00000000    nop
    2040:   1443fffb    bne v0,v1,2030 <back>
    2044:   00000000    nop
    2048:   1443fff9    bne v0,v1,2030 <back>
    204c:   00000000    nop
    2050:   14430003    bne v0,v1,2060 <fore>
    2054:   00000000    nop
    2058:   14430001    bne v0,v1,2060 <fore>
    205c:   00000000    nop

00002060 <fore>: