Assembly 为什么设置为小于ALU操作

Assembly 为什么设置为小于ALU操作,assembly,mips,Assembly,Mips,为什么slt被视为ALU操作?我想它只需要做一个减法运算,然后从ALU得到*Z*ero输出 ALU control lines | Function -------------------+------------------- 0000 | AND 0001 | OR 0010 | add 0110 | subtract

为什么
slt
被视为ALU操作?我想它只需要做一个减法运算,然后从ALU得到*Z*ero输出

ALU control lines | Function -------------------+------------------- 0000 | AND 0001 | OR 0010 | add 0110 | subtract 0111 | set on less than ALU控制线|功能 -------------------+------------------- 0000 |和 0001 |或 0010 |添加 0110 |减去 0111 |设置为小于
或者,如果
A-B
(在
slt$t1,A,B
)的结果为负,ALU应该输出1

如果A小于b,则输出1,否则输出0。这通常需要计算A-B,这需要ALU

现在,如果只计算<代码> A -B < /代码>的符号位,它将是多余的,但是考虑“<代码> A==2147483648=0x8000 000 < /代码>和<代码> B=1=0x00 000 01 0< /代码>的情况,这里的减法结果将是<代码> 0x7FFFFFF=2147483647 < /代码>,即使

A
也没有设置最高有效位

由于表格来自“帕特森,大卫·A;轩尼诗,约翰·L:计算机组织与设计”,我将让您参考第3章,特别是关于“加减法”的小节(第2版3.3,第4版3.2)。它有一个处理溢出/下溢的表格,可以在其中查找拐角案例

还要记住,ALU结果是32位的,因此即使结果只是减法结果的符号位,它仍然需要一个不同的ALU操作码来表示应该返回与结果位连接的31个零,而不是完整的减法结果


您可能指的“零”线是——在本书讨论的体系结构中——IIRC仅用于与分支相等/分支不相等的比较<手边的code>SLT/SLTI
将其结果存储在寄存器中

你所说的“被认为是ALU操作”是什么意思?还应该是什么?我在想ALU做一个减法运算,一些逻辑将使用ALUic的零/负输出进行处理,那么当出现溢出时,ALU应该输出什么呢?设置溢出位输出的“错误”结果?如果是这样,那么电阻中存储了什么?如果我们仍然在谈论SLT/SLTI,那么即使出现溢出或下溢,它们也应该返回相应的结果(31个零,然后是另一个0,如果!)