检查哪个数字更大的程序

问题描述

我正在学习汇编 (8086),我们学习了跳转,我们被告知要编写一个程序,该程序将从 2 个存储单元中获取 2 个数字,并将较大的一个放入另一个存储单元中。 所以我写道:

mov al,[0]
mov bl,[1]
cmp al,bl
js eq
jns noteq
eq:
    mov [10h],bl
    jmp end
noteq:
    mov [10h],al
    jmp end
end:
    hlt

但有人告诉我它不起作用,因为我需要将 jsjns 更改为 jcjnc,以防两个数字都是负数,但是当我在模拟器上运行它时,它可以双向工作。谁是对的?我或老师,或者我们两种方法都行得通?如果你说老师,请解释原因,因为老师不能。

编辑:我们只能使用 JC JNC JZ JNZ JS JNS

解决方法

数字必须是无符号的,因为如果不检查 OF,就不能正确地进行有符号比较(在减法有符号溢出的情况下获得正确答案,例如在 AL=127,BL=-1 上)。

因此您需要使用 jb(下面未签名),也就是 jc。谈论“负”数字会混淆这个问题;他们实际上希望你做一个无符号比较。但是是的,您的代码有问题的情况是当数字相差 128 或更多时,例如 10 al-bl 的 MSB(进入 SF,符号位)不是您的条件重新寻找。即它不同于CF中的结转(借)。

请注意,JL(小于号符号)是 SF ≠ OF (https://www.felixcloutier.com/x86/jcc)。

另见http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt re:签名溢出与结转。