|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 19
|
[Assembly] Programma molto semplice, ma non l'ho capito.
Ciao a tutti!
Il codice riportato sotto si riferisce ad un programma che dovrebbe calcolare il MAX tra una serie di valori, ma non ho capito la logica del comando MOV bl,al. Qualcuno ha idea.. di cosa potrebbe indicare? Ehm, mi scuso, sono un profano -.-'' !! ################################### ;--------------------------funzione max()--------------------------- ; stac segment para stack 'stack' db 128 dup (' ') stac ends ; dati segment para public 'data' ; tab db 22h,33h,34h,11h,16h,2h,0 dati ends ; codice segment para public 'codice' ; start proc far assume cs:codice,ds:dati,ss:stac,es:nothing ;-----------------save ds del dos------------------------, ; push ds mov ax,0 push ax ; ;-----------------setting ds ed es----------------------- ; mov ax,dati mov ds,ax mov es,ax ; ;------------------per le movs-------------------------- ; cld ; ; mov si,offset tab mov bl,al mov al,byte ptr[si] again: cmp al,0 je fine cmp al,bl jl labeltwo mov al,bl labeltwo: inc si mov al,byte ptr[si] jmp again fine: ret start endp codice ends ; end start ################################### |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
MOV è l'istruzione più semplice e banale che ci sia .... muove (nel senso di "copia") il valore del secondo operando nel primo operando. Quindi MOV bl,al copia il valore di al in bl.Tra l'altro il codice che hai postato, a "vista", non mi sembra molto corretto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 19
|
Grazie per la risposta!
Il codice che ti ho postato è quello preso direttamente dal PC del professore. Il fatto che MOV, muove qualcosa, l'ho capito. Ma in quel contensto, a che serve? Grazie!! |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
L'istruzione cld non serve in quel sorgente, cld serve per impostare a 0 il "direction flag" usato dalle istruzioni tipo MOVS, LODS, ecc... (che non vengono usate nel sorgente). Poi comunque, concettualmente, il registro bl dovrebbe tenere il valore che man mano si presenta più alto. Invece non vedo movimenti verso bl, se non quella mov iniziale, che come ho detto, non ha molto senso se copia da al.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 19
|
Ti ringrazio! In effetti è quello che pensavo io..
Forse ho trovato una soluzione però. Considerando che in AL c'è il primo valore, lo si sposta a BL, e poi in AL ci va un altro valore (ottenuto scorrendo con byte ptr[si]). Ha senso? |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Io, all'inizio, muoverei in AL e BL il valore del primo elemento e poi farei in modo da avere solo una MOV AL,[SI] invece di due. (nota che byte ptr è superfluo, sa già che deve muovere 1 byte)
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jul 2005
Messaggi: 19
|
Ti ringrazio per il supporto!
Ora proprio non ho voglia di pensarci, domani vedrò tutto con calma!! Ancora grazie!! |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Ad occhio, confermo che visto così non mi sembra poter fare il calcolo del massimo. Una prima modifica che mi viene in mente potrebbe essere sostituire:
mov al,bl sotto l'istruzione jl labeltwo in mov bl,al (se è maggiore/uguale, salva il nuovo massimo in bl) Noto con piacere, perlomeno, che qualche sparuta culla di cultura è rimasta in Italia: si prova ancora ad insegnare asm... sono commosso. Non che serva molto in ambito sviluppo, ma almeno è utile per capire come funziona REALMENTE un calcolatore |
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Probabilmente il codice originario del professore dovrebbe essere stato questo:
Codice:
cld ; ; mov si,offset tab lodsb <= Dovra' pur caricare il 1° termine di tab mov bl,al mov al,byte ptr[si] again: cmp al,0 je fine cmp bl,al <= deve comparare bl con al e non al con bl (jl) jl labeltwo mov bl,al <= Deve salvare il massimo in bl labeltwo: inc si mov al,byte ptr[si] jmp again fine: ret |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Io l'avrei fatto così:
Codice:
MOV SI,OFFSET tab
MOV BL,[SI]
MAX_LOOP:
MOV AL,[SI]
CMP AL,0
JE MAX_END
INC SI
CMP AL,BL
JLE MAX_LOOP
MOV BL,AL
JMP MAX_LOOP
MAX_END:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:15.











MOV è l'istruzione più semplice e banale che ci sia .... muove (nel senso di "copia") il valore del secondo operando nel primo operando. Quindi MOV bl,al copia il valore di al in bl.








