在程序集x86中检查字母是否大写

时间:2017-04-29 15:57:09

标签: assembly x86

我有一个存储在变量中的字符串

.data          
     stuff: .ascii    "lol\n"

我想检查字母是否大写,“l”或“L”,但我的比较不起作用

movl $stuff, %ecx   
movl (%ecx), %eax

cmp $0x41, %eax              #compara com "A"
jl next  

在比较中我做错了什么?不,代码不完整。

2 个答案:

答案 0 :(得分:1)

如果您正在调试汇编语言,则必须学习如何使用调试器。使用您的代码随时可能出现一百万件小问题,通过在stackoverflow上为每个问题发布一个问题,一次解决一百万个小东西将非常耗时。 < / p>

您正在使用movl指令将ecx指向的内存地址的内容加载到eax。现在,eax是一个32位寄存器,因此您从该存储器地址加载32位。 32位是4个字节。 stuff内存位置定义为.ascii,因此它包含字节。因此,您将整个“lol”和后面的换行符加载到eax,这将是一些巨大的数字,如0x0d6d6f6d,然后您将其与0x41进行比较,这显然是不管用。

您需要从ecx指向的内存位置加载单个字节,而不是4个字节。 (或者,或者你需要在单独的双字中存储“l”,“o”,“l”和“\ n”,但这样做会很浪费。)

答案 1 :(得分:0)

假设正在使用ASCII,您可以通过测试第5位确定它是否为大写字符。

Char 'A' = 65 = 0100 0001
Char 'a' = 97 = 0110 0001

所以你需要的只是一个简单的位测试

在您的示例代码中,您似乎正在尝试比较所有字符以查看它们是否是字符A,如果消息中的字符是字符A,而不是任何其他字符,则该字符仅起作用。