Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么我们要在MIPS中将程序计数器增加4而不是32?_Assembly_Mips_Cpu Architecture - Fatal编程技术网

Assembly 为什么我们要在MIPS中将程序计数器增加4而不是32?

Assembly 为什么我们要在MIPS中将程序计数器增加4而不是32?,assembly,mips,cpu-architecture,Assembly,Mips,Cpu Architecture,在MIPS中,我知道PC的每一条指令递增4。这是因为该字位于32位边界4字节上。这对我来说是有意义的,当然我们需要通过两个连续单词的空间位置差异来增加PC 例如,我们可能将0x00000000作为PC值,但当我们增加PC时,它将变成0x00000004。但是,这个差异实际上是4位,而不是4字节32位。为什么它是0x00000004而不是0x8000000 从二进制角度来看,这个问题变成了:0000到0000 0010与1000 0000。第二个似乎是32位4字节的差异,而第一个是4位的差异 我能

在MIPS中,我知道PC的每一条指令递增4。这是因为该字位于32位边界4字节上。这对我来说是有意义的,当然我们需要通过两个连续单词的空间位置差异来增加PC

例如,我们可能将0x00000000作为PC值,但当我们增加PC时,它将变成0x00000004。但是,这个差异实际上是4位,而不是4字节32位。为什么它是0x00000004而不是0x8000000

从二进制角度来看,这个问题变成了:0000到0000 0010与1000 0000。第二个似乎是32位4字节的差异,而第一个是4位的差异


我能想到的唯一一件事是,必须将PC乘以8才能得到一个单词的实际起点。加4应该不够吗?有人能解释一下我遗漏了什么吗?

因为机器是字节可寻址的,而不是位可寻址的;因此,加4使指针前进32位

地址总线需要以字节为单位的位置。没有办法寻址单个位


完全有可能它实际上是将PC增加1,而低两位甚至不存在于寄存器中。至少有一个处理器是这样工作的。

0x00000004是0x00000000之后的4个字节;我很困惑您是如何想到0x8000000将代表4个字节的。@user2357112因为递增32位的二进制数学。首先,我看不出32和0x8000000之间有什么联系。它甚至不增加第32位或任何内容,根据您使用的MIPS类型,程序计数器中可能没有32位。其次,程序计数器只是一个数字。将一个数字增加4的效果是相同的,无论该数字表示位、字节、苹果数或其他什么。