·

Cursos Gerais ·

Arquitetura de Computadores

Send your question to AI and receive an answer instantly

Ask Question

Preview text

Exemplo de código que compara dois valores NOVO Comparação de Dois Números Exemplo simples em Assembly Code Region starting at address 0000h ORIG 0000h Programa principal MOV R1 5 Carrega o primeiro número em R1 MOV R2 5 Carrega o segundo número em R2 CMP R1 R2 Compara R1 e R2 BRZ Equal Se forem iguais vai para Equal semelhante a CMPZ MOV R3 0 Caso contrário coloca 0 em R3 BR WriteResult vai para a escrita do resultado Equal MOV R3 1 Se forem iguais coloca 1 em R3 e continua para a instrução seguinte WriteResult ADD R3 0 Converte o resultado para ASCII para ser visto na coluna direita da Main Memory Zone no separador Simulator MOV R4 8000H MOV MR4 R3 Escreve o resultado no separador Simulator na Main Memory Zone a começar em 8000H 8000 0031 0000 0000 0000 0000 0000 0000 0000 1 Finaliza o programa loop infinito EndLoop JMP EndLoop Registos R1 com 5 R2 com 5 Stack Pointer Program Counter Bits de estado Main Memory Zone Área definida para o SP endereco 8005 valor transferido de R3 valor transferido de R3 mas convertido em ASCII Definido como ORIG 0000h para a área do código Algumas considerações A instrução CMP R1 R2 é usada para comparar os valores armazenados nos registos R1 e R2 No procesador P3 o comportamento especifico do instução depende da actualidade e da lógica da sua unidade de controlo mas geralmente realiza uma subtração lógica O valor de R2 é subtirado de R1 mas o resultado da subtração não é armazenado em nenhum registo ou memória São apenas actualizados os flags ou bits de estado Zero Z Definido se o resultado da subtração for zero R1 R2 Negativo N Definido se o resultado da subtração for negativo R1 R2 Carry C Geralmente reflete um empréstimo no contexto de subtração R1 R2 ou R1 R2 dependendo do processador Overflow V Indica se ocorreu um overflow aritmético ou seja se o resultado ultrapassou o limite do intervalo do tipo de dado Uso Posterior A comparação é tipicamente usada para decidir o fluxo do programa como exemplificado a seguir CMP Formato CMP op1 op2 Flags ZCNO Acção compara os operandos op1 e op2 actualizando os bits de estado Efectua a mesma operação que SUB op1 op2 sem alterar nenhum dos operandos É habitualmente seguida no programa por uma instrução BRcond JMP cond ou CALL cond A instrução BRZ é uma instrução de desvio condicional em Assembly BR Branch é uma instrução que faz o desvio para o endereço especificado no caso Equal dependendo de uma condição associada a uma flag de status Z Zero Flag Especifica que o desvio ocorrerá apenas se a flag Zero Z estiver definida com 1 A flag é atualizada através de instruções do tipo CMP que comparam dois valores Funcionamento Após a execução da instrução CMP R1 R2 o processador verifica se os valores de R1 e R2 são iguais Se R1 R2 o resultado da subtração interne será 0 e a flag Zero Z será ativada set a 1 Se R1 R2 a flag Zero Z será desativada set a 0 verificar BRP ou BRNP para saber qual o maior A instrução BRZ Equal verifica o estado da flag Zero Se a flag Zero estiver ativada 1 O programa desvia salta para o rótulo Equal Se a flag Zero estiver desativada 0 O programa continua para a próxima instrução após o BRZ No contexto do programa CMP R1 R2 Compara os valores dos registos R1 e R2 BRZ Equal Se os valores em R1 e R2 forem iguais o programa desvia para o rótulo Equal Se não forem iguais o programa continua para a próxima instrução que é MOV R3 0 Efeito no fluxo Se R1 e R2 forem iguais O programa desvia para o rótulo Equal onde R3 é carregado com o valor 1 Se R1 e R2 forem diferentes O programa executa MOV R3 0 atribuindo o valor 0 a R3 Assim implementase uma lógica condicional em Assembly dependendo do resultado da comparação entre dois valores As instruções seguintes são usadas para mover dados entre os registos e a memória MOV R4 8000H MOV MR4 R3 MOV R4 8000H MOV Move Esta instrução copia o valor fornecido para o registo especificado R4 É o registo de destino que receberá o valor 8000H É um valor literal constante em hexadecimal Foi definido anteriormente na Main Memory Zone como a área a observar o resultado da comparação O que acontece O valor hexadecimal 8000H 32768 em decimal é carregado no registo R4 Após esta instrução o registo R4 conterá o endereço de memória 8000H MOV MR4 R3 MR4 Referese ao conteúdo da memória no endereço armazenado no registo R4 Como R4 contém 8000H MR4 referese ao endereço de memória 8000H R3 É o registo que contém o valor a ser armazenado na memória O que acontece O valor atualmente armazenado no registo R3 é copiado para a posição de memória cujo endereço está armazenado em R4 neste caso 8000H A memória no endereço 8000H passa a conter o valor de R3 No contexto do programa As instruções são usadas para armazenar o resultado final que está em R3 numa posição de memória específica 8000H para ser visualizado posteriormente O valor de R3 é escrito na memória na posição 8000H É convertido para ASCII anteriormente com ADD R3 0 para que o conteúdo dessa posição de memória possa ser observado no painel do simulador Main Memory Zone Resumo MOV R4 8000H Configura o endereço de memória 8000H no registo R4 MOV MR4 R3 Armazena o valor de R3 na memória no endereço 8000H Este processo é uma forma básica de transferir dados de registos para a memória Última alteração quintafeira 19 dezembro 2024 2132