不区分大小写的字符串匹配

时间:2011-12-11 14:57:47

标签: assembly x86

我正在努力解决一些AT& T汇编语法的问题。

我在linux x86上使用“as”编译器。

我正在制作密码程序,但它需要不区分大小写。为了澄清,无论任何特定字符的情况如何,它都应该评估为真。

我正常的评估过程正常工作,我已将其设置为迭代字符串。

#Comparison Routine

    movl $Password, %ebx     #Move the entire hardcoded password into ebx
    movl $buffer_data, %edx  #Move the entire input password into edx
    movl $Password_len, %ecx #Move the length of the input password into ecx

0:  
    movb (%ebx), %al         #Move one byte of the hardcoded password into al
    xorb (%edx), %al         #Compare one byte of the input password to one byte of the hardedcoded
    jz SkipCase              #If they match, jump to SkipCase

##### 

    andb $32, %al   # 
    xorb (%edx), %al

    jz SkipCase
    jnz IncorrectOutput #   

SkipCase:
    inc %ebx                #Iterate through the
    inc %edx                #strings and decrease
    dec %ecx                #the length variable
    jnz 0b                  #if we're not finished, continue
    jmp CorrectOutput       #If all is good, goto CorrectOutput

这是我挣扎的部分,我无法弄清楚如何在案例之间实际转换角色。我知道我需要从中添加或减去32,但有些不对劲。任何意见或建议都会非常有帮助。感谢。

andb $32, %al   # 
xorb (%edx), %al

这是用于转换案例的部分,我尝试了addsubandor,但我无法让它发挥作用。我知道jz SkipCase之后这不是必须的。

比较例程主要基于这里的另一个问题,如果有必要,我将链接。

为布局和过度哈希道歉,我知道糟糕的评论风格。

1 个答案:

答案 0 :(得分:1)

我看到你首先尝试严格匹配字符,当失败时你继续进行不区分大小写的匹配。

andb $32, %al     # this 'and' operation only leaves the $32 bit if it is 
                  # present in al, all other bits are set to 0

# al is now either 0 (for a lower case character)
# or $32 (for an upper case character)

xorb (%edx), %al  # so this operation will become zero if the upper case 
                  # bit ($32) is set in the hardcoded password character

你需要做的是这样的事情:

xorb $32, %al     # invert case of the character by toggling the upper case bit
cmp (%edx), %al   # try to match again
je SkipCase

希望有所帮助,我发现在这样的短文中解释位操作真的很难。 :)


另外,我认为这可能是家庭作业或某种练习,因为真正的密码例程必须更加聪明 - 例如只对字母执行不区分大小写的检查,从不对数字或其他字符执行。