Memory 引用内存中的单词还是引用内存单元?

Memory 引用内存中的单词还是引用内存单元?,memory,assembly,mips,ram,memory-address,Memory,Assembly,Mips,Ram,Memory Address,我可能会问教授这件事,但在过去的几周里,我没有经常去教员那里,所以我会问任何遇到这件事的人 在MIPS中,如果整数数组的起始地址(A[0]的地址)存储在寄存器$s3中,则用于将数组的第9个元素存储在临时寄存器$t0中的汇编代码将为lw$t0 32($s3)。所以偏移量是32。对此的解释是,目前大多数体系结构引用内存中的每个字节(即每个内存单元),并且由于整数是4字节,这是“字”的最常见大小,所以内存中下一个整数的地址将是当前地址+4,使第九个整数的地址为:起始地址+4*8。很好 现在我知道,对于

我可能会问教授这件事,但在过去的几周里,我没有经常去教员那里,所以我会问任何遇到这件事的人

在MIPS中,如果整数数组的起始地址(A[0]的地址)存储在寄存器$s3中,则用于将数组的第9个元素存储在临时寄存器$t0中的汇编代码将为lw$t0 32($s3)。所以偏移量是32。对此的解释是,目前大多数体系结构引用内存中的每个字节(即每个内存单元),并且由于整数是4字节,这是“字”的最常见大小,所以内存中下一个整数的地址将是当前地址+4,使第九个整数的地址为:起始地址+4*8。很好

现在我知道,对于ASCII编码的字符,需要的位数是8=1字节。所以我想问的是,如果我们有一个字符数组,那么数组中下一个字符的地址是:“当前地址+1”,因为聊天只需要一个存储单元,每个存储单元都有自己的地址吗?或者,因为体系结构中的字大小是4字节,所以可以引用的最小数量是一个字,尽管每个内存单元都有自己的地址,使字符接受4个“是”,尽管只需要1个?如果第一种情况为真,处理器如何知道将1添加到4的地址?编译器不需要额外的指令来确定数据类型吗?另外,由于int占用了4个地址引用的空间,处理器用来加载整数的地址是第一个字节的地址还是

现在我正在使用高速缓存(顺便说一下,我正在学习帕特森和轩尼诗的计算机组织和设计),这件事真的让我很困扰,所以如果有人 我会回答的。所以,谢谢

如果我们有一个字符数组,那么数组中下一个字符的地址是否为:“当前地址+1[字节]”

如果[this]是真的,处理器如何知道将1添加到4的地址?编译器不需要额外的指令来确定数据类型吗

还有其他说明
lw
用于加载单词,而
lb
/
lbu
用于加载字节。但这只会影响要加载的数据的大小。偏移量不会像在C中那样根据数据大小进行缩放。如果对
lw
使用3的偏移量,它将尝试从基址寄存器给定的地址+3字节加载

另外,由于int占用了4个地址引用的空间,处理器用来加载整数的地址是第一个字节的地址还是

对。内存中字值的布局取决于CPU的端性。little endian系统上的值0x12345678将存储为:

-- address -->
78 56 34 12
-- address -->
12 34 56 78
在big-endian系统上,它将存储为:

-- address -->
78 56 34 12
-- address -->
12 34 56 78

哦,天哪,我从来没有想过这个int main(){int x[10];char a[10];long long p[10];printf(“x[0]=%d的地址,x[1]的地址是%d\n”、&x[0]、&x[1]);printf(“a[0]=%d的地址,a[1]的地址是%d\n”、&a[0]、&a[1]);printf(“p[0]=%d的地址,p[1]是%d”、&p[0]、&p[1])结果是:x[0]=2686696的地址,x[1]的地址是2686700,a[0]=2686686的地址,a[1]的地址是2686687,p[0]=2686600的地址,p[1]的地址是2686608。编译器如何通知处理器需要递增1或4?我知道Hi和Lo寄存器,以及处理器如何处理比long long long这样的32位字更长的数据。现在,当我想到它时:编译器不需要生成额外的指令来指出它是char或int。它将读取更高级别的代码,并确定是否应该设置偏移量x*4或x*1。而字符的加载,会自动取代最低的位,所以其他的都会保持不变,所以我想如果寄存器中有什么东西,应该先用零替换,然后用来存储字符。我不太明白偏移量没有被缩放的部分。编译器是否根据其编译的更高级别程序(例如C++)确定数据类型,并相应地放置偏移量?