我被困在一些数学上。我正在用 32 位 x86 程序集编程,我试图找出两个数字之间的差异,而实际上更大的数字实际上更小。
这是一个例子。
假设 EAX 为 3,EBX 为 FFFFFFFE hex。
如果我想从 EBX 中减去 EAX,我可以轻松做到:
sub EBX,EAX
我会得到正确的 FFFFFFFB 十六进制值。
但是,如果偶然 EAX 是 FFFFFFFE 十六进制,而 EBX 是 3 并且我想做减法,我可以尝试:
sub EBX,EAX
但是我会得到一个不正确的值与进位集。我想得到的是值 5。我不能使用 64 位寄存器,因为我只有 32 位系统可以使用。
我该如何解决这个问题?
我问这个是因为我创建了一个 tcp/ip 堆栈,我需要跟踪数据,它涉及到永远不会停止累积的序列号。当我的堆栈看到一个文件正在下载时,它会对当时的序列号进行快照,然后当新的数据包进来时,从旧的序列号中减去新的序列号。
当下载足够大并且序列号接近 32 位边界(FFFFFFFF hex)时,这会变得混乱
这是一个例子:
在下载开始时,假设序列号是 FFFFFF00 hex。堆栈捕获此数字。
下载 256 字节后,序列号为 00000001 hex。这对堆栈来说很混乱,因为从 1 中减去 FFFFFF00 十六进制会导致带有进位的错误数字。