假设您有一个数字存储在EAX
. 如何检查此数字是否代表大写字符?
坦白说,我什么都没试过。我最接近的想法是创建一个大写字符数组('A','B','C,'D',...),然后检查是否EAX
等于其中任何一个。在 NASM 装配中有更简单的方法吗?
我正在使用 64 位 CentOS,用于 32 位程序。
如果您的字符是用 ASCII 编码的,那么您只需检查EAX
是否在 65 到 90 的范围内(“A”到“Z”)。对于其他编码(primis 中的 Unicode,考虑变音符号),我认为答案一点也不简单,您最终应该使用操作系统中的 API。
对于 ASCII 字符,这样的事情会起作用:
cmp eax,'A'
setnc bl ; bl = (eax >= 'A') ? 1 : 0
cmp eax,'Z'+1
setc bh ; bh = (eax <= 'Z') ? 1 : 0
and bl,bh ; bl = (eax >= 'A' && eax <= 'Z')
; bl now contains 1 if eax contains an uppercase letter, and 0 otherwise
假设您可以破坏迈克尔答案的一个更简单的版本al
:
sub al, 'A'
cmp al, 'Z' + 1 - 'A'
setc al ; al now contains 1 if al contained an uppercase letter, and 0 otherwise
如果要分支,则根据需要将其替换setc
为jc
或jnc
。