Search code examples
assemblyx86dostasm16-bit

Split strings on Assembly x86 16-bit


I'm trying to write a program that reads 3 strings from the keyboard and then display 2 strings in lowercase and the last one in uppercase. Here's what I've got till now: I can read the string, but then it converts everything to uppercase. Is there anyway to convert only the last string? Thanks in advance

.MODEL SMALL
.DATA
    MSG  DB  0DH,0AH, 'ENTER A STRING: $'
    MSG2 DB  0DH,0AH, ' YOUR STRING IS  :-----> :  $'
    STR1 DB  255 DUP(?)
.CODE
BEGIN:

    MOV AX,@DATA
    MOV DS,AX

    LEA DX,MSG  
    MOV AH,09H
    INT 21H

    LEA SI,STR1 
    MOV AH,01H

READ:
    INT 21H 
    ;MOV BL,AL

    CMP AL,0DH
    JE  DISPLAY

    SUB AL,20H
    MOV [SI],AL
    INC SI

    ;CMP BL,0DH
    JMP READ

DISPLAY:

    MOV AL,'$'  ;caracter '$'
    MOV [SI],AL ;

    LEA DX,MSG2 
    MOV AH,09H  
    INT 21H 


    LEA DX,STR1 
    MOV AH,09H  
    INT 21H

    ; MOV AH,4CH
    ; INT 21H

.EXIT
END BEGIN

I'm using TASM.


Solution

  • Thank you everyone for your comments. I was able to solve it this way:

    .MODEL SMALL
    .STACK 100h
    .DATA
        Mensagem1  DB  "Meu Prompt>>",'$',13,10
        first DB  80 DUP (?)
    .CODE
        MOV AX, @DATA
        MOV DS, AX
        LEA DX, Mensagem1
        MOV AH, 9
        INT 21H
        LEA SI, first   
    READ:
        MOV AH, 01H
        INT 21H
        CMP AL, 13
        JE  DONE
        OR AL, 20H
        MOV [SI], AL
        INC SI
        CMP AL, 20H
        JE READ2
        JMP READ
    READ2:
        INT 21H
        CMP AL, 13
        JE  DONE
        OR AL, 20H
        MOV [SI], AL
        INC SI
        CMP AL, 20H
        JE READ3
        JMP READ2
    READ3:
        INT 21H
        CMP AL, 13
        JE  DONE
        XOR AL, 20H
        MOV [SI], AL
        INC SI
        JMP READ3
    DONE:
        MOV AL, '$'
        MOV [SI], AL
        LEA DX, Mensagem1
        MOV AH, 9
        INT 21H
        LEA DX, first
        MOV AH, 9
        INT 21H
        MOV AH,4CH
        INT 21H
    END