Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
关于从C语言到汇编语言的字长换算为4的问题_C_Assembly_Memory_Cpu Registers_Sll - Fatal编程技术网

关于从C语言到汇编语言的字长换算为4的问题

关于从C语言到汇编语言的字长换算为4的问题,c,assembly,memory,cpu-registers,sll,C,Assembly,Memory,Cpu Registers,Sll,我是汇编语言的初学者,所以我希望给我答案的人能解释得更具体一些 问题是如何从C语言转换成汇编语言 C代码为: while(save[i] == k) i += 1; i和k在$s3和$s5中,数组save[]的基数在$s6中 答案在图中 我所误解的是,为什么$S3乘以2^2==4,然后存储到$t1中 我在stackoverflow上查看了类似的问题,有些人说你应该把基和索引加在一起,记住单词大小要按4缩放 但是因为我是一个初学者,我仍然感到困惑 比如说, 经过一个周期后,i==2,单位

我是汇编语言的初学者,所以我希望给我答案的人能解释得更具体一些

问题是如何从C语言转换成汇编语言

C代码为:

while(save[i] == k)
    i += 1;
i和k在$s3和$s5中,数组save[]的基数在$s6中

答案在图中

我所误解的是,为什么$S3乘以2^2==4,然后存储到$t1中

我在stackoverflow上查看了类似的问题,有些人说你应该把基和索引加在一起,记住单词大小要按4缩放

但是因为我是一个初学者,我仍然感到困惑

比如说,

经过一个周期后,i==2,单位为$S3

然后重新开始,$S3中的i==2乘以4,我们在这里得到8,然后写入$t1

所以有一个问题,为什么是8?我认为我们需要的是储蓄,而不是储蓄

我想我可能对价值和地址感到困惑

另一个问题是:像$S1,$t1这样的寄存器有多少位?我认为是32位,所以它应该是1个字。

lw将提供要加载字的第一个字节的地址

如果save的每个元素的大小为32位或4字节,则

发现保存[0]比保存开始位置多0个字节。 发现save[1]比save开头多4个字节。 save[2]在save开始的8个字节之外。 ... lw将提供要加载的字的第一个字节的地址

如果save的每个元素的大小为32位或4字节,则

发现保存[0]比保存开始位置多0个字节。 发现save[1]比save开头多4个字节。 save[2]在save开始的8个字节之外。 ... save中的每个条目都有32位长。这意味着,i条目具有从基址$s6开始的i×32位=i×4字节的偏移量 C是非常聪明的,它在内部为您计算。因此,在C代码编写中,save[i]与*save+i相同。指针的一个加法将乘以它的大小,因此C将把它转换为save+4*i

寄存器大小取决于您的本地体系结构,但一般来说,示例/练习的寄存器大小主要为32位。

save中的每个条目都是32位长的。这意味着,i条目具有从基址$s6开始的i×32位=i×4字节的偏移量 C是非常聪明的,它在内部为您计算。因此,在C代码编写中,save[i]与*save+i相同。指针的一个加法将乘以它的大小,因此C将把它转换为save+4*i


寄存器大小取决于您的本地体系结构,但通常来说,示例/练习的寄存器大小主要为32位。

C使用类型索引,它会根据项目大小自动缩放。汇编mips使用字节索引,这是您的工作。当您在C中增加数组索引时,偏移量4处的下一个元素假设数组的类型为“int”,并且目标上的“int”为4字节,则会被访问。这就是为什么在程序集中数组“save”地址偏移4以访问下一个元素。C使用类型化索引,它会自动按项大小进行缩放。汇编mips使用字节索引,这是您的工作。当您在C中增加数组索引时,偏移量4处的下一个元素假设数组的类型为“int”,并且目标上的“int”为4字节,则会被访问。这就是为什么在程序集中,数组“save”地址偏移4以访问下一个元素。谢谢@ikegami!我想我差不多明白了,但为什么它是4字节而不是32位的倍数呢?我的意思是为什么字节不是位?谢谢4字节和32位是相同的量。4字节=4字节*8位/字节=32位。因为指令只能寻址字节,所以用字节做算术才有意义。是的,我知道。我真正想问的是,sll意味着左移N位,每个元素是32位,所以我应该左移32位以获得下一个值,例如,save[2],那么为什么不是sll,$t1,$s3,5,2^5是32呢。非常感谢。我已经回答了。当需要以字节为单位的偏移量时,以位为单位计算偏移量是没有意义的。以字节为单位的偏移量是i*4=i*2^2=i经过长时间的思考,我似乎明白了这一点。例如,i=2,即0000 0010。第一个0000 0000存储在内存0x00000000中,依此类推,最后一个0000 0010存储在内存0x00000003中。因此,每32位存储一个i值,每8位即1字节在内存中是一个块,所以每一个i值取4个块。我说的对吗?谢谢你@ikegami!我想我差不多明白了,但为什么它是4字节而不是32位的倍数呢?我的意思是为什么字节不是位?谢谢4字节和32位是相同的量。4字节=4字节*8位/字节=32位。因为指令只能寻址字节,所以用字节做算术才有意义。是的,我知道。我真正想问的是,sll意味着左移N位,每个元素是32位,所以我应该左移32位以获得下一个值例如,save[2],那么为什么不是sll,$t1,$s3,5,
2^5等于32。非常感谢。我已经回答了。当需要以字节为单位的偏移量时,以位为单位计算偏移量是没有意义的。以字节为单位的偏移量是i*4=i*2^2=i经过长时间的思考,我似乎明白了这一点。例如,i=2,即0000 0010。第一个0000 0000存储在内存0x00000000中,依此类推,最后一个0000 0010存储在内存0x00000003中。因此,每32位存储一个i值,每8位即1字节在内存中是一个块,所以每一个i值取4个块。我说得对吗?