MUL 溢出的进位标志大于 2^128?
carry flag on MUL overflow bigger than 2^128?
如果以下代码的结果大于 2^128,它会产生进位(out)吗?
mov rdx, -1 //rdx = 0xff...f
mov rax, -1 //rax = 0xff...f
mov rbx, -1 //rbx = 0xff...f
mul rbx //result will be bigger than 128 bits therefore will be pushed out of rdx
jc end
...
end: ret
所以我的问题归结为使用组合寄存器 rax:rdx 进行 mul
操作时进位标志的行为方式。 jc
会自动只查看 rdx 寄存器还是在结果大于 rax 时触发?
请参考英特尔手册... https://www.felixcloutier.com/x86/mul#flags-affected
如果结果(RDX、EDX、DX 或 AH)的上半部分为零,则 MUL 清除 CF,否则设置。
mul
有两个相同宽度的输入。只有输出是 double-width.
CF 不用于衡量整个事情的溢出,因为两个 64 位被乘数不能产生 129 位结果,所以这种意义上的溢出是不可能的。
CF实际上表示低半部分溢出。原始 8086 没有 non-widening 乘法 (imul ecx, esi
),因此即使您不关心 high-half,也必须使用 mul
或 imul
结果。知道结果仍然适合一个寄存器可能很有用,尤其是在 16 位世界中,比 x86-64 更常见的值比最宽的可用寄存器更宽。
如果以下代码的结果大于 2^128,它会产生进位(out)吗?
mov rdx, -1 //rdx = 0xff...f
mov rax, -1 //rax = 0xff...f
mov rbx, -1 //rbx = 0xff...f
mul rbx //result will be bigger than 128 bits therefore will be pushed out of rdx
jc end
...
end: ret
所以我的问题归结为使用组合寄存器 rax:rdx 进行 mul
操作时进位标志的行为方式。 jc
会自动只查看 rdx 寄存器还是在结果大于 rax 时触发?
请参考英特尔手册... https://www.felixcloutier.com/x86/mul#flags-affected
如果结果(RDX、EDX、DX 或 AH)的上半部分为零,则 MUL 清除 CF,否则设置。
mul
有两个相同宽度的输入。只有输出是 double-width.
CF 不用于衡量整个事情的溢出,因为两个 64 位被乘数不能产生 129 位结果,所以这种意义上的溢出是不可能的。
CF实际上表示低半部分溢出。原始 8086 没有 non-widening 乘法 (imul ecx, esi
),因此即使您不关心 high-half,也必须使用 mul
或 imul
结果。知道结果仍然适合一个寄存器可能很有用,尤其是在 16 位世界中,比 x86-64 更常见的值比最宽的可用寄存器更宽。