A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Instruções de manipulação de strings Registradores implícitos –[E]SIíndice para string fonte –[E]DIíndice para string destino –ESsegmento do string destino.

Apresentações semelhantes


Apresentação em tema: "Instruções de manipulação de strings Registradores implícitos –[E]SIíndice para string fonte –[E]DIíndice para string destino –ESsegmento do string destino."— Transcrição da apresentação:

1 Instruções de manipulação de strings Registradores implícitos –[E]SIíndice para string fonte –[E]DIíndice para string destino –ESsegmento do string destino –[E]CXcontador –AL/AX/EAX valor de busca (destino p/ LODS, fonte p/ STOS) –DF0 (auto incremento p/ DI, SI) 1 (auto decremento p/ DI, SI) –ZFcondição de término para busca e comparação

2 Instruções Primitivas MOVSmove source string to destination string CMPScompare source string with destination string SCASscan destination string LODSload into AL/AX/EAX from source string STOSstore AL/AX/EAX into destination string INSinput from I/O port (in DX) into destination OUTSoutput from source to I/O port (in DX)

3 Instruções primitivas 1. Realiza operação primitiva (sobre um byte, uma palavra ou uma palavra dupla) 2. Atualiza registradores de índice (SI e/ou DI): 2.1 Se DF=0, então incrementa registradores de índice: 2.1.1 de um, se operação for a byte 2.1.2 de dois, se operação for a palavra 2.1.3 de quatro, se a operação for a palavra dupla 2.2 Se DF=1, então decrementa registradores de índice: 2.2.1 de um, se operação for a byte 2.2.2 de dois, se operação for a palavra 2.2.3 de quatro, se a operação for a palavra dupla

4 Instruções de repetição REPrepeat REPE / REPZrepeat while equal/repeat while zero REPNE / REPNZrepeat while not equal/repeat while not zero 1. Se ECX = 0, então não executa a primitiva e encerra a repetição 2. Se ECX > 0, então: 2.1 Executa a operação primitiva, atualizando os flags 2.2 Decrementa ECX, sem afetar os flags 2.3 Volta para a repetição, de acordo com o prefixo: 2.3.1 Se for REP, repete incondicionalmente 2.3.2 Se for REPE/Z, somente repete se ZF=1 2.3.3 Se for REPNE/NZ, somente repete se ZF=0

5 Instruções Primitivas MOVSmove source string to destination string –MOVSBmove um byte de DS:SI para ES:DI –MOVSWmove uma palavra de DS:SI para ES:DI –MOVSDmove uma palavra dupla de DS:SI para ES:DI REP MOVS - movimenta CX elementos REPE MOVS - não faz sentido usar REPNE MOVS - não faz sentido usar

6 Instruções Primitivas CMPScompare source string with destination string –CMPSBsubtrai byte de mem(DS:SI) – mem(ES:DI) –CMPSWsubtrai palavra de mem(DS:SI) – mem(ES:DI) –CMPSDsubtrai palavra dupla de mem(DS:SI) – mem(ES:DI) –afeta flags de forma idêntica a CMP REP CMPS - não faz sentido usar REPE CMPS - repete enquanto forem iguais REPNE CMPS - repete enquanto forem diferentes Obs: ponteiros param DEPOIS do ponto !!

7 Instruções Primitivas SCASscan destination string –SCASBsubtrai byte em AL – mem(ES:DI) –SCASWsubtrai palavra em AX – mem(ES:DI) –SCASDsubtrai palavra dupla em EAX – mem(ES:DI) –AL, AX ou EAX contém valor sendo buscado REP SCAS - não faz sentido usar REPE SCAS - repete enquanto for igual REPNE SCAS - repete enquanto for diferente Obs: ponteiro para DEPOIS do ponto !!

8 Instruções Primitivas LODSload into AL/AX/EAX from source string –LODSBcarrega byte de mem(DS:SI) em AL –LODSWcarrega palavra de mem(DS:SI) em AX –LODSDcarrega palavra dupla de mem(DS:SI) em EAX REP LODS - não faz sentido usar (fica com o último elemento do string no acumulador) REPE LODS - repete até carregar valor diferente de zero REPNE LODS - repete até carregar valor igual a zero

9 Instruções Primitivas STOSstore AL/AX/EAX into destination string –STOSBarmazena AL no byte de mem (ES:DI) –STOSWarmazena AX na palavra de mem (ES:DI) –STOSDarmazena EAX na palavra dupla de mem (ES:DI) REP STOS - preenche o string com valor do acumulador REPE STOS - não faz sentido usar REPNE STOS - não faz sentido usar

10 Instruções Primitivas INSinput from I/O port (in DX) into destination –INSBmove byte da porta especificada em DX para ES:DI –INSWmove palavra da porta especificada em DX para ES:DI –INSDmove palavra dupla da porta especificada em DX para ES:DI REP INS - lê CX elementos REPE INS - repete até ler valor diferente de zero REPNE INS - repete até ler valor igual a zero

11 Instruções Primitivas OUTSoutput from source to I/O port (in DX) –OUTSBmove byte de DS:SI para porta de E/S especificada em DX –OUTSWmove palavra de DS:SI para porta especificada em DX –OUTSDmove palavra dupla de DS:ES para porta especificada em DX REP OUTS - envia CX elementos para a saída REPE OUTS - não faz sentido usar REPNE OUTS - não faz sentido usar

12 Exemplo 1 - copiar memória Copiar Area1 para Area2 Sejam AREA1DB500 DUP (0) AREA2DB500 DUP (0)

13 Exemplo 1 - copiar memória AREA1DB500 DUP (0) AREA2DB500 DUP (0) ; Supondo DS e ES inicializados adequadamente LEASI, AREA1 LEA DI, AREA2 MOVCX, 500 CLD REP MOVSB

14 Exemplo 1 - copiar memória AREA1DB500 DUP (0) AREA2DB500 DUP (0) ; Supondo DS e ES inicializados adequadamente LEASI, AREA1 LEA DI, AREA2 MOVCX, 250; ou então 125 CLD REP MOVSW; ou MOVSD

15 Exemplo 2 - procurar caractere Procurar quantas vezes o caractere A aparece em Area1 Sejam AREA1DB500 DUP (0) VEZESDW?

16 Exemplo 2 - procurar caractere AREA1DB500 DUP (0) VEZESDW? ; Supondo DS e ES inicializados adequadamente LEADI, AREA1 MOVCX,500 CLD MOV AL, A MOVVEZES,0 DENOVO:REPNE SCASB JNE FIM INC VEZES JCXZ FIM; se achou no fim do string JMP DENOVO FIM:…….

17 Exemplo 3 - procurar caractere Procurar a posição (endereço) do primeiro caractere A em Area1. Colocar zero no endereço se não encontrar o caractere. Sejam AREA1DB500 DUP (0) ENDERECODW?

18 Exemplo 3 - procurar caractere AREA1DB500 DUP (0) ENDERECODW? ; Supondo DS e ES inicializados adequadamente LEADI, AREA1 MOVCX,500 CLD MOV AL, A MOVENDERECO,0 REPNESCASB JNEFIM DECDI MOV ENDERECO, DI FIM:…….

19 Exemplo 4 - concatenar strings Dados dois strings de caracteres, na mesma área, separados por um ou mais espaços (caractere 20H) Concatenar os dois strings, eliminado os espaços em branco Obs: não existe nenhum espaço em branco dentro dos strings Sejam: AREA1DB 500 DUP (?); área que contém os strings END1DW 0; endereço do primeiro espaço encontrado END2DW 0; endereço do primeiro caractere do segundo string

20 Exemplo 4 - concatenar strings ; Supondo DS e ES inicializados adequadamente LEADI,AREA1 MOVCX,500 CLD MOVAL,20H; Código ASCII do caractere espaço REPNE SCASB JNEFIM; Não achou nenhum espaço MOVEND1,DI DECEND1; Corrige endereço do primeiro espaço REPESCASB JEFIM; Só tem espaços até o fim MOVEND2,DI DECEND2; Corrige endereço do primeiro caractere MOVSI,END2; Endereço do último espaço + 1 MOVDI,END1 INCCX; Corrige Contador REPMOVSB; Concatena segundo string com o primeiro


Carregar ppt "Instruções de manipulação de strings Registradores implícitos –[E]SIíndice para string fonte –[E]DIíndice para string destino –ESsegmento do string destino."

Apresentações semelhantes


Anúncios Google