Organização Básica de computadores e linguagem de montagem Prof. Edson Borin 2o Semestre de 2011 Instruções de Desvio desvio incondicional: uma que é codificada em duas palavras, com a segunda palavra contendo o valor do endereço alvo do desvio, e uma instrução codificada em uma palavra, na qual o endereço alvo é dado em um registrador. O mnemônico utilizado para as duas instruções é jmp, do inglês jump (salto). Desvio Incondicional JMP Armazena byte de registrador na memória Sintaxe Operação Flags Codificação 31 jmp expr32 ip ← imd32 – 0 20 31 0 imd32 jmp rdest ip ← rdest Exemplo 14 desvio incondicional – 31 0 21 rdest 3.3. INSTRUÇÕES DE DESVIO Desvio Incondicional Direto 1 2 3 4 5 6 7 8 9 10 11 12 13 14 org set 200h r0, 0 jmp fora mov ... org fora: mov r1, r2 ; ; ; ; ; ; ; uma instrução qualq montada na posição instrução de desvio a codificação utili primeira palavra: 2 segunda palavra: 0 esta instrução não 3000h r2, r1 ; esta instrução é a ; executada após o de 32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CAPÍTULO 3. Desvio Incondicional Indireto org set 300h r0, 1 jmp r10 mov r3, r4 ; ; ; ; ; ; uma instrução qualque montada na posição 30 instrução de desvio i a codificação utiliza 21000a00h esta instrução não é ... org 4000h mov r4, fora: r3 ; se r10 tem o valor 40 ; instrução é a próxima ; após o desvio incondi O cálculo do endereço alvo do desvio é diferente do caso do desvio incondicional, em que o endereço alvo é um valor absoluto, dado na segunda palavra da instrução. No caso das operações de desvio condicional, o processador utiliza o valor codificado no campo imd8 para calcular o endereço alvo. O endereço alvo é calculado de forma relativa ao valor corrente do registrador ip: o valor do campo imd8 , transformado em um inteiro de 32 bits, com sinal, é adicionado ao valor corrente de ip para determinar o novo valor de ip. Desvios Condicionais Jcond Desvio condicional Sintaxe jcond expr8 Operação ip ← ip + ext(imd8 ) Flags – Codificação 31 xx 0 imd8 No descritor, a sintaxe é dada como jcond expr8 pois no caso geral o operando é uma expressão inteira cujo resultado deve ser possível armazenar em oito bits; mas na grande maioria dos casos a expressão é composta de apenas um rótulo. O montador monta, no campo imd8 , o valor da expressão (ip − endereço alvo). O valor do campo imd8 é interpretado como um inteiro com sinal, de forma que o endereço alvo pode ser menor ou maior do que o ip corrente, fazendo com que o fluxo do Desvios Condicionais 34 Instr. jc jnc jz jnz jo jno js jns jl jle jg jge ja CAPÍTULO 3. O PROCESSADOR FAÍSKA Nome Cond. Codif. desvia se vai-um (menor sem sinal) C=1 22h desvia se não vai-um (maior ou igual sem sinal) C=0 23h desvia se zero Z=1 24h desvia se diferente de zero Z=0 25h desvia se overflow O=1 26h desvia se não overflow O=0 27h desvia se sinal igual a um S=1 28h desvia se sinal igual a zero S=0 29h desvia se menor (com sinal) S�=O 2ah desvia se menor ou igual (com sinal) Z=1 ou S�=O 2bh desvia se maior (com sinal) Z=0 e S=O 2ch desvia se maior ou igual (com sinal) S=O 2eh desvia se acima (maior sem sinal) C=0 e S=O 2fh Comparando números • O Faíska (e a maioria dos microprocessadores) utiliza as flags setadas por operações aritméticas para comparar números. Exemplo: sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow • O que acontece com a flag Z se r1 for igual a r2? Comparando números • Exemplo if (a == b) { a = a + 1; } else { b = b - 2; } a: ds 4 b: ds 4 Comparando números • Exemplo if (a == b) { a = a + 1; } else { b = b - 2; } a: ds 4 b: ds 4 ! ld r1, a ! ld r2, b ! mov r0, r2 ! sub r0, r1 ; if (a==b) ! jnz else ! add r1, 1 ; then ! jmp fim_se else: ! sub r2, 1 ; else fim_se: Comparando números Exemplo: sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow • Vamos assumir que não houve overflow (Flag O = 0), o que acontece com a flag S se r2 é menor do que r1? Flag O Flag S 0 0 0 1 1 0 1 1 Relação entre r2 e r1 Comparando números Exemplo: sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow • Vamos assumir que não houve overflow (Flag O = 0), o que acontece com a flag S se r2 é menor do que r1? Flag O Flag S Relação entre r2 e r1 0 0 r2 > r1 ou r2 == r1 0 1 r2 < r1 1 0 r2 < r1 1 1 r2 > r1 Comparando números Exemplo: sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow • • • • • Flag O Flag S Relação entre r2 e r1 0 0 r2 > r1 ou r2 == r1 0 1 r2 < r1 1 0 r2 < r1 1 1 r2 > r1 r2 == r1 r2 < r1 r2 > r1 r2 <= r1 r2 >= r1 quando: Z == 0 quando: O != S quando: O = S e Z != 0 quando: O != S ou Z == 1 quando: O == S Comparando números • Exemplo if (a < b) { a = a + 1; } else { b = b - 2; } a: ds 4 b: ds 4 Comparando números • Exemplo if (a < b) { a = a + 1; } else { b = b - 2; } a: ds 4 b: ds 4 ! ld r1, a ! ld r2, b ! mov r0, r2 ! sub r0, r1 ; if (a==b) ! jge else ! add r1, 1 ; then ! jmp fim_se else: ! sub r2, 1 ; else fim_se: Nova Instrução Aritmética • CMP: Parecida com o SUB, mas não modifica o registrador dest. 3.3. INSTRUÇÕES DE DESVIO 37 CMP Comparação Sintaxe cmp rdest , expr8 cmp rdest , rf onte Operação rdest − ext(imd8 ) rdest − rf onte Flags CSZO CSZO Codificação 31 0 14 imd8 rdest 31 0 15 rdest Vamos re-escrever a solução para o Exemplo 18 com a instrução cmp. rf onte Controle do Fluxo de Execução • Sentença condicional “Se-Então” (If-Then) Exemplo: C/C++ ... if (x >= 10) { y = x; } x<10 ... Controle do Fluxo de Execução • Sentença condicional “Se-Então” (If-Then) Exemplo: C/C++ ... if (x >= 10) { y = x; } x<10 ... Exemplo: Ling. de Montagem ; x está em r1 ; y está em r2 ... cmp r1, 10 jl pula ; salta se r1<10 mov r2, r1 x<10 pula: ... • jl salta para o alvo se o resultado da última comparação foi “menor que” assumindo números com sinal. Para números sem sinal use “jc” (Veja o manual do Faíska) Controle do Fluxo de Execução • Sentença condicional “Se-Então-Senão” (If-Then-Else) Exemplo: C/C++ ... if (x >= 10) { y = y + 1; } else { y = x; } ... Controle do Fluxo de Execução • Sentença condicional “Se-Então-Senão” (If-Then-Else) Exemplo: C/C++ Exemplo: Ling. de Montagem ... if (x >= 10) { y = y + 1; x<10 } else { y = x; } ... ... cmp r1, 10 jl else add r2, 1 jmp cont else: mov r2, r1 cont: ... x<10 Controle do Fluxo de Execução • Laço “enquanto” (while) Exemplo: C/C++ ... i=0; while { y = i = } ... (i < 20) y+3; i+1; i>=20 Exemplo: Ling. de Montagem ; i está em r1 ; y está em r2 ... set r1, 0 ; i=0 enquanto: cmp r1, 20 ; se i >= 20 jge cont ; sai do laco add r2, 3 ; y=y+3 add r1, 1 ; i=i+1 jmp enquanto cont: r1>=20 ... Controle do Fluxo de Execução • Laço “para” (for) Exemplo: C/C++ ... for (i=0; i<10; i++) { y = y+2; i<10 } ... Exemplo: Ling. de Montagem ; i está em r1 ; y está em r2 ... set r1, 0 ; i=0 for: cmp r1, 10 ; se i >= 10 jge cont ; sai do laco add r2, 2 ; y=y+2 add r1, 1 ; i=i+1 jmp for r1<10 cont: ... Controle do Fluxo de Execução • Laço “faça-enquanto” (do-while) Exemplo: C/C++ ... i=0; do { i = i+1; } while (y < 20); ... Exemplo: Ling. de Montagem ; i está em r1 ; y está em r2 ... => Exercício Controle do Fluxo de Execução • Sentenças com múltiplas condições: Exemplo: C/C++ Exemplo: Ling. de Montagem ; x está em r1 ; y está em r2 ... ... if ((x>=10) && (y<20)) cmp r1, 10 { jl pula ; Pula se x < 10 x = y; cmp r2, 20 } jge pula ; Pula se y >= 20 ... mov r1, r2 ; x = y pula: ... Exemplo • Exemplo 19: Escreva um trecho de programa que determine qual o maior valor de uma cadeia de números de 32 bits, sem sinal, cujo endereço inicial é dado em r2. Inicialmente, r3 contém o número de valores presentes na cadeia; suponha que r3 > 0. Ao final do trecho, r0 deve conter o valor máximo e r1 deve conter o endereço do valor máximo. Exemplo • Exemplo 20: Escreva um trecho de programa para mover um bloco de palavras de memória da posição apontada por r1 para a posição apontada por r2. O tamanho do bloco (número de palavras) que deve ser movido é dado em r3. Exemplo • Exemplo 21: Escreva um trecho de programa que verifique se uma cadeia de bytes é palíndrome (ou seja, dá o mesmo resultado quando lida da direita para a esquerda.