Istruzione MOVSB stringhe 8086

di il
6 risposte

Istruzione MOVSB stringhe 8086

Salve a tutti!
Oggi ho provato a dare un occhiata alle stringhe in Assembly 8086 e ho scoperto l'istruzione MOVSB e MOVSW.

In questo programma ho provato ad eseguire l'istruzione MOVSB con successo, ecco il sorgente:
DATA SEGMENT PUBLIC
	STR1 DB "HELLO WORLD",10,13,'$'
DATA ENDS ;FINE DEL SEGMENTO DEI DATI

EXTRA SEGMENT PUBLIC
	DIM EQU 15 ;COSTANTE PER DIMENSIONARE ARRAY PER STRINGA
	STR2 DB DIM DUP(?) ;ARRAY PER STRINGA	
EXTRA ENDS ;FINE DEL SEGMENTO EXTRA DATI

CODE SEGMENT 

	ASSUME CS:CODE,DS:DATA,ES:EXTRA 
	
INIZIO:

	;CARICO I DATI
	MOV AX,DATA
	MOV DS,AX
	MOV AX,EXTRA
	MOV ES,AX
	
	;PULIZIA MONITOR
	MOV AX,03H
	INT 10H 
	
	;CARICO GLI INDIRIZZI IN DI E SI
	LEA SI,STR1
	LEA DI,STR2
	MOV CX,DIM ;METTO IN CX IL VALORE DELLA LUNGHEZZA DELLA STRINGA 
	CLD ;AZZERO IL VALORE DELLA FLAG DF QUINDI LE OPERAZIONI SULLE STRINGHE SARANNO ESEGUITE IN "AVANTI"
	REP MOVSB 
	
	MOV AH,09H
	LEA DX,STR2
	INT 21H 
	
	MOV AH,4CH
	INT 21H 

CODE ENDS ;FINE DEL SEGMENTO DEI DATI
END INIZIO ;CHIUSURA ETICHETTA CHE INDICA INIZIO DEL PROGRAMMA
Tuttavia mi è sorto un dubbio:
Con questa istruzione lui copia la prima stringa che trova nella seconda che trova? O usa un'altro meccanismo?
Vorrei avere solo questo chiarimento, grazie

6 Risposte

  • Re: Istruzione MOVSB stringhe 8086

    Non ho capito la domanda...
  • Re: Istruzione MOVSB stringhe 8086

    La mia domanda è:
    se ho due stringhe A e B, mettendo in sequenza:
    LEA SI,A
    LEA DI,B 
    MOVSB
    ...
    REP MOVSB 
    ...
    
    Copia la stringa A in B perchè ho messo prima la stringa A nel codice giusto?
  • Re: Istruzione MOVSB stringhe 8086

    No, perché l'istruzione prevede che la stringa da copiare sia puntata da SI (Source) e la destinazione da DI (Destination)
  • Re: Istruzione MOVSB stringhe 8086

    Ho capito grazie
    Ora ho capito anche la differenza fra i due registri.
    Tuttavia volevo chiederti un'ultima cosa:
    I registri SI e DI non si possono usare indifferentemente per gli array però?
    In quel caso non c'è differenza allora?
  • Re: Istruzione MOVSB stringhe 8086

    L'uso di SI e DI è indifferente a meno che non sia diversamente indicato dall'istruzione che usi.

    Il "primo segreto" della programmazione ASM è studiare, imparare, rispettare quello che è indicato dalla documentazione per ogni singola istruzione. Se lo fai, non hai tanti problemi ...

    Ad esempio, per la MOVS (di cui la MOVSB è una forma particolare)

    MOVS/MOVSB/MOVSW/MOVSD -- Move Data from String to String

    Opcode Instruction Clocks Description

    A4 MOVS m8,m8 7 Move byte [(E)SI] to ES:[(E)DI]
    A5 MOVS m16,m16 7 Move word [(E)SI] to ES:[(E)DI]
    A5 MOVS m32,m32 7 Move dword [(E)SI] to ES:[(E)DI]
    A4 MOVSB 7 Move byte DS:[(E)SI] to ES:[(E)DI]
    A5 MOVSW 7 Move word DS:[(E)SI] to ES:[(E)DI]
    A5 MOVSD 7 Move dword DS:[(E)SI] to ES:[(E)DI]
    Operation

    IF (instruction = MOVSD) OR (instruction has doubleword operands)
    THEN OperandSize := 32;
    ELSE OperandSize := 16;
    IF AddressSize = 16
    THEN use SI for source-index and DI for destination-index;
    ELSE (* AddressSize = 32 *)
    use ESI for source-index and EDI for destination-index;
    FI;
    IF byte type of instruction
    THEN
    [destination-index] := [source-index]; (* byte assignment *)
    IF DF = 0 THEN IncDec := 1 ELSE IncDec := -1; FI;
    ELSE
    IF OperandSize = 16
    THEN
    [destination-index] := [source-index]; (* word assignment *)
    IF DF = 0 THEN IncDec := 2 ELSE IncDec := -2; FI;
    ELSE (* OperandSize = 32 *)
    [destination-index] := [source-index]; (* doubleword assignment *)
    IF DF = 0 THEN IncDec := 4 ELSE IncDec := -4; FI;
    FI;
    FI;
    source-index := source-index + IncDec;
    destination-index := destination-index + IncDec;
  • Re: Istruzione MOVSB stringhe 8086

    Ti ringrazio per la spiegazione
    Ciaoo
Devi accedere o registrarti per scrivere nel forum
6 risposte