Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Linguaggio Assembly
È un linguaggio a basso livello che è rappresentato quasi in simbolico dal linguaggio Macchina. Il nostro computer sa leggere solo 0 e 1, tutta la combinazione di 0 e 1 formano stringhe in codice binario cioè il linguaggio macchina. L'assembly prende una serie di queste stringhe e le trasforma in comandi come MOV, ADD ecc.
Esistono diversi tipi di assembler, e il linguaggio ch li contiene si basa all'architettura importante di riferimento.
Quello che fornirà è il linguaggio della famiglia Intel x86, in particolar modo del linguaggio assembly legato a degli interi cioè il Processo 8086.
Un Programma in Assembly viene messo su un Programma Sorgente. Dopodiché viene tradotto in Linguaggio Macchina chiamato Programma Oggetto.
Con l'uso dell'link vengono creati il programma eseguibile.
Processore 8086
Qua tutte le operazioni del processore vengono effettuate su com. e registri, che nomi memoria molto veloci contenuti sia mem, che comandi.
L'8086 ha 14 registri Pin che vedremo i Registri Comuni Europei essermi AX, BX, CX, si, DX.
Ognuno di questi registri è diviso nella parte alte e parte bassa: NYD registro AX: B parte alta: AH 2 parte bassa AL H sta em High e L low
Nel registro B: X B parte alta: BH 2 parte bassa BL
Nel registro C: X C parte alta CH e parte bassa CL
Nel registro D: X D parte alta DH 2 parte bassa DL
In ognuno di questi registri possono inserece fino a 16 bit, dov'è il bit è un numero o 1 (maggiore che si è un segnale elettrico), e porta un informazione, immagino modif chiam o interruttore che si porta o a 0 o ancora 1
IMP: Per aprire il Prompt dei comandi: => Su si esegue digitate CMD
Come Fare un Programma
Partiamo da alcuni cose che non mi fermo:
-
MODEL SMALL - Ho definito un modello del nostro programma. In pratica
-
STACK 100H - È due parole grandi del nostro programma.
-
DATA - È il mezzo delle note in cui dichiarare le variabili.
-
DB - 1 BYTE = 8 BIT = 256 combinazioni.
-
DW - 2 BYTE = 16 BIT = 65536 combinazioni.
In dichiarare una variabile:
-
NOME TIPO VALORE. Gli altri parametri, si possono anche mettere dopo.
-
CODE - Qua archivia il codice, tutti che verranno le istruzioni.
Non possiamo fare aggiunzioni tra variabili
Per terminare il programma un END.
I commenti li metto così:
Quelle con il punti doppi sono le direttive
Importante usare MOV AH,1CH INT 21H
E anche MOV BL,SOMMA
Somma in output/input
.MODEL SMALL .STACK 100H .DATA NUM1 DB ? NUM2 DB ? DOM1 DB 'Inserire 1° numero: ',13,10,'$' DOM2 DB 'Inserire 2° numero: ',13,10,'$' SOMMA DB ? RIS DB 'La somma è: ',13,10,'$'
.CODE .STARTUP
MOV AX,@DATA MOV DS,AX MOV AH,09H MOV DX,OFFSET DOM1 INT 21H INT 21H MOV NUM1,AL
MOV AH,09H MOV DX,OFFSET DOM2 INT 21H MOV AH,0AH INT 21H MOV NUM2,AL
MOV AL,NUM1 ADD AL,NUM2 MOV SOMMA,AL
MOV AH,09H MOV DX,OFFSET RIS INT 21H
MOV AH,02H MOV DL,SOMMA INT 21H
MOV AH,4CH INT 21H
END
SEI: CMP AL,'A'
JL CICLO
CMP AL,'Z'
JG CICLO
CMP AL,'a'
JE AUMENTO
DEC BL
CMP BL,'o'
JE FINCICLO
JMP CICLO
AUMENTO: INC NAMAJUSC
DEC BL
CMP BL,'o'
JE FINCICLO
JMP CICLO
FINCICLO: NOP
MOV AH,09H
MOV DX,OFFSET A CAPO
INT 21H
MOV AH,09H
MOV DX,OFFSET RIS
INT 21H
MOV AH,09H
MOV DX,OFFSET NAMAJUSC
INT 21H
MOV AH,4CH
INT 21H
Funzione XCHG
È un'istruzione che in un unico passaggio scambia il contenuto di due registri o di un registro e di una variabile.
.MODEL SMALL .STACK 100H .DATA PINO DB '9' GIGI DB '5' .CODE STARTUP: MOV AX,@DATA MOV DS,AX MOV AL,PINO XCHG AL,GIGI MOV PINO,AL Variabile 2: PINO e GIGI ENDOSS: scambio fatto
MOV BL,PINO MOV AL,GIGI MOV PINO,BL MOV GIGI,ALPer un numero maggiore
Array in Assembler (8086)
Gli array sono delle variabili multiple immaginandoli come un contenitore che non contengono più variabili i vari.
Variabile GIGI
VEDI GIGI _______________ |____|____|____|_|ogn quadratino è numerato. Gli indici numerano 0 a m e tutte le restanti par.
Si dichiarano nel DATA:
NOME TIPO NUMERO INDICI DUP (inizializzazione)Uso l'istruzione DUP per creare tot celle che hanno valore non definito x defiz:
PINO DB 10 DUP (?)Nomi di diz di second un vettore che mi chiama PINO
e dopo 10 unità usa tot 10 celle di un non di nuovo in nome
DUP(0) crea 10 celle con valore 0MODEL SMALL
STACK 100H
DATA
FRASE DB 20 DUP (?)
RIFERIZ DB 0
A CAPO DB 13, 10
INMSG DB 'inserire battuta: ', '$'
OUTMSG DB 'le ripetizioni sono: ', '$'
CODE
STAMPSTR MACRO STRINGA
MOV AH, 09H MOV DX, OFFSET STRINGA INT 21H ENDMSTAMPAVAR MACRO VAR
MOV AH, 02H MOV DL, VAR INT 21H ENDMSTARTUP
MOV AX, @DATA MOV DS, AX STAMPSTR INMSG MOV SI, 0CICLO: MOV AH, 01H
INT 21H MOV FRASE+SI, AL INC SI CMP SI, 20 JL CICLOSTAMPASTR A CAPO
STAMPASTR OUTMSG
CICLO2: MOV BL, FRASE+SI
CMP FRASE+(SI-1), AL JNE NOINC INC RIPETIZ NOINC: DEC SI CMP SI, 0 JG CICLO2MOV AL, RIPETIZ
MOV AH, 0 DIV CL, 10 MOV BL, AH ADD BL, 30H STAMPAVAR BLSTAMPAVAR AL
Ricerca Binaria (inserzione vettore ordinato)
.MODEL SMALL .STACK 100H .DATA
- VETTORE DB 10 DUP (?)
- CERCATO DB ?
- ELEMENTI DB 0
- SINISTRA DB 0
- DESTRA DB 0
- MEDIO DB 0
- DIVISI DB 2
- DOMO DB "quanti elementi vuoi inserire: $"
- DOM1 DB "inserisci ricercato: $"
- DOM2 DB "inserisci il numero che vuoi: $"
- RIS1 DB "numero trovato: $"
- RIS2 DB "numero non trovato: $"
- ACAPO DB 13, 10, "$"
.CODE STAMPA MACRO stringa MOV AH, 09H INT 21H ENDM
STARTUP MOV AX, @DATA MOV DS, AX MOV SI, 0
STAMPA DOMO MOV AH, 01H INT 21H SUB AL, 30H MOV ELEMENTI, AL STAMPA ACAPO
CICLO: MOV AH, 01H INT 21H MOV VETTORE [SI], AL INC SI MOV BL, ELEMENTI MOV BH, 0 CMP SI, BX JL CICLO
STAMPA ACAPO STAMPA DOM2 MOV AH, 01H INT 21H MOV CERCATO, AL
Procedura con Parametri
Funzione che fa somma due numeri con parametri e restituisce la somma
I parametri e numeri pushandi vanno nello stack in ordine inverso, ossia numero 2 e il parametro sarà il 1°. Il risultato entra in AX.
MODEL MEDIUM .STACK 100H .DATA NUM1 DB 5 NUM2 DB ? RIS DB ?
.CODE
FUNZIONE PROC NEAR
- PUSH BP
- MOV BP,SP
- SUB SP,12
- PUSH CX ; numero 1° parametro
- PUSH DX ; numero 2° parametro
MOV CX,[BP+4] MOV DX,[BP+6]
- MOV [BP-2],0
- ADD [BP-2],CX
- ADD [BP-2],DX
- MOV AX,[BP-2]
POP DX POP CX MOV SP,BP POP BP RET
FUNZIONE ENDP
.STARTUP
- MOV AX,@DATA
- MOV DS,AX
- MOV CH,0
- MOV CL,NUM1
- MOV BH,0
- MOV BL,NUM2
- PUSH BX
- PUSH CX
- MOV AX,1
- CALL FUNZIONE
- ADD SP,4
- MOV RIS,AL
...