0

假设您有一个数字存储在EAX. 如何检查此数字是否代表大写字符?

坦白说,我什么都没试过。我最接近的想法是创建一个大写字符数组('A','B','C,'D',...),然后检查是否EAX等于其中任何一个。在 NASM 装配中有更简单的方法吗?

我正在使用 64 位 CentOS,用于 32 位程序。

4

3 回答 3

3

如果您的字符是用 ASCII 编码的,那么您只需检查EAX是否在 65 到 90 的范围内(“A”到“Z”)。对于其他编码(primis 中的 Unicode,考虑变音符号),我认为答案一点也不简单,您最终应该使用操作系统中的 API。

于 2013-10-23T06:06:20.737 回答
1

对于 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
于 2013-10-23T07:49:06.410 回答
0

假设您可以破坏迈克尔答案的一个更简单的版本al

sub al, 'A'
cmp al, 'Z' + 1 - 'A'
setc al ; al now contains 1 if al contained an uppercase letter, and 0 otherwise

如果要分支,则根据需要将其替换setcjcjnc

于 2013-10-23T14:14:06.040 回答