我从不同的来源中学到了很多关于CISC和RISC体系结构之间差异的信息。似乎已达成共识的事情之一是,CISC始终与冯·诺依曼一起使用,而RISC与哈佛体系结构一起使用。但是我不太了解这种分类背后的原因。
不确定偏移量是否意味着将指令提取并存储在距“加载字”程序计数器一行(4 字节)的地方到寄存器 $s0,4($t0) 中。这在内存中是如何工作的?如果可能,请提供示例。
我不太了解CPU时钟,如3.4Ghz.我知道这是每秒3.4亿个时钟周期.
因此,如果机器使用单个时钟周期指令,那么它每秒可以执行大约3.4亿个指令.
但在流水线中,基本上每条指令需要更多周期,但每个周期长度都比单个时钟周期短.
但是虽然管道具有更高的吞吐量,但无论如何cpu每秒可以达到34亿个周期.因此,它可以执行3.4亿/ 5条指令(如果一条指令需要5个周期),这意味着不到单周期执行(3.4> 3.4/5).我错过了什么?
3.4Ghz等CPU时钟仅仅意味着基于流水线循环,而不是基于单周期实现吗?
我有memchr我要使非分支的这段代码:
.globl memchr
memchr:
mov %rdx, %rcx
mov %sil, %al
cld
repne scasb
lea -1(%rdi), %rax
test %rcx, %rcx
cmove %rcx, %rax
ret
Run Code Online (Sandbox Code Playgroud)
我不确定是否cmove是分支指令。是吗?如果是这样,如何重新排列我的代码,使其不分支?
assembly x86-64 cpu-architecture micro-optimization branch-prediction
我知道它们是唯一可以用于间接寻址的寄存器,但我找不到解释为什么我不能同时使用这些寄存器对。
为什么机器不支持这样的寻址方式[si+di]?
通过一些研究,我意识到 ARM 和 RISC 几乎可以互换使用,x86 和 CISC 也是如此。我理解RISC和CISC是架构。我的理解是,架构(即 RISC 或 CISC)是一种指令集,进程必须能够执行这些指令才能成为这些架构之一。例如,RISC-V 有一个它可以执行的指令列表,CISC 有一个它可以执行的指令列表。要成为 RISC 或 CISC,处理器必须能够执行特定的指令列表之一。但是,我不明白ARM和RISC以及x86和CISC分别有什么区别。ARM和x86不也是架构吗?我经常读到“ARM 架构”或“x86 架构”。感谢您为我澄清这一点。
我正在研究计算机体系结构,但我不明白是什么真正使一台机器的软件与另一台机器“兼容”。让我们以两台使用相同 intel cpu 的机器(例如 Mac OS 和 Windows)为例。现在,如果操作码相同,它们的软件怎么可能彼此不兼容?
1)有人可以概述一下兼容性词所涉及的内容吗?
2)除了CPU的操作码之外,还有哪些因素可以使两台机器相互兼容?
这是我在大学的最后一个学期,副课叫做微处理器的体系结构和编程,教授写了这段代码,我只是无法理解他在做什么。尤其是有面具的部分。这是代码。谁能帮我理解一下吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
uint32_t Instruction_Memory[0x2000];
uint32_t PC = 0;
uint32_t Registers[32];
uint32_t Data_Memory[0x3000];
uint32_t get_instruction(uint32_t input){
uint32_t temp = input/4;
return Instruction_Memory[temp];
}
void print_registers() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
printf("x%d: %x \t", i*8+j, Registers[i*8+j]);
}
printf("\n");
};
};
uint32_t get_bits(uint32_t input, int start, int numberOfBits){
uint32_t t4 = input >> start;
uint32_t mask = (1 << numberOfBits) - 1; …Run Code Online (Sandbox Code Playgroud) 我试图在我的64位机器上找到对齐方式(Intel iCore7上的Win10).我想到了这个实验:
void check_alignment(char c1, char c2 )
{
printf("delta=%d\n", (int)&c2 - (int)&c1); // prints 4 instead of 8
}
void main(){
check_alignment('a','b');
}
Run Code Online (Sandbox Code Playgroud)
我在期待delta=8.因为它是64位机器char c1,char c2应该存储在8的倍数.不是吗?
即使我们假设编译器已经进行了优化以将它们存储在更小的空间中,为什么不将它们背靠背存储delta=1呢?为什么4字节对齐?
我用float类型重复了上面的实验,但仍然给出了delta=4
void check_alignment(float f1, float f2 )
{
printf("delta=%d\n", (int)&c2 - (int)&c1); // prints 4
}
void main(){
check_alignment(1.0,1.1);
}
Run Code Online (Sandbox Code Playgroud) cpu-architecture ×10
assembly ×4
c ×3
cpu ×2
risc ×2
arm ×1
compilation ×1
endianness ×1
memory ×1
mips ×1
peripherals ×1
processor ×1
x86 ×1
x86-16 ×1
x86-64 ×1