忽略示例代码中的错误(请参阅 Aki 的答案)...
如果您尝试添加一对 24 位数字;那么第一个 24 位数字是正数,因为该数字的符号位在您移入 DL 的 0 的第 7 位(在mov dl,0
指令中)。第二个 24 位数也是正数,因为它的符号位在您添加到 DL 的 0 的第 7 位(在adc dl,0
指令中)。
在这种情况下,加法的结果将为正(加 2 个正数将给出正结果),并且 CPU 的符号标志将正确显示将 24 位数字相加的结果为正。CPU 的进位标志和溢出标志也将正确(并且都将被清除);因此您可以使用js
,jg
和之类的指令正常测试它们jo
(即使您知道它们都很清楚并且条件分支可以被删除或转换为jmp
)。CPU 的奇偶校验标志和零标志可能是错误的(例如,零标志只会说明最高 8 位是否全为零,而不会告诉您整个 24 位是否全为零)。
但是,如果您认为您正在添加带符号的 16 位数字(并试图获得 24 位结果),那么您做错了并且会得到错误的结果。要添加带符号的 16 位数字并获得 24 位结果,您必须对 16 位数字进行“符号扩展”以使其成为 24 位,而不是“零扩展”这些数字。例如,16 位(负)数 0xCDEF 应变为 24 位(负)数 0xFFCDEF,而不是 24 位(正)数 0x00CDEF。
另一种选择是像往常一样添加 16 位数字,然后将结果符号扩展为 24 位。这仅在 16 位加法没有溢出时才有效,并且如果加法不能溢出,那么您不需要 24 位结果开始。