Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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 寻址寄存器所需的位_Assembly_Cpu Registers_Machine Code - Fatal编程技术网

Assembly 寻址寄存器所需的位

Assembly 寻址寄存器所需的位,assembly,cpu-registers,machine-code,Assembly,Cpu Registers,Machine Code,假设我有12个寄存器。为了寻址这12个寄存器中的任何一个,机器代码指令中必须保留多少位?寄存器不存储以16位为基数的4位数字,这就是解释此类寄存器内容的方式。您的意思是16位寄存器,当解释为十六进制整数时,可以存储值0000..FFFF 但是寄存器本身是从0位或1位值在硬件中实现的。16位寄存器有16位。没有关于数字、十六进制等的内容。。。这些都是特定解释的特征,解释要么通过使用寄存器中的值的代码来完成,要么通过用于查看寄存器内容的工具来完成 无论如何,寻址寄存器在任何方面都与寄存器内容功能无关

假设我有12个寄存器。为了寻址这12个寄存器中的任何一个,机器代码指令中必须保留多少位?

寄存器不存储以16位为基数的4位数字,这就是解释此类寄存器内容的方式。您的意思是16位寄存器,当解释为十六进制整数时,可以存储值0000..FFFF

但是寄存器本身是从0位或1位值在硬件中实现的。16位寄存器有16位。没有关于数字、十六进制等的内容。。。这些都是特定解释的特征,解释要么通过使用寄存器中的值的代码来完成,要么通过用于查看寄存器内容的工具来完成

无论如何,寻址寄存器在任何方面都与寄存器内容功能无关!问题是寻址12个寄存器,因此为了简单起见,您可以从给它们命名/地址开始,例如0,1,2,…,11-必须保留多少位才能对其进行编码

1位可以存储多少信息?0或1=2个选项

两个位可以存储这些位模式00、01、10、11=4个选项

三位可以存储000001010100011101110111=8个选项。请注意,您会将这些位解释为二进制编码的整数值,我写了0,1,2,4,3,5,6,7。。。在那种混乱中。。。但在设计CPU时,您几乎不会费心将寄存器选择位解释为整数,这更像是模式匹配,如果寄存器example1在CPU中有模式101,那么这就是汇编程序必须将源代码转换为机器代码的方式

等等

将寄存器的内容显示为十六进制值是非常常见的,因为1位由4位组成,因此调试代码的程序员可以很容易地看到单个位,如果他需要的话,但十六进制数只是对寄存器中存储的位模式的解释,而不是编码信息的一部分。编码的只是位值。

在正常的固定宽度字段中,对12种可能性中的1种进行编码需要CEILOG212位

但是,如果寄存器的幂次小于2,是否可以在具有多个寄存器操作数的指令中保存任何位?是的,在这种情况下

3寄存器指令有12^3=1728个可能的寄存器排列。但是使用3个独立的4位字段将为我们提供2^4*3=4096种可能的编码。所以有1个冗余位,因为2^11=2048,仍然大于1728。然而,将所有3个寄存器选择器编码到一个11位字段将需要更复杂的解码

2寄存器指令需要12^2=144个唯一寄存器编码。但是在这里,2^4*2=256,下一个最低功耗是2128,这还不够大

可能您最好的选择是使用4位字段,并对其他内容使用13..15寄存器编码。e、 一个转义码,意味着它实际上是一个不同的指令。或者,如果您不需要那么多指令编码空间,请简化解码器并保留指令格式冗余


或者你最好的选择是拥有2次幂的寄存器,这样你就不会浪费编码空间。这是一个原因,基本上每个现代的寄存器机器都有2次幂的寄存器。

这看起来像是家庭作业。到目前为止你试过什么?什么是不清楚的/你卡在哪里了?我最初的想法是需要8位-一个字节来存储十六进制数,因为寄存器的数量小于16。你说的十六进制数是什么意思?为什么需要一个字节来存储它?好的,你使用了十六进制数这个术语。那不是一件事。十六进制是一种序列化格式,是将数字转换为文本形式的一种特定方式。既然你写这篇文章的时候一定有什么意思,我想问你十六进制数是什么意思。你需要12种不同的状态,处理器才能做出12次不同的反应。拿一个计算器,输入12,让它把它转换成二进制。它显示一个二进制数,希望没有前导零。数一数二进制数字的数量,你就知道你需要多少位了。OP-如果你玩弄一下这个,你可能会发现这个简单的8位机器在机器代码中确实使用了8位来选择寄存器,理论上允许256个寄存器,而它只有6个寄存器和标志,所以它在机器代码中浪费了很多位。使用5位指令和3位寄存器选择来设计具有相同功能的机器是很容易的,可以产生60-70%大小的二进制文件,但创建者确实使用了可读性?更简单的8位指令+8位寄存器。