x86 汇编中的凯撒密码问题

Problem with Caesar cipher in x86 assembly

我有以下说明作为凯撒密码程序的一部分。

overFlow:
    sub bl, 1Ah
    ret

underFlow:
    add bl, 1Ah
    ret

correctFlow:
    cmp bl, 7Ah
    jg overFlow
    cmp bl, 61h
    jl underFlow
    ret

enc_byte:
    add bl, encOffset
    call correctFlow
    ret

一个 ASCII 小写字母被放入 BL 并且在调用 enc_byte 之后,它将字母移动 encOffset 个字母并纠正溢出。

但由于某些原因,correctFlow 中的比较无法正常工作。当correctFlow中的BL=8Dh时,jg overFlow指令不跳转,而是jl underFlow在第二个cmp之后跳转。为什么会这样? 8Dh明明大于7Ah,为什么跳不起来呢?

我知道 return 很奇怪。 overFlowunderFlow 标签是 return 调用 correctFlow 的标签。这是故意的,据我所知,与问题无关。

发生这种情况是因为 jgjlcmp 的结果视为两个操作数是 有符号 数字。

7Ah8Dh分别代表有符号数+122和-115。显然,后者是最小的。

你需要的是unsigned比较。请改用指令 jajb