ASM Chiarimenti su un codice

Stato
Discussione chiusa ad ulteriori risposte.

Daniele1100000

Utente Gold
13 Agosto 2009
640
106
54
318
Salve a tutti sto seguendo delle videolezioni di assembly,in una di queste spiega cone creare un programma capace di inserire in input 2 dati e farli uscire in output.
2cose però non mi sono chiare.
1)sposta tutto il .data nel data segment,perché lo fa?. Cosi si trova in tutti i registri?.
2)la domanda Dx, offset dom1 perché la mette nel registro DX?lo dice in un modo che sembra che deve andare per forza in Dx,e perché la domanda la inserisce nel registro? Attualmenteil programma non é finito(screen) ma non vedo un operazione tra 2 variabili quindi perché lo inserisce in DX?.
3)quqndo salva il numero nellq variabile num1,lo passa dal registro AL ma nel codice quando lo salva in AL?.
 

Allegati

  • Screenshot_2017-11-06-20-14-58.png
    Screenshot_2017-11-06-20-14-58.png
    644.6 KB · Visualizzazioni: 44
Ecco delle risposte alle tue domande:

1) In questo caso specifico quell'istruzione potrebbe essere evitata, ma di solito si usa per informare la cpu sulla presenza della sezione dei dati read/write (così si avrebbero tutti i riferimenti DS popolati). I registri non c'entrano con questo.
2) Questo è dovuto all'architettura x86. I registri non sono tutti uguali, quindi se non si tratta semplicemente di spostare dati da/a un'area di memoria ad un'altra o tra vari registri, tutte le altre istruzioni hanno un preciso modo di essere eseguite. Per sapere quelle di "INT 21h" basta che cerchi una guida di assembly e capirai i ruoli dei registri, AX,CX e DX per quell'istruzione, che non sono per nulla intercambiabili.
3) A parte che "salvare" non è proprio il termine giusto, la risposta in questo caso è la stessa di prima. Infatti INT 21h (ed in generale quasi tutte le istruzioni di I/O) hanno necessità di utilizzare un registro per il valore di ritorno, altrimenti come faresti a leggere davvero l'input? Dove lo troveresti? In AL, appunto, si trova l'input ricevuto. Il consiglio è sempre quello di leggere una guida sulle istruzioni che non capisci.

Puoi avere un'infarinatura qui: http://spike.scu.edu.au/~barry/interrupts.html
 
Ultima modifica da un moderatore:
Ciao inanzitutto grazie,stavo leggendo e l'entrata sarebbe il registro che usiamo in input e l'uscita quello in output?.
Io pensavo che i registri avesserò funzioni identiche.solo nei spostamenti quindi hanno funzioni uguali.
Comunque non ho capito a cosa serve il DS,spostando tutto il .Data cosa cambia da non averlo fatto?.

------------------------------------------------------------------------------------------------------

Esempio input AH uscita Al? Nell'Input (Ah)Output(Al).
 
Ciao,vorrei sapere se il codice é giusto in quanto lo programmato sul telefonino ed l'inizio(template forse si dice) é diverso da quello che usiamo noi a scuola(key emu),li mi basta scrivere org 100h.

Somma tra 2 numeri dove i numeri sono inseriti in Input.

Codice:
org 100h
mov ax@data
mov ds,ax
;output della domanda 1
mov ah,09h
mov dx,offset dom1
int 21h
;input del carattere
mov ah,01h
int 21h ;in al viene salvato l'input inserito dall'utente.
mov n1,al 
;output domanda 2
mov ah,09h
mov dx,offset dom2 
int 21h
;input 2°numero
mov ah,01h
int 21h
mov n2,al ;al contiene il carattere digitato

mov al,n1
add al,n2
mov risultato,al

mov ah,09h
mov dx,offset risultato
int 21h

mov ah,4ch
int 21h








;Data
n1 db ?
n2 db ?
somma db ?
dom1 db "inserisci il primo numero",13,10'$'
dom2 db"inserisci il secondo numero",13,10'$'   
risultato db ?
 
Dipende, ci potrebbero essere diversi problemi, ma dipende da cosa devi fare.
Intanto do per scontato che stai lavorando a 16bit, perchè altrimenti a 32bit istruzioni come "mov dx,offset dom1" probabilmente non funzionerebbero.
Inoltre, cosa intendi sommare? Tieni conto che così stai sommando i valori dalla tabella ascii corrispondenti al carattere che stai inserendo, e non il numero stesso. Ad esempio se i due caratteri inseriti sono "3" e "4", non otterrai sicuramente "7" dopo la somma, ma il carattere corrispondente a 0x33+0x34 e cioè "g".

A parte questo, il codice non è male.
 
  • Mi piace
Reazioni: Daniele1100000
Ciao si lavoro a 16 bit , il risultato sperato da me sono la somma dei due numeri non il carattere Ascii,il carattere Ascii lo prende in quanto utilizzo gli interrupt?.
come dovrei fare se volessi ottenere solo la somma?.
 
Un byte è un byte, e non l'ASCII da cui è rappresentato, quindi è giusto e normale che sia così.
Tuttavia, la convenzione ci viene incontro, e la tabella ASCCI è fatta per facilitare queste operazioni.

Infatti, i numeri 0-9 sono rappresentati dai valori 0x30-0x39
Vale a dire che:

Dal numero letto, sottraendo 0x30 otteniamo il numero vero che ti interessa, lo stesso per il secondo valore. A questo punto possono essere sommati. Aggiungendo di nuovo 0x30 si possono mandare in output i numeri ascii corretti.
Il problema è che questo funziona per tutte quelle operazioni che non superino le cifre 0-9, quindi molto limitato.
Nel caso le si superi, bisogna fare delle ulteriori trasformazioni per separare le cifre da cui è composto il numero (in base 10). Di solito i compilatori però (come masm) mettono già a disposizione delle funzioni per eseguire operazioni del genere.

Ricapitolando:

...
;input del carattere
mov ah,01h
int 21h ;in al viene salvato l'input inserito dall'utente.
sub al, 30h
mov n1,al
...
;input 2°numero
mov ah,01h
int 21h
sub al, 30h
mov n2,al ;al contiene il carattere digitato
...
mov al,n1
add al,n2
add al, 30h
mov risultato,al

mov ah,09h
mov dx,offset risultato
int 21h

Questo è quello che funziona nel caso si debba sommare 2 cifre che fanno al massimo 10, come 4+3.
 
  • Mi piace
Reazioni: Daniele1100000
Un byte è un byte, e non l'ASCII da cui è rappresentato, quindi è giusto e normale che sia così.
Tuttavia, la convenzione ci viene incontro, e la tabella ASCCI è fatta per facilitare queste operazioni.

Infatti, i numeri 0-9 sono rappresentati dai valori 0x30-0x39
Vale a dire che:

Dal numero letto, sottraendo 0x30 otteniamo il numero vero che ti interessa, lo stesso per il secondo valore. A questo punto possono essere sommati. Aggiungendo di nuovo 0x30 si possono mandare in output i numeri ascii corretti.
Il problema è che questo funziona per tutte quelle operazioni che non superino le cifre 0-9, quindi molto limitato.
Nel caso le si superi, bisogna fare delle ulteriori trasformazioni per separare le cifre da cui è composto il numero (in base 10). Di solito i compilatori però (come masm) mettono già a disposizione delle funzioni per eseguire operazioni del genere.

Ricapitolando:

...
;input del carattere
mov ah,01h
int 21h ;in al viene salvato l'input inserito dall'utente.
sub al, 30h
mov n1,al
...
;input 2°numero
mov ah,01h
int 21h
sub al, 30h
mov n2,al ;al contiene il carattere digitato
...
mov al,n1
add al,n2
add al, 30h
mov risultato,al

mov ah,09h
mov dx,offset risultato
int 21h

Questo è quello che funziona nel caso si debba sommare 2 cifre che fanno al massimo 10, come 4+3.
comunque ho risolto grazie dell'aiuto nel esame sono riuscito a farlo bene :D
 
Stato
Discussione chiusa ad ulteriori risposte.