in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

Assembler... dal principio

Ultimo messaggio ricevuto il 26-05-2005 10.36 da Deep_Core. 5 risposta(e).
Pagina 1 di 1 (6 elemento/i)
Ordina messaggi: Precedente Successivo
  • 23-05-2005 18.32

    • silent83
    • Utente Top 500
    • Registrato il 23-05-2005
    • Messaggi 3

    Assembler... dal principio

    Salve a tutti, sono nuovo di questo forum e vorrei fare i miei complimenti alle persone che hanno realizzato questo sito per approfondimenti sui vari linguaggi di programmazione.

    Veniamo al punto, siccome dovrei fare un esame (utilizzando il MASM) vorrei sapere se c'è in questo forum un qualche articolo o tutorial che spieghi l'assembler passo passo, con le relative spiegazioni ai vari codici inseriti nel programma.
    infine c'è da dire che io per quanto riguarda questo linguaggio di programmazione parto da zero, ecco perchè spero in voi per qualche aiuto.

    Vi ringrazio già anticipatamente
    • No log
  • 25-05-2005 10.08 In risposta a

    • Deep_Core
    • Utente Top 10
    • Registrato il 05-01-2004
    • Italy - Trieste
    • Messaggi 319

    Re: Assembler... dal principio

    La migliore risorsa da utilizzare nel tuo caso è la documentazione ufficiale rilasciata dalla Microsoft. Inoltre, prima d'iniziare, ti consiglio di leggere la documentazione Intel sull'architettura e il funzionamento dei processori x86, che troverai allo stesso indirizzo sopra indicato (oltreché sul sito della casa madre). Conoscere detta documentazione è la conditio sine qua non per capire a fondo la programmazione in Assembler compatibile con l'architettura Intel. Potrebbe esserti altresì utile la lettura di alcuni dei miei articoli riguardanti la Programmazione Win32 con Microsoft MASM (sebbene tu non abbia specificato se devi scrivere un'applicazione a 16 o a 32 bits!), dove troverai trattati alcuni argomenti di base sulla programmazione in MASM per piattaforme Windows. 8-) Devo comunque avvisarti che tutto il materiale da me menzionato e consigliato non è stato pensato per un pubblico di programmatori in erba (nell'accezione più generale del termine!). :-( Buono studio! ;-)
    • No log
  • 25-05-2005 20.16 In risposta a

    • silent83
    • Utente Top 500
    • Registrato il 23-05-2005
    • Messaggi 3

    Re: Assembler... dal principio

    Dovrei creare programmi tipo questo:

    ;programma che acquisisce 2 numeri da tastiera,ne esegue la somma
    ;e visualizza il massimo dei due valori
    ;============================SEGMENTO STACK==============================
    STACK SEGMENT PARA STACK 'STACK'
    DB 100H DUP(0)
    STACK ENDS
    ;============================SEGMENTO DATI==============================
    DATA SEGMENT PARA PUBLIC 'DATA'
    MAGGIORE DB 0
    TOTALE DB 5 ;quanti numeri contiene il vettore
    VETTORE DB 5 DUP(0)
    SOMMA DW 0 ;risultato della somma
    DIECI DB 10 ;conversione ASCII-numero
    DIECIW DW 10 ;conversione nuero-ASCII
    ACCAPO DB 13,10,'$'
    MSGX DB 'IMMETTERE UN VALORE : $'
    MSG1 DB 'LA SOMMA RISULTA= $'
    MSG2 DB ': $'
    MSG3 DB 'IL MASSIMO ? $'
    DATA ENDS
    ;============================SEGMENTO CODICE============================
    CODE SEGMENT PARA PUBLIC 'CODE'
    MAIN PROC FAR
    ;================prologo standard=========================
    ASSUME CS:CODE
    PUSH DS
    XOR AX,AX
    PUSH AX
    MOV AX,DATA
    MOV ES,AX
    ASSUME ES:DATA
    MOV DS,AX
    ASSUME DS:DATA
    ;=======================MAIN=====================
    CALL ACQUISIZIONE
    CALL CALCOLO
    CALL OUTPUT
    CALL MASSIMO
    CALL OUTPUT1
    RET
    ;=========================PROCEDURE=======================
    ;-------------------------------------------------------------------------
    INPUT PROC NEAR
    XOR DX,DX
    LEA DX,MSGX
    CALL VISUAL
    CALL INPUT_N ;acquisisce un valore e pone il risultato in AL
    RET
    INPUT ENDP
    ;-------------------------------------------------------------------
    ACQUISIZIONE PROC NEAR
    XOR AX,AX
    XOR BX,BX
    XOR CX,CX
    MOV CL,5
    CICLO: CALL INPUT
    MOV VETTORE[BX],AL
    INC BX
    LOOP CICLO
    RET
    ACQUISIZIONE ENDP
    ;-------------------------------------------------------------------
    CALCOLO PROC NEAR
    XOR AX,AX
    XOR BX,BX
    XOR CX,CX
    MOV CL,TOTALE
    CICLOX: ADD AL,VETTORE[BX]
    INC BX
    LOOP CICLOX
    MOV SOMMA,AX
    RET
    CALCOLO ENDP
    ;==================================================================
    MASSIMO PROC NEAR
    XOR AX,AX
    XOR BX,BX
    XOR CX,CX
    XOR DX,DX

    MOV CL,VETTORE[BX]
    INC BX
    MOV DL,VETTORE[BX]
    INC BX
    CMP CL,DL
    JB MASS
    MOV MAGGIORE,CL
    JMP FINE
    MASS: MOV MAGGIORE,DL
    FINE: RET
    MASSIMO ENDP
    ;-------------------------------------------------------------
    OUTPUT1 PROC NEAR
    PUSH AX
    PUSH DX
    LEA DX,MSG3
    CALL VISUAL
    MOV AL,MAGGIORE
    CALL STAMPA_N
    LEA DX,ACCAPO
    CALL VISUAL
    POP DX
    POP AX
    RET
    OUTPUT1 ENDP
    ;------------------------------------------------------------
    OUTPUT PROC NEAR
    PUSH AX
    PUSH DX
    LEA DX,MSG1 ;'LA SOMMA è= $'
    CALL VISUAL ;stampa stringa puntata da DS:DX mediante INT 21h,09h
    MOV AX,SOMMA
    CALL STAMPA_N ;stampa il risulato
    LEA DX,ACCAPO ;passaggio alla riga successiva
    CALL VISUAL
    POP DX
    POP AX
    RET
    OUTPUT ENDP
    ;-------------------------------------------------------------------------
    ;Input di numero decimale < 256 (byte)da tastiera: in AL
    Input_N PROC NEAR
    PUSH BX
    PUSH CX
    PUSH DX
    XOR AX,AX ;Inizializza AX
    MOV CX,5 ;Lettura di massimo 3 caratteri
    Ciclo1: CALL Char_N ;Input di un carattere ASCII in DL
    CMP DL,13 ; INVIO = DEC 13 in ascii
    JE VerificaB ;E' stato premuto INVIO?
    SUB DL,'0' ;Conversione ASCII-numero
    MUL dieci ;AX <- dieci * AL
    ADD AL,DL
    LOOP Ciclo1 ;salta se meno di tre cifre
    VerificaB: CMP AX,256
    JB Fuori ;E' stato effett letto un byte?
    LEA DX,msgx ;puntatore del messaggio in DX
    CALL VISUAL ;Stampa la stringa puntata da DX
    XOR AH,AH
    CALL Stampa_N ;Stampa del byte utilizzato
    Fuori: LEA DX,accapo ;Passaggio alla riga successiva
    CALL VISUAL ;Stampa la stringa puntata da DX
    POP DX
    POP CX
    POP BX
    RET
    Input_N ENDP
    ;--------------------------------------------
    ;Input da tastiera di cifra '0'..'9','INVIO', resa in DL
    Char_N PROC NEAR
    PUSH AX
    Ripeti: MOV AH,1
    INT 21h
    MOV DL,AL
    CMP DL,13
    JE Char_N_Ok ;E' stato premuto INVIO?
    CMP DL,'0'
    JB Indietro ;Il carattere è < '0'?
    CMP DL,'9'
    JBE Char_N_Ok ;Il carattere <= '9'?
    Indietro: PUSH BX
    MOV AH,3 ;servizio 3:acquisizione cursore
    MOV BH,0 ;pagina 0
    INT 10h ;DH riga DL colonna
    DEC DL
    MOV AH,2 ;servizio 2:definizione cursore
    INT 10h
    POP BX
    JMP Ripeti ;rilegge il carattere
    Char_N_Ok: POP AX
    RET
    Char_N ENDP
    ;-------------------------------------------------
    ;-------------------------------------------------------------------
    ;la proceduta VISUAL stampa la stringa puntata da DS:DX mediante INT 21h,09h
    VISUAL PROC NEAR
    PUSH AX
    MOV AH,9
    INT 21H
    POP AX
    RET
    VISUAL ENDP
    ;-------------------------------------------------------------------------
    ;la procedura STAMPA_N scrive a video il valore di AX come stringa di cifre
    STAMPA_N PROC NEAR
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    MOV CX,0 ;inizializza il numero di cifre
    CICLO2: MOV DX,0
    DIV DIECIW
    ADD DX,'0'
    PUSH DX ;salvataggio cifra
    INC CX
    CMP AX,0
    JNE CICLO2 ;ci sono altre cifre?
    MOV AH,2
    CICLO3: POP DX
    INT 21H
    LOOP CICLO3
    POP DX
    POP CX
    POP BX
    POP AX
    RET
    STAMPA_N ENDP
    ;-----------------------------------------------------------------------------
    MAIN ENDP
    CODE ENDS
    END MAIN


    solo che non so come procedere
    cerco del materiale che mi faccia capire come si scrive un carattere o numero sul video, come si fa il calcolo
    • No log
  • 26-05-2005 10.36 In risposta a

    • Deep_Core
    • Utente Top 10
    • Registrato il 05-01-2004
    • Italy - Trieste
    • Messaggi 319

    Re: Assembler... dal principio

    Fermo restando quanto già detto precedentemente, se, come affermi, la tua esigenza è lo sviluppo di applicazioni DOS a 16 bits, ti rimando al materiale contenuto al seguente indirizzo: The Art of Assembly Language Questo è il miglior manuale per neofiti esistente su MASM a 16 bits. Nello stesso vengono spiegati, passo passo, tutti gli elementi sintattici che è possibile utilizzare nel codice assembler, oltre a chiarire vari altri aspetti (hardware e software) relativi a questo tipo di programmazione. Ti avviso che il testo, peraltro assai voluminoso, è ovviamente in lingua inglese ed è comunque destinato ad un pubblico già esperto in altri linguaggi (C/C++ e Pascal). Di meglio, comunque, non potresti trovare! Stick out tongue [:P]
    • No log
  • 26-05-2005 12.14 In risposta a

    • silent83
    • Utente Top 500
    • Registrato il 23-05-2005
    • Messaggi 3

    Re: Assembler... dal principio

    Su Linguaggi come il Pascal e il C so lavorare, ma è proprio l'assembler che non riesco a capire.
    grazie deep core
    • No log
  • 09-06-2005 11.38 In risposta a

    • danilo84
    • Non Valutato
    • Registrato il 09-06-2005
    • Messaggi 1

    Re: Assembler... dal principio

    Ciao a tutti!
    sono nuovo del forum.
    é da un poco che bazzico con l'assembler. il mio problema è: come faccio ad acquisire dalla tastiera un numero?
    Questo perchè il servizio 9 dell'int 21 legge solamente un carattere alla volta. se devo inserire 25 come faccio?
    Grazie!
    • No log
Pagina 1 di 1 (6 elemento/i)
Prelevato da http://www.devspy.com/forums/p/3498/3505.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"