2011-12-11 1 views
0

일부 & T 어셈블리 구문에 문제가 있습니다.대/소문자를 구분하지 않는 문자열 일치

리눅스 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 

이 사건을 coverting위한 섹션이다, 나는 add, sub, andor을 시도하고 난 그냥 질수 일하러. 이것이 실현되지 않은 후에 나는 jz SkipCase을 깨닫는다.

비교 루틴은 주로 nessessary 인 경우 링크 할 다른 질문을 기반으로합니다.

레이아웃 및 과도한 해시에 대한 사과, 잘못된 댓글 달기 스타일.

+0

문제의 제목이 분명히 문법이 아니기 때문에 약간의 오해의 소지가 있습니다. – hirschhornsalz

+0

문제는 어떤 구문을 사용해야할지 모르겠다는 것입니다. 나는 프로그램의 논리가 훌륭하다고 생각하는데, 나는 어디에서 사용할 코드를 명확히해야한다. – TheoVate

+0

음, _sub_ 대신 _cmp_ 또는 _xor_를 사용하는 것이 좋습니다. 피연산자를 변경하지 않는 장점이 있습니다 (하위 코드처럼). 대문자에서 소문자로 변환하려면 코드를 난독 화하고 싶지 않다면'xor $ 20h' 대신'sub $ 20h'을 사용하는 것이 좋습니다. 하지만이 모든 것은 AT & T 문법과 아무 관련이 없습니다. – hirschhornsalz

답변

1

먼저 '엄격하게'문자와 일치 시키려하고, 실패 할 경우 대소 문자를 구분하지 않는 일치를 수행합니다.

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

희망 나는 그것이 정말 어려운이 같은 짧은 게시물에 비트 연산을 설명하기 위해 찾을 수 있습니다 : 당신이 대신해야 할 일은

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 

이 같은 것입니다. 예를 들어, - : 또한


, 난 진짜 암호 루틴이 더 영리해야하기 때문에이 숙제 또는 훈련의 일종 중 하나입니다 추정 문자, 절대로 숫자 또는 기타 문자에 대해 대소 문자를 구분하지 않는 검사 만 수행하십시오.

+0

대단히 고마워요,이게 완벽하게, 정확하게 제가 찾고있는 것입니다. 예, 어셈블리를 사용하는 데 더 유용 할 수있는 제품이 아닙니다. 나는 건방지게 할 수 있을지 궁금해하고 이것에 대한 빠른 견해를 요청한다. AT & T와 AT 사이의 차이점을 겪고있는 문제가 관련된 http://stackoverflow.com/questions/8182165/att-assembly-masked-input 인텔 어셈블리. 완벽한 답장을 보내 주셔서 감사합니다. – TheoVate

+0

@ TheheVate 죄송합니다. 다른 질문은 DOS에 대한 것 같습니다. – Martin

관련 문제