340 likes | 427 Views
EEL7030 - Microprocessadores. Prof. Raimes Moraes GpqCom – EEL UFSC. Parâmetros e Variáveis Locais. Capítulo 7 – Livro Ziller. Macro-Assembler – Subrotina Near. DADOS SEGMENT MSG1 DB ‘JÁ VOU$' DADOS ENDS. CODIGO SEGMENT INICIO: ...... MOV AX,DADOS
E N D
EEL7030 - Microprocessadores Prof. Raimes Moraes GpqCom – EEL UFSC
Parâmetros e Variáveis Locais Capítulo 7 – Livro Ziller
Macro-Assembler – Subrotina Near DADOS SEGMENT MSG1 DB ‘JÁ VOU$' DADOS ENDS CODIGO SEGMENT INICIO: ...... MOV AX,DADOS MOV DS,AX ; INICIALIZACAO DE DS LEA DX,MSG1 ; APONTA PARA O TEXTO CALL SHOW ....... SHOW PROC NEAR MOV AH,09H ; SERVICO DO DOS INT 21H ; EXECUTA FUNCAO DO DOS P/ MSG1 RET ; RETORNA AO PROGRAMA PRINCIPAL SHOW ENDP ....... CODIGO ENDS
Macro-Assembler – Subrotina Far DADOS SEGMENT MSG1 DB ‘JÁ FUI$' DADOS ENDS CODIGO SEGMENT INICIO: ...... MOV AX,DADOS MOV DS,AX ; INICIALIZACAO DE DS LEA DX,MSG1 ; APONTA PARA O TEXTO CALL FAR PTR SHOW ....... CODIGO ENDS ROTINA SEGMENT SHOW PROC FAR MOV AH,09H ; SERVICO DO DOS INT 21H ; EXECUTA FUNCAO DO DOS P/ MSG1 RET ; RETORNA AO PROGRAMA PRINCIPAL SHOW ENDP ROTINA ENDS
Passagem de ParâmetrosparaSubrotinas Método 1 – Via Registrador: Exemplo acima. Offset da mensagem passado via registrador DX Método 2 – Via Variáveis Globais Método 3 – Via Pilha
Subrotina Near: Passagem de ParâmetroVia Variável Global DADOS SEGMENT MSG1 DB ‘JÁ VOLTO$‘ PARM1 DW ? DADOS ENDS CODIGO SEGMENT INICIO: ...... MOV AX,DADOS MOV DS,AX ; INICIALIZACAO DE DS LEA PARM1,MSG1 ; APONTA PARA O TEXTO CALL SHOW ....... SHOW PROC NEAR MOV DX, PARM1 MOV AH,09H ; SERVICO DO DOS INT 21H ; EXECUTA FUNCAO DO DOS P/ MSG1 RET ; RETORNA AO PROGRAMA PRINCIPAL SHOW ENDP ....... CODIGO ENDS
Subrotina Near: Passagem de Parâmetro Via Pilha - 1 Antes: SS = 1760H; SP = 0400H; MOV AX,PARM1 PUSH AX MOV AX,PARM2 PUSH AX CALL SHOW 1780:01B0: ...... Pilha
Subrotina Near: Passagem de Parâmetro Via Pilha - 2 Pilha SHOW: PUSH BP MOV BP,SP MOV BX,[BP+4] ; obtém PARM2 MOV CX,[BP+6] ; obtém PARM1 .... POP BP RET
Subrotina Near: Passagem de Parâmetro Via Pilha - 3 Antes: SS = 1760H; SP = 0400H MOV AX,PARM1 PUSH AX MOV AX,PARM2 PUSH AX CALL SHOW ; SP = 03FCH 1780:01B0 ADD SP,4 ; SP = 0400H Pilha
Subrotina FAR: Passagem de Parâmetro Via Pilha -1 Antes: SS = 1760H; SP = 0400H; MOV AX,PARM1 PUSH AX MOV AX,PARM2 PUSH AX CALL FAR PTR SHOW ; SP = 03FCH 1780:01B0 : ADD SP,4 ; SP = 0400H Pilha
Subrotina FAR: Passagem de Parâmetro Via Pilha - 3 SHOW: PUSH BP MOV BP,SP MOV BX,[BP+6] ; obtém PARM2 MOV CX,[BP+8] ; obtém PARM1 .... POP BP RET
Comparação do modo de Passagem de ParâmetrosparaSubrotinas Via Registrador: Nro de registradores pode ser inferior a nro. de parâmetros; Difícil de estabelecer convenção sobre ordem de passagem dos parâmetros; Maior complexidade da documentação. Via Variáveis Globais: Menor velocidade que via registrador; Difícil de estabelecer convenção sobre ordem de passagem dos parâmetros; Maior complexidade da documentação. Via Pilha Menor velocidade que via registrador; Facilita aninhamento de subrotinas.
Caso seja necessária a utilização de variável por subrotina para informar, por exemplo, o número de caracteres de mensagem apresentado no vídeo para o programa principal, tem-se como opções de guardar o dado em: • Registrador (há registrador disponível?); • Posição de memória reservada durante toda a execução do programa para esta finalidade; • Posição de memória da pilha que poderá ser utilizada para outras rotinas. Variáveis Locais
Subrotina NEAR: Criação de Variável Local SHOW: PUSH BP MOV BP,SP SUB SP,2 ..... Pilha
Variável local do exemplo acima é acessada via BP-2 • O endereço seria o mesmo para subrotina FAR; • Variável local é acessada por deslocamento negativo em relação a BP. Parâmetro é acessado por deslocamento positivo em relação a BP. • Para recuperar o valor de BP colocado na pilha, espaço da variável local é removido antes: • ADD SP,2 • POP BP • RET Variáveis Locais
Subrotina NEAR: Uso de Variável Local – Retorno em AX SHOW: PUSH BP MOV BP,SP SUB SP,2 MOV WORD PTR [BP-2] ,00 MOV BX,[BP+4] ; obtém OFFSET MENSAGEM VOLTA: CMP BYTE PTR [BX],’$’ JZ FIM INC WORD PTR [BP-2] INC BX JMP VOLTA FIM: MOV AH,09 MOV DX,[BP+4] INT 21H MOV AX,[BP-2] ADD SP,2 POP BP RET
Manipulação de Strings Capítulo 9 – Livro Ziller
Manipulação de Strings • O 8086 conta com conjunto de instruções para manipular cadeia de caracteres ou tabelas, permitindo: • Copiar dados de uma região de memória para outra; • Comparar conteúdo de diferentes regiões de memória (tabelas ou cadeia de caracteres); • Varrer memória para buscar dado igual ou diferente à referência; • Leitura consecutiva de dados da memória; • Preenchimento de posições consecutivas da memória.
Flags de Controle DF Direcão (forward/backward) UsadoemInstruções de manipulação de strings CLD => DF = 0 => Incrementa SI ou DI STD => DF = 1 => Decrementa SI ou DI
Prefixos de Repetição Códigos alocados antes das instruções de manipulação de instruções para causar sua repetição até condição de parada. Comparação
Instrução STOS – Preenchimento de memória Antes: ES = 1760H; DI = 0400H; Objetivo ; STD – sets DF flag. Operações com strings decrementam SI e/ou DI. ; STOSW - ES:[DI] <- AX STD MOV CX,4 MOV AX,0216h LOOP : STOSW DEC CX JNZ LOOP STD MOV CX,4 MOV AX,0216h REP STOSW
Instrução LODS – Leitura de memória Objetivo: COPIAR de 1 para 2 1 2
Cópia de Dados – 1 – Instrução LODS MOV BX, 1760H MOV DS,BX MOV SI,03FAH ;DS=1760; SI=03FAH MOV AX,1600H MOV ES,AX MOV DI,04FAH ;ES=1600; DI=04FAH MOV CX,4 CLD ; incrementa SI e/ou DI VOLTA: LODSW ; lê de DS:SI (coloca em AX) STOSW ; escreve em ES:DI (conteúdo de AX) LOOP VOLTA
Instrução MOVS – Cópia de memória Objetivo: COPIAR de 1 para 2 1 2
Cópia de Dados – 2 - MOVSW MOV BX, 1760H MOV DS,BX MOV SI,03FAH ;DS=1760; SI=03FAH MOV AX,1600H MOV ES,AX MOV DI,04FAH ;ES=1600; DI=04FAH MOV CX,4 CLD ; incrementa SI e/ou DI REP MOVSW ; lê de DS:SI --- escreve em ES:DI
Cópia de Dados – 3 - MOVSB MOV BX, 1760H MOV DS,BX MOV SI,03FAH ;DS=1760; SI=03FAH MOV AX,1600H MOV ES,AX MOV DI,04FAH ;ES=1600; DI=04FAH MOV CX,8 CLD ; incrementa SI e/ou DI REP MOVSB ; lê de DS:SI --- escreve em ES:DI
Instrução MOVS OBSERVAÇÕES MOVSB equivale a MOVS BYTE PTR ES:[DI],[SI] MOVSW equivale a MOVS WORD PTR ES:[DI],[SI] Caso se queira transferir dentro de um mesmo segmento, uma opção seria: MOVS BYTE PTR DS:[DI],[SI] REP MOVS ( e outras instruçoes que manipulam strings) são suspensas para atendimento de interrupções. Retomadas a partir do CX na qual pararam.
DADOS SEGMENT TAB1 DB 'MICROCONTROLADORES' TAB2 DB 'MICROPROCESSADORES' .... DADOS ENDS COMPARAÇÃO DE DADOS CMPSB INICIO: MOV AX,DADOS MOV DS,AX ; INICIALIZACAO DE DS MOV ES,AX ; INICIALIZACAO DE ES LEA SI,TAB1 LEA DI,TAB2 MOV BL,00 CLD MOV CX,17 VOLTA: CMPSB JZ VAI INC BL VAI: LOOP VOLTA MOV AH,BL
VARREDURA DE DADOS SCASB DADOS SEGMENT TAB1 DB 'MICROCONTROLADORES' MSG1 DB 'POSICAO DO CARACTER T = ' MSG2 DB '0 $' DADOS ENDS INICIO: MOV AX,DADOS MOV DS,AX ; INICIALIZACAO DE DS MOV ES,AX ; INICIALIZACAO DE ES LEA DI,TAB1 CLD MOV AL,'T' MOV CX,17 VOLTA: REPNE SCASB JZ FIMCMP MOV AH,'E' JMP ERRO FIMCMP: MOV AX,DI ADD AL,30H