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 很奇怪。 overFlow 和 underFlow 标签是 return 调用 correctFlow 的标签。这是故意的,据我所知,与问题无关。
发生这种情况是因为 jg
和 jl
将 cmp
的结果视为两个操作数是 有符号 数字。
7Ah
和8Dh
分别代表有符号数+122和-115。显然,后者是最小的。
你需要的是unsigned比较。请改用指令 ja
和 jb
。
我有以下说明作为凯撒密码程序的一部分。
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 很奇怪。 overFlow 和 underFlow 标签是 return 调用 correctFlow 的标签。这是故意的,据我所知,与问题无关。
发生这种情况是因为 jg
和 jl
将 cmp
的结果视为两个操作数是 有符号 数字。
7Ah
和8Dh
分别代表有符号数+122和-115。显然,后者是最小的。
你需要的是unsigned比较。请改用指令 ja
和 jb
。