Annuncio

Collapse
No announcement yet.

Programmare in Assembly

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts

  • Programmare in Assembly

    Salve a tutti.

    Come da titolo, apro questo topic per fare alcune domande sul linguaggio assembly.

    Premetto che non ho intenzione di realizzare nessun c**k(), ma mi servono alcune cose per l'esame di "architettura degli elaboratori".

    Precisamente.

    Posto il codice:
    Spoiler:

    name "programma"

    org 100h


    stampacaratteri macro messaggio

    lea dx,messaggio ;stampa la stringa
    mov ah,09h
    int 21h
    endm

    stampacaratteri MSG
    stampacaratteri ACAPO

    lea dx,stringa_letta ;legge la stringa
    mov ah,0ah
    int 21h



    mov cx,stringa_letta[1]
    mov si,2

    converti:
    sub stringa_letta[SI],'0' ;sottrae ad ogni elemento del vettore il codice ascii di 0, in modo da ottenere il numero.



    inc si
    loop converti

    mov cx,stringa_letta[1]
    mov si,2
    dividi:

    mov ax,stringa_letta[si]
    mov temp,ax
    mov dl,255
    div dl
    cmp dx,0
    je incrementa_pari
    jmp continuaciclo

    incrementa_pari:
    inc contatore


    continuaciclo:
    inc si
    loop dividi




    ret

    temp Dw 0
    contatore DB 0
    MSG DB 'Inserisci una sequenza di valori:$'
    ACAPO DB 10,13,'$'

    stringa_letta DB 21,?,21 dup ('$')



    (le scritte dopo i ";" sono commenti)

    In sostanza, il programma, legge una stringa di numeri, li sottrae il codice ascii in modo da ottenere il numero effettivo, e poi con una divisione controlla se i numeri sono pari o dispari, e ne conta il numero.

    Il problema sussiste quando voglio leggere i numeri dalla stringa acquisita.

    Controllando un po' le variabili con il debugger, ho visto che all'istruzione

    mov cx,stringa_letta[1]

    cx vale 300 e qualcosa, invece dovrebbe valere il numero dei caratteri inseriti, perchè nella seconda posizione della stringa, c'è effettivamente il numero dei caratteri inseriti (ho controllato con il debugger).


    Non so se qualcuno mi risponderà, considerando che già è stato difficile trovare qualcuno che conoscesse java...

    p.s. ho messo in nero la linea di codice problematica.
    Last edited by Smallman_647; 24 January 2011, 17:46.

    perchè lo hai detto tu che sei ogni sapiente

  • #2
    Allora, ieri ho risolto il problema, ma mi sono scordato di scriverlo.

    Praticamente, avevo 2 problemi che erano legati dallo stesso motivo.

    Sbagliavo nel fare ciò,

    mov cx,stringa_letta[1]

    perchè in questo modo chiedi al compilatore di passare al registro un valore a 16 bit (essendo il registro a 16 bit), mentre bisogna passare il valore al registro a 8 bit, che in questo caso è cl (ovvero la parte bassa di cx), e porre a 0 la parte alta di cx, ovvero ch.

    Quindi, questa istruzione:

    mov cx,stringa_letta[1]

    diventa:

    mov ch,0
    mov cl,stringa_letta[1]


    e lo stesso vale per ax, o qualsiasi registro a 16 bit.

    Quindi, il codice completo e corretto è:

    Spoiler:
    name "programma"

    org 100h


    stampacaratteri macro messaggio

    lea dx,messaggio ;stampa la stringa
    mov ah,09h
    int 21h
    endm

    stampacaratteri MSG
    stampacaratteri ACAPO

    lea dx,stringa_letta ;legge la stringa
    mov ah,0ah
    int 21h

    mov al,stringa_letta[1]
    mov ncaratteri,al


    mov ch,0
    mov cl,stringa_letta[1]

    mov si,2

    converti:
    sub stringa_letta[SI],'0' ;sottrae ad ogni elemento del vettore il codice ascii di 0, in modo da ottenere il numero.



    inc si
    loop converti


    mov ch,0
    mov cl,stringa_letta[1]
    mov si,2
    dividi:
    mov ah,0
    mov al,stringa_letta[si]
    mov dl,2
    div dl
    cmp ah,0
    je incrementa_pari
    jmp continuaciclo

    incrementa_pari:
    inc contatore


    continuaciclo:
    inc si
    loop dividi

    mov al,ncaratteri
    sub al,contatore

    cmp contatore,al

    je nuguali
    ja npari
    jb ndispari
    jmp continuaciclo2

    nuguali:
    stampacaratteri ACAPO
    stampacaratteri MSG2
    jmp continuaciclo2

    npari:
    stampacaratteri ACAPO
    stampacaratteri MSG3
    jmp continuaciclo2

    ndispari:
    stampacaratteri ACAPO
    stampacaratteri MSG4
    jmp continuaciclo2

    continuaciclo2:
    ret

    ncaratteri DB 0
    contatore DB 0
    MSG DB 'Inserisci una sequenza di valori:$'
    MSG2 DB "Il numero dei caratteri pari e dispari e' uguale.$"
    MSG3 DB "Valori pari in maggioranza.$"
    MSG4 DB "Valori dispari in maggioranza.$"
    ACAPO DB 10,13,'$'

    stringa_letta DB 21,?,21 dup ('$')


    perchè lo hai detto tu che sei ogni sapiente

    Comment

    Working...
    X