我正在努力解决一些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
这是用于转换案例的部分,我尝试了add
,sub
,and
和or
,但我无法让它发挥作用。我知道jz SkipCase
之后这不是必须的。
比较例程主要基于这里的另一个问题,如果有必要,我将链接。
为布局和过度哈希道歉,我知道糟糕的评论风格。
答案 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
希望有所帮助,我发现在这样的短文中解释位操作真的很难。 :)
另外,我认为这可能是家庭作业或某种练习,因为真正的密码例程必须更加聪明 - 例如只对字母执行不区分大小写的检查,从不对数字或其他字符执行。