Assembly RISC体系结构中小数值的直接算术运算
是否有任何RISC架构允许算术运算单独应用于字节、半字和其他数据单元,其大小小于CPU通用寄存器的大小 在英特尔x86(IA-32)和x86-64(称为EM64T或AMD64)处理器中,不仅可以使用整个寄存器,还可以使用其较小的部分。英特尔ISA允许对整个寄存器执行所有算术运算,它是半字节、四分之一字节和一个字节(更准确地说,寄存器中有两个字节可用,例如RAX中的AL和AH)。执行操作后,我们可以进行溢出检查,如果在上一次操作中发生溢出,则可以轻松处理。无论我们是对整个字(IA-32为32位宽,EM64T为64位宽)进行操作,还是对较小的数据(半字、四分之一字或一个字节)执行算术指令,如果结果超过所选数据单元的大小,相应的标志(of或CF)将设置为1。因此,在英特尔体系结构中,不需要通过一系列指令分析结果的高位来模拟处理此类错误,这些错误发生在使用小数据的操作中Assembly RISC体系结构中小数值的直接算术运算,assembly,x86,cpu-architecture,instruction-set,risc,Assembly,X86,Cpu Architecture,Instruction Set,Risc,是否有任何RISC架构允许算术运算单独应用于字节、半字和其他数据单元,其大小小于CPU通用寄存器的大小 在英特尔x86(IA-32)和x86-64(称为EM64T或AMD64)处理器中,不仅可以使用整个寄存器,还可以使用其较小的部分。英特尔ISA允许对整个寄存器执行所有算术运算,它是半字节、四分之一字节和一个字节(更准确地说,寄存器中有两个字节可用,例如RAX中的AL和AH)。执行操作后,我们可以进行溢出检查,如果在上一次操作中发生溢出,则可以轻松处理。无论我们是对整个字(IA-32为32位宽,
问题是,是否存在任何RISC体系结构,其中可以对小数据进行直接算术运算,这些运算是通过处理器硬件实现的(执行这些运算不需要软件仿真),并且这些运算中发生的溢出、携带和借用是以字节为单位的,半字等由处理器设备跟踪,不应以软件方式进行检查。或者,这种方法与整个RISC原理相矛盾,目前和过去都没有RISC处理器实现过它?TL:DR:no,AFAIK没有标志设置部分寄存器操作小于32位的RISC ISA。但许多具有标志的64位RISC ISA(如AArch64)可以根据32位运算的结果设置标志 请参阅最后一节:这是因为对软件整数溢出检查的需求普遍不足,或者存在鸡/蛋问题通常您只需要比较/分支16位的值,您可以将它们设置为零或扩展为32或64位。 只有寄存器宽度为8或16位的RISC才能从该操作数大小设置标志。e、 具有32个寄存器和16位指令字的AVR 8位RISC。它需要扩展精度的add/adc来实现16位
int
这主要是一个历史事件:x86的所有操作数大小都是16位的,因为它是从16位的286演变而来的。在设计80386时,它必须能够以全速运行16位纯代码,并且他们提供了在16位代码中增加32位操作的方法。并使用相同的机制在32位代码中允许16位操作
x86 8位低/高寄存器(AX=AH:AL)的出现在一定程度上也是由于8086是如何被设计为8080的继承者,并使移植变得容易(甚至可以实现自动化)。(还因为同时拥有八个1字节寄存器和四个2字节寄存器非常有用。)
相关:对于许多计算,不必在每次操作后将高位重新归零,即可获得相同的结果。因此缺少8位/16位操作数大小并不是有效实现将结果逻辑包装为8位或16位的大多数代码的障碍。 64位RISC机器通常至少有一些重要指令的32位版本,如
add
,因此您可以免费获得零扩展add
结果,而无需单独截断它,例如,使用uint32_t i
和64位指针使array[i++]
等代码高效但决不能在我听说过的任何RISC上使用小于32位的部分寄存器操作数。
DEC Alpha很有趣,因为它是一种全新的设计,从头开始是64位的,而不是像MIPS64那样对现有ISA进行64位扩展。这表明add/sub/mul/div有32位和64位两种形式,但移位和比较不可用。(也有字节操作指令,基本上是64位整数寄存器中的SIMD shuffle/mask/insert/extract,以及SIMD打包的比较,用于有效的字符串内容。)
根据这一点(第4.3节CPU寄存器)
MIPS64处理器始终生成64位结果,即使对于那些
在体系结构上定义为在32位上操作的指令。
此类指令通常会将其32位结果扩展为64位
位。在这样做时,32位程序按预期工作,尽管
寄存器实际上是64位宽,而不是32位宽
(对完整的64位寄存器使用特殊指令,如DADDU
(双字添加无符号)而不是ADDU
。请注意,add
和dadd
的非U版本会导致2的补码有符号溢出(操作数大小为32位或64位),因此必须使用U版本来包装有符号的数学。(ISA参考链接打开)。无论如何,MIPS没有针对32位的特殊模式,但操作系统需要关注32位程序与64位程序,因为32位将假定所有指针都位于虚拟地址空间的低位32
在RISC加载/存储计算机上,您通常只使用零扩展(或符号扩展)字节/半字加载。完成后,您将使用字节/半字存储来获得截断的结果。(对于无符号base2,或2的补码有符号,通常是您想要的。)这就是编译器(或人工)的方式将实现使用
short
或uint8\u t
的C源代码
半相关:C的整数提升规则自动提升小于intcmpi Compare Integer
cmpib Compare Integer Byte
cmpis Compare Integer Short
cmpo Compare Ordinal
cmpob Compare Ordinal Byte
cmpos Compare Ordinal Short
concmpi Conditional Compare Integer
concmpo Conditional Compare Ordinal