Tanenbaum的结构化计算机组织说:
每台计算机都有一个ISA (指令集体系结构),它是一组寄存器、指令和其他对其低级程序员可见的特性。这个ISA通常被称为机器语言,尽管这个术语并不完全准确。在这个抽象级别上的程序是二进制数字的长列表,每个指令一个,指示要执行哪些指令以及它们的操作数是什么。
我的问题是:
发布于 2015-03-04 04:04:48
看起来你从理论计算机科学中借用了一些词汇(关于"set“和"language"),并试图用这些词汇来解释低级计算机系统(CPU和硬件)的教科书描述。
在“指令集体系结构”中," set“一词是指对给定的CPU体系结构有效的一组预定义操作码。
例如,此页面(维基百科上的x86指令列表)列出了在IA32体系结构的不同代上可以预期的操作码。每个操作码都是这个“指令集”的成员。
当作者说“.不是完全准确”时,我猜他指的是这样一个事实,即从一系列机器指令中没有语法可以预期。
为了进一步澄清,CPU读取指令字节,如果它是一个有效的机器指令,它将被执行。否则,通常会生成“无效指令”硬件异常,这将停止当前的执行,并将控制转移到不同的程序(可能属于操作系统)。
然而,没有语法来定义什么是有效的机器指令序列。在某种意义上,没有任何结构或层次结构可以期望所有有效的机器指令序列符合。
在大多数编译的软件程序中发现的机器指令是用某种结构形成的,但是,并不是所有的都是这样的。CPU将愉快地执行“机器指令的意大利面序列”,在遇到每个指令时执行无条件或条件跳转;直到最近,机器指令序列才有可能修改其自身的部分。
有些CPU指令是为了便于结构化编程而设计的:
尽管这些指令中的一些似乎形成了对(push vs pop,call vs return),但实际上,有效的机器指令序列并不需要匹配这些对。也就是说,可以将下一个程序计数器值写入堆栈寄存器(模拟推送)所指向的内存地址,然后执行跳转到子例程的开始(该子程序与前一个推送一起成为子例程调用的模拟)。子例程可以使用常规的返回指令。
发布于 2015-03-04 04:07:08
请注意,Tanenbaum讨论的是向低级别程序员公开的内容,而不是CPU执行周期级别上发生的事情。在该级别下面是涉及分支预测、预取、流水线等的各种微操作。
在程序员可以直接访问的情况下,机器代码指令被分解成较小的块。
发布于 2015-03-04 05:58:49
关键是相同的指令集可以不同的使用。
在实践中,为了提高效率,这可能非常重要。优化编译器可以(并且将使用GCC和-O2 -mtune=native)为相同的ISA生成不同的机器代码,这取决于目标处理器。因此,为Intel处理器优化的代码与为AMD处理器优化的代码并不相同,即使它使用相同的ISA。为其中一个优化的机器代码不会是另一个上最快的代码。
https://softwareengineering.stackexchange.com/questions/275128
复制相似问题