Get a string in assembly

di il
16 risposte

Get a string in assembly

Buon pomeriggio,

Scrivi perché avrei bisogno di alcune delucidazioni su come si possa ottenere una stringa da tastiera in assembly.

Grazie mille 

Per ottenere un carattere da tastiera e fare l'echo faccio 

Getche:
;get a char
XOR AH,AH
INT 16H
;print char
MOV AH,0EH
MOV BH,0
INT 10H
Ret

Per ottenere una stringa pensavo di fare più o meno così 

Getstr:
Getstrloop:
CALL getche
CMP AL,8 ;backspace
JE backspace 
CMP AL,13 ;enter
JE exit
MOV [SI],AL
INC SI
JMP Getstrloop

backspace:
DEC SI
;come cancello il carattere dallo schermo?
JMP Getstrloop

Exit: ;aggiunge 0 a fine stringa 
INC SI
XOR AL,AL
MOV [SI],AL
RET

16 Risposte

  • Re: Get a string in assembly

    Sull'altro forum ti avevo detto di inizializzare ES DI perché avevi utilizzato quei registri, adesso hai cambiato e usi SI ma è uguale va inizializzato.

    E va impostato, come ti avevo detto, sull'indirizzo iniziale di un buffer di memoria che non hai ancora previsto. 

  • Re: Get a string in assembly

    Si scusa hai ragione, mi potresti mostrare brevemente come si fa?

  • Re: Get a string in assembly

    Cosa usi per compilare?

  • Re: Get a string in assembly

    Nasm come assemblatore e VisualBox per eseguire…

  • Re: Get a string in assembly

    Non uso assembler ( o assembly che a dir si voglia )  da quando giocava Van Basten, quindi potrei essere un po arrugginito


    Per semplificare la vita e per stampare la stringa ho usato la funzione 21/9 del dos, ma la parte che ho provato a vedere è quella di cancellare il carattere. Occhio che non ho controllato eventuali uscita di buffer o altro.

    Per cancellare leggo la posizione del cursore, torno indietro di un carattere e stampo uno spazio vuoto. Se ho capito bene uno dei problemi era questo.

    p.s. dimenticavo, assemblato con tasm, non se sia compatibile con nasm/masm.

    .model tiny
    .radix 16
    .code
    org 100
    inizio:
        call getstr
        mov ah,9
        mov dx,offset cr
        int 21h
    
        mov ah,9
        mov dx,offset testo
        int 21h
        int 20                        ; fine
    
    getche:
        XOR AH,AH
        INT 16H
        CMP AL,20H
        JL FineChe
        MOV AH,0EH
        MOV BH,0
        INT 10h
      FineChe:
    
        Ret
    
    
    Getstr:
        mov dx,offset testo
      Getstrloop:
        CALL getche
        CMP AL,08h ;backspace
        JE backspace
        CMP AL,0dh ;enter
        JE exit
        push bx
        mov bx,dx
        MOV [bx],AL
        pop bx
        INC dx
        JMP Getstrloop
    
      backspace:
        DEC dx
        call tornaindietro
        ;come cancello il carattere dallo schermo?
        JMP Getstrloop
    
      Exit: ;aggiunge $ alla fine per stampare
        mov al,24h
        ;inc dx
        push bx
        mov bx,dx
        MOV [bx],AL
        pop bx
        RET
    
    TornaIndietro:
        push ax
        push bx
        push dx
        
        mov ah,0fh ; per ottenere la pagina
        int 10h
        
        mov ah,3h ; legge posizione cursore
        int 10h
        dec dl
        
        mov ah,2 ; posiziona il cursore
        int 10h
    
    
        MOV AH,0EH
        mov al,20h ; stampa spazio vuoto
        MOV BH,0
        INT 10h
        
        mov ah,2 ; posiziona il cursore
        int 10h
    
        pop dx
        pop bx
        pop ax
        ret;
    
    testo    db "                   $"
    cr       db "",0ah,0dh,"$"
    
    end inizio
    
  • Re: Get a string in assembly

    Grazie mille per il vostro contributo 

  • Re: Get a string in assembly

    Attento che nell'esempio è stato usato 

    int 21h

    che presuppone la presenza del DOS.

    Se tu hai a disposizione solo il BIOS non puoi usare l'int 21h

  • Re: Get a string in assembly

    Si grazie, al posto di int 21h metto la mia procedura corrispondente

  • Re: Get a string in assembly

    Ciao di nuovo, approfitto del forum già avviato per chiedere come si possa scrivere una funzione per ottenere in input un numero in al.

    questa è la mia bozza…grazie mille

    getNB: ;[AL = output number]
    getNB_loop:
         xor ah,al
         int 16h
    	 cmp al,'0'  ; verifica se l'input è minore di 0
         jb getNB_loop
         cmp al,'9'  ; verifica se l'input e minore di 9 
         jbe getNB_sec  ; ma siamo sicuri essere maggiore o uguale a 0
         jmp getNB_loop
    getNB_sec:
         mov ah,0x0E	; The function to display a chacter (teletype)| stampa il numero
         mov bh,0x00	; Page number                                 |
         mov bl,0x07	; Normal text attribute                       |
    	 int 0x10
         sub al,'0' ; converte il numero da ascii in intero
    ret
  • Re: Get a string in assembly

    No, per un nuovo argomento un nuovo thread con titolo adeguato.

    E comunque non puoi mandare una bozza di codice pensando che ti venga completato.

  • Re: Get a string in assembly

    19/12/2023 - oregon ha scritto:


    No, per un nuovo argomento un nuovo thread con titolo adeguato.

    E comunque non puoi mandare una bozza di codice pensando che ti venga completato.

    Il codice è completo, volevo solo sapere se ha senso 

  • Re: Get a string in assembly

    Se intendi un valore da 0 a 9 sì

    In ogni caso devi seguire le regole del forum. Per un nuovo argomento un nuovo thread

  • Re: Get a string in assembly

    Ok grazie mille, scusate…

  • Re: Get a string in assembly

    18/12/2023 - dobby ha scritto:


    inizio: call getstr mov ah,9 mov dx,offset cr int 21h mov ah,9 mov dx,offset testo int 21h int 20 ; fine getche: XOR AH,AH INT 16H CMP AL,20H JL FineChe MOV AH,0EH MOV BH,0 INT 10h FineChe: Ret Getstr: mov dx,offset testo Getstrloop: CALL getche CMP AL,08h ;backspace JE backspace CMP AL,0dh ;enter JE exit push bx mov bx,dx MOV [bx],AL pop bx INC dx JMP Getstrloop backspace: DEC dx call tornaindietro ;come cancello il carattere dallo schermo? JMP Getstrloop Exit: ;aggiunge $ alla fine per stampare mov al,24h ;inc dx push bx mov bx,dx MOV [bx],AL pop bx RET TornaIndietro: push ax push bx push dx mov ah,0fh ; per ottenere la pagina int 10h mov ah,3h ; legge posizione cursore int 10h dec dl mov ah,2 ; posiziona il cursore int 10h MOV AH,0EH mov al,20h ; stampa spazio vuoto MOV BH,0 INT 10h mov ah,2 ; posiziona il cursore int 10h pop dx pop bx pop ax ret; testo db " $" cr db "",0ah,0dh,"$"

    ciao, ho provato il codice, ma il compilatore NASM genera questo errore:

    error: comma, colon, decorator or end of line expected after operand generato da:

     mov dx,offset testo
     ;come può risolvere?
     ;grazie mille
Devi accedere o registrarti per scrivere nel forum
16 risposte