2013-05-12 5 views
0

컴파일러에서 outStr을 인쇄하도록 지시하는 printf 문이 있습니다. outStr은 원래 같음으로 설정됩니다. emptybuf [1000] = "아직 번역되지 않았습니다."; 내 대답을 outStr로 옮겨야하는데, outStr은 print 문에서 outStr을 업데이트해야한다.소문자 문자열을 대문자로 변환

인라인 어셈블리는 어떤 이유로 아래 표시된 코드에서 아무 것도 인쇄하지 않습니다. 내가 뭘 잘못하고 있는지 이해할 수 없다. 나는 소문자를 대문자로 변환하려고 시도하고 있으며, 어떤 특수 문자도 무시하고있다. 어떤 조언을 많이 주시면 감사하겠습니다.

mov esi,inStr ;To start off initialize esi point to input string 
mov edi,outStr ;edi point to the output string area 

    ; using esi and edi with [esi] and [edi] as indirect operand 

    ; suggestion to start mov each character to al like --> mov al,[esi] 
    ; test, and manipulate character in al 


     jmp getNext   
getNext: mov al,[esi] 
    cmp al,0 
je exitProc 
     test al,01100000b ;test to see if its a lowercase letter 
     je toUpperCase 
     test al,01000000b 
     mov [edi],al 
     inc esi 
toUpperCase: test al,01000000 
     AND al,11011111b 
     mov [edi],al 
     inc esi 
     jmp getNext 
exitProc: mov outStr, edi 
+0

뭐가 잘못 됐나요? 어떤 오류가 발생하고 있습니까? 어떤 문제가 발생합니까? – FDinoff

+0

FDinoff, 사과드립니다. 관련 C++ 코드로 op를 업데이트합니다. – tmaxxcar

답변

2

여기에 많은 잘못이 있으므로 각 섹션을 별도로 설명해 보겠습니다.

먼저 소문자 테스트 (01100000b 테스트)가 작동하지 않습니다. 둘 다 6 번째 비트가 설정되어 있기 때문에 두 경우 모두 0이 될 수 없습니다.

'z'에 'a'만 대문자로 쓰는지 확인하는 유일한 방법은 해당 범위의 문자를 명시 적으로 비교하는 것입니다. 즉 제거 할 수 있도록,

cmp al,'a' 
    jl noChange 
    cmp al,'z' 
    jle toUpperCase 
noChange: 
    mov [edi],al 
    ... 

그런 다음 mov [edi],al 전의 추가 test al,01000000b 아무것도하지 않습니다 : 그래서 당신의 첫 번째 테스트는 다음과 같이된다.

그리고 이미 대문자 인 브랜치의 문자를 복사하면 루프의 맨 위로 이동해야합니다. 그렇지 않으면 toUpperCase 분기로 넘어 가서 문자를 두 번째로 저장합니다 .

또한 edi를 증가시켜야합니다. 그렇지 않으면 같은 위치에 반복해서 쓰려고합니다.

mov [edi],al 
    inc edi  ; You need to add this 
    inc esi 
    jmp getNext ; You need to add this 

브랜치는 toUpperCase과 동일합니다. 당신은 edi를 증가시킬 필요가 있습니다. 그리고 다시는 아무것도하지 않는 테스트가 있습니다.

toUpperCase: 
    AND al,11011111b 
    mov [edi],al 
    inc edi ; Add this 
    inc esi 
    jmp getNext 

마지막으로 종료 할 때 outStr 끝에 NULL을 추가해야합니다. outStr에 edi를 다시 할당 할 필요가 없습니다. 특히 문자열의 끝을 가리키고 있기 때문에.

exitProc: 
    mov [edi],0 

이제 반복 코드가 많기 때문에 더욱 효율적으로 만들 수 있습니다. 그러나 그게 작동하기 위해서는 이 있어야합니다.

+0

나는이 코드가 현재하지 않는 특수 문자도 무시할 필요가 있음을 깨달았다. –

+0

자, 제가 제안한 변경 사항을 작성했으며, 설명해 주셔서 감사합니다. 그러나, 입력되는 문자열은 "32 [32] 붉은 여우 {(# $ & %)"... 계속 진행되지만 어떤 이유로 든 내 결과는 THE – tmaxxcar

+0

에서 멈 춥니 다. 첫 번째 단어를지나 가지 않습니까? – tmaxxcar

관련 문제