CSAPP-3.55 32位机实现64位乘

举个例子,求10进制的12x34的最后两位 (10+2)x(30+4),括号展开,不必算10x30。
个位为 2x4
十位为(2x4+3x1+0)%10
同理计算64位乘,(高32+低32)x(高32+低32)
结果低32 = 低 * 低
结果高32 = 高 * 低 + 低 * 高 + 低 * 低的进位

typedef long long ll_t;
void store_prod(ll_t* dest, int x, ll_t y) {
	 *dest = x * y;
}
movl 16(%ebp), %esi y32esi
movl 12(%ebp), %eax xeax
movl %eax, %edx
sarl $31, %edx    x32变成(高32+32),x32edx
movl 20(%ebp), %ecx
imull %eax, %ecx x * y
movl %edx, %ebx
imull %esi, %ebx y * x
addl %ebx, %ecx   *  +  * 
mull %esi        x * y低无符号乘,进位存edx,基位存eax
leal (%ecx,%edx), %edx 加进位
movl 8(%ebp), %ecx
movl %eax, (%ecx)
movl %edx, 4(%ecx)

如果是正数相乘那很easy,但负数涉及补码取反+1,需仔细体会下。
int32太长,假设int是8位。
算0x0000 0001 0000 0010乘0x1111 1101。即258乘-3
y高1低2,x是-3
显然,最后结果高8位有效数应为-3,低8位为-6
y 00000001(1) 00000010(2) 高1低2
x 11111111(-1) 11111101(-3)高-1低-3

x低y高 -3 (0x11111101)
y低
x高 -2 (0x11111110)
低*低 -6进1 (0x00000001) (低低无符号乘, 得0x000000001 11111010)
最后3个相加-3-2+1=-4 (这是结果的高8位)
最后结果0x11111100 11111010 (高-4,低-6)
取反+1,高3低6 (是整体取反,故只有低+1)

试想为什么算出来是-4,有效数却为3?
试想如果y低8位为4,高8位算出来还是-4?(提示:乘4相当于左移2)
试想如果y低8位为5,进位绝对是4? (提示:5=4+1)
试想如果y低8位为n,进位绝对是n-1?