2010-05-08 8 views
0
org 0x100 
SEGMENT .CODE 
    mov ah,0x9 
    mov dx, Msg1 
    int 0x21 

    ;string input 
    mov ah,0xA 
    mov dx,buff 
    int 0x21 
    mov ax,0 
    mov al,[buff+1]; length 

    ;string UPPERCASE  
    mov cl, al 
    mov si, buff 
    cld 
loop1: 
    lodsb; 
    cmp al, 'a' 
    jnb upper 
loop loop1 
;output 
mov ah,0x9 
mov dx, buff 
int 0x21 

exit: 
    mov ah, 0x8 
    int 0x21 
    int 0x20 
upper: 
    sub al,32 
    jmp loop1 
SEGMENT .DATA 
Msg1 db 'Press string: $' 
buff db 254,0 

이 코드는 작동하지 않습니다. 문제는 jnb upper에 있다고 생각합니다. 이 프로그램은 소문자를 대문자로 만들어야합니다.asm 프로그램이 작동하지 않습니다. (nasm)

+1

무엇이 당신의 질문입니까? 단순히 약간의 코드를 설명하고 성능 저하에 대한 가정을합니다. – Oded

+0

내 프로그램이 작동하지 않는 이유를 모르겠습니다. – GLeBaTi

+1

그는 소문자를 대문자로 변환하려고한다고 생각합니다. – nc3b

답변

1

내 문제를 발견했다 : 텍스트를 입력 할 때 '$'- 추가되지 않았습니다.

+0

+1 후속 조치 –

1

소문자에서 대문자로 문자열을 변환하려는 것 같습니다. 당신이 대문자로 소문자로 변환하려는 경우, 당신은 'A'에의 범위에서 문자를 확인해야

cmp al, 'a' 
jnb upper 

'Z : 문제는 당신은 문자'A '에 대해 입력을 비교하는 것입니다 '이고 한 번 해당 범위에 있으면 32를 뺍니다.

또한 대문자 숯을 다시 메모리에 쓰고 싶다고 생각합니다. upper. 당신이하고있는 일은 레지스터를 업데이트하는 것인데, 그 다음에 다음 번 반복에서 덮어 쓸 것입니다. loop1.

도움이 되었습니까?

+1

jnb upper : a보다 크거나 같으면 _only_로 점프합니다. 나는 그가 다른 어떤 비교를 할 필요가 없다고 생각한다. 버퍼에 값을 다시 쓰지 않는다는 사실은 진정한 문제입니다. – nc3b

+0

그리고 내가해야 할 일은 무엇입니까? (나는 오래 전에 어셈블러를 배우기 시작하지 않았다.) – GLeBaTi

+0

@ nc3b - 잘 잡았다.하지만 그는 여전히 'z'보다 크지 않다는 것을 확인해야한다. –

관련 문제