GNUSim8085 é um simulador gráfico, Montador e Depurador para o microprocessador Intel 8085 no GNU/Linux e no Windows. Está entre os 20 vencedores do FOSS India Awards anunciado em Fevereiro de 2008.

Características Editor Editor de programa com uma interface interativa para a entrada de todas as instruções padrões. Syntax highlighting para distinção entre instruções, operandos, comentários e etc. Uma visão separada de opcodes, que mostra o código montado em hexadecimal.

Montador (Assembler) Suporte a todas as instruções padrões do 8085 Suporte para diretivas do montador mais populares O Montador fornece algumas características para facilitar o processo de codificação O montador ignora qualquer coisa em uma linha após a virgula

Depurador (Debugger) Completa visão dos registradores e flags Suporte a breakpoints Execução/Depuração de um programa passo a passo Conversor Hexadecimal-Decimal Inspector em tempo de execução da pilha e das variáveis definidas no código fonte. Inspector e manipulador em tempo de execução da memória e das portas E/S.

Impressão Impressão do programa direto do editor.

Utilização O GNUSim8085 é um simulador gráfico do processador Intel 8085, a linguagem usada para as simulações é o Assembly. Ele é utilizado para o ensino de arquitetura computadores, o GNUSim8085 auxilia o entendimento do uso de registradores do processador facilitando o aprendizado e implementação de códigos devido a sua interface gráfica O simulador gráfico GNUSim8085 simula o funcionamento do microprocessador Intel 8085, com as mesmas instruções disponíveis em processador real. A entrada e a saída dos processadores reais e o simuladores são iguais, embora o método de processamento interno podem ser diferentes. O simulador GNUSim8085 permite visualizar o conteúdo dos registradores, a memória e os valores de E/S, mas só é possível executar uma instrução de cada vez, e também escrever código em mnemônicos.

Exemplos de códigos

Função de Divisão em assembler. jmp start ;data v_divisor: ds 1; v_dividendo: ds 1; v_resto: ds 1; v_resultado: ds 1; ;code ;função para_dividir_parte realiza a divisão por partes acrescentando 1 a cada "divisão" para_dividir_parte: nop ;salva endereço de retorno pop d; ;pega os parametros em BC pop b; ;joga o dividendo em A mov a,b; cmp c; compara se o divisor não é maior que o dividendo jc fim_divisao ;a divisão é efetuada a partir daqui divisao: sub c; diminui o valor do divisor do dividendo inr h; incrementa o valor do resultado cmp c; compara se o dividendo é maior que o divisor jnc divisao; pula para a divisao se não for maior fim_divisao: mov b,a; pega o resto da divisão push h;empilha o resultado push b;empilha o resto push d;empilha o retorno ret start: nop ;zerando todos os registradores mvi b,00h; mvi c,00h; mvi d,00h; mvi e,00h; mvi h,00h; mvi l,00h; ;dividendo = 10 mvi a,02h; sta v_dividendo; ;divisor = 2 mvi a,02h; sta v_divisor; ;zera resultado mvi a,00h; sta v_resultado; ;carrega os valores para BC lda v_dividendo; mov b,a; lda v_divisor; mov c,a; ;coloca os parametros na pilha push b; ;chama a divisão call para_dividir_parte; ;recupera o resto da divisão pop b; mov a,b; sta v_resto ;recupera o resultado da divisão pop h; mov a,h; sta v_resultado hlt;

Função de Divisão em java public static long divisor(long n) { long div = 2; int i; if (n > 0) { div = div / n;

return (div);

Fatorial Iterativo em Assembler. jmp start

;declarando as variaveis: fat, i, n; v_fat: ds 1; v_i: ds 1; v_n: ds 1; ;Fim da declaração;

start: nop; inicio do programa;

mvi a, 05h; n <= 5 (Registrador A); sta v_n; variavel v_n armazena o valor do registador A;

call void_fatiter; chama o método void_fatiter;

void_fatiter: nop; método fatiter{ mvi a, 01h; fat <= 1 (Registrador A); sta v_fat; variavel v_fat armazena o valor do registador A;

;inicio do if(n>0){

lda v_n; carrega o valor da variavel v_n para o registrador A; mov b, a; move o valor do registrador A para o registrador B; mvi a, 00h; zera o registrador A; cmp b; compara o valor do registador B com o registrador A; jnz fim_if; pula para função fim_if se não der zero (se o valor que estiver em B for = 0);

fim_if: jnc return_fat; chama função return_fat caso o if não seja satisfeito;

inicio_for: nop; inicio do for(i = 1; i <= n; i++){

mvi a, 01h; i <= 1 (Registrador A); sta v_i; variavel v_i armazena o valor do registador A;

r1: nop; rotina 1; mov c, a; move o valor do registrador A para o registrador C; lda v_n; carrega o valor da variavel v_n para o registrador A; cmp c; compara o valor do registador C com o registrador A; jc r4; pula para rotina 4 se der carry;

r4: call multi; rotina 4; chama função multi;

r3: lda v_i; rotina 3; carrega o valor da variavel v_i para o registrador A; inr a; incrementa o valor do registrador A; sta v_i; variavel v_i armazena o valor do registador A; jmp r1; pula para rotina 1;

r2: call return_fat; rotina 2; chama a função return_fat;

multi: nop; função multi; lda v_fat; carrega o valor da variavel v_fat para o registrador A; mov b, a; move o valor do registrador A para o registrador B; lda v_i; carrega o valor da variavel v_i para o registrador A; mov d, a; move o valor do registrador A para o registrador D; mov e, a; move o valor do registrador A para o registrador E; cmp b; compara o valor do registador B com o registrador A; jz r3; pula para rotina 3 se der zero; dcr d; decrementa o valor do registrador D; lda v_fat; carrega o valor da variavel v_fat para o registrador A;

r5: add b; rotina 5; soma o valor do registrador A com o valor do registrador B; dcr d; decrementa o valor do registrador D; jnz r5; pula para rotina 5 se não der zero; sta v_fat; variavel v_fat armazena o valor do registador A; lda v_n; carrega o valor da variavel v_n para o registrador A; cmp e; compara o valor do registador E com o registrador A; jz r2; pula para rotina 2 se der zero; ret; retorna para chamada da função multi;

;fim do for } ;fim do if }

return_fat: nop; função return_fat;

lda v_fat; carrega o valor da variavel v_fat para o registrador A;

hlt; fim do programa;

Fatorial iterativo em java. public static long fatiter(long n) { long fat = 1; int i; if (n > 0) { for (i = 1; i <= n; i++) { fat = fat * i;

return (fat);

Função de Multiplicação de dois Números jmp start

;declaração das variáveis multiplicando: ds 1; multiplicador: ds 1; resultado: ds 1; ; fim da declaração das variáveis

;função de multiplicação dos números multiplicacao: nop pop d;guarda na pilha o endereço do registrador d (endereço de retorno) pop b;guarda na pilha o endereço do registrador d mvi a,00h;move imediatamente o valor zero para o registrador a

multiplica: add b; soma o valor do registrador a com o valor do registrador b dcr c; decrementa o numero de vezes que é multiplicado jnz multiplica; volta a fução multiplica enquanto o registrador c for diferente de zero mov h,a;move o valor do registrador a para o registrador h push h;guarda na pilha o valor do registrador h push d;guarda na pilha o valor do registrador d

ret ;code start: nop mvi a,5h;move o valor 5H para o registrador a, que representa o multiplicando sta multiplicando;armazena diretamente o conteúdo do registrador na variável multiplicando mvi a,2h;move o valor 2H para o registrador a, que representa o multiplicador sta multiplicador;Armazena diretamente o conteúdo do registrador na variável multiplicador mvi a,00h;move imediatamente o valor zero para o registrador a sta resultado;armazena o conteúdo do acumulador em resultado

lda multiplicando;carrega o acumulador no multiplicando mov b,a;move o valor do registrador a para o registrador b lda multiplicador;carrega o acumulador no multiplicador mov c,a;move o valor do registrador a para o registrador c

push b;guarda na pilha o valor do registrador b call multiplicacao;chama a função multiplicação

pop h;guarda na pilha o endereço do registrador h mov a,h;move o valor do registrador h para o registrador a sta resultado;armazena o conteúdo do acumulador em resultado

hlt

Função de Multiplicação em java public static long divisor(long n) { long mult = 2; int i; if (n > 0) { mult = mult * n;

return (mult);

Fatorial recursivo em assembler

jmp start;salta para o inicio do programa

V_N: ds 1 ; declaração de variável start: nop;inicio do programa

mvi a,03h;adiciona o valor 3 para o acumulador mov h, a;move o valor do acumulador para o registrador H sta V_N;atribui o valor para a variável call fatrecu;chama o método do fatorial recursivo para retornar o fatorial

fatrecu: nop;metodo fat recursivo

V_fat: ds 0;declara a variável mvi a,00h;move o valor o para o acumulador sta V_fat;atribui o valor para a variável if: nop ;instrução if(n == 0) lda V_N;puxa o valor da variável mov b, a;move o valor que esta no acumulador para registrador b mvi a, 00h;atribui o valor 0 para o acumulador cmp b;comparação se b = ao a se for igual a zera e true jnz else;se não, salta para o método falsidade else mvi a,01h;move o valor 1 para o acumulador sta V_fat; seta o valor do acumulador na variável call multfat;chama a multiplicação

else: nop; instrução de falsidade else lda V_N;puxa o valor da variável mov b, a;move o valor do acumulador para o registrador b mvi a, 00h;atribui valo 0 para o acumulador cmp b;comparação se n > 0 call mult;chama o método de multiplicação verificar o valor da variavel n fim_if: nop;fim do laço de repetição if

mult: nop; chamado da verificação do fatorial lda V_fat;puxa o valor da variável mov c, a;move o valor do acumulador para o registrador c lda V_N;puxa o valor da variável mov d, a;move o valor do acumulador para o registrador d mov e, d;move o valor do registrador d para o registrador e dcr e;decremento o valor do registrador e mov a, e;move o valor do registrador e para o acumulador sta V_N;seta o valor na variável N jnz else;enquanto não der 0 retorna para o else call if;chama o if multfat: nop ; metodo da multiplicação dos fatoriais lda V_fat;puxa o valor da variável mov c, a;move o valor do acumulador para o registrador c sta V_N;atribui o valor do acumulador para a variável mov d, a;move o valor do acumulador para o registrador d mov e, d;move o valor do registrador d para o registrador e mov a, e;move o valor do registrador e para o acumulador mvi l, 00h;atribui o valor 00 para o registrador l comp: inr e;incrementa o registrador e inr l;incrementa o registrador l para verificação mov c, a; move o valor do acumulador para o registrador c mov a, l; move o valor do registrador l para o acumulador mov d, a;move o valor do acumulador para o registrador d mov b, e;move o valor do registrador e para o registrador b cmp h;compara o acumulador com o valor do registrador h atribuído o valor no começo do programa jnc return_fat;se for igual chama o método return_fat mvi a, 00h;atribui o valor 00 para o acumulador

mulf: add c ; adiciona o valor do acumulador no registrador c dcr b; decrementa o valor de b jnz mulf;salta para o método mulf call comp;chama o comp

return_fat: mov a, c;move o valor do registrador c para o acumulador sta V_fat; seta a o valor do acumulador para a variável V_fat para o retorno do fatorial

hlt;fim do programa

Fatorial Recursivo em Java.

public static long fatrec(long n) { long fat = 0; if (n == 0) fat = 1; else if (n > 0) fat = n * fatrec(n - 1); return (fat);

Numero Primo em Assembler ;Numero__Primo

jmp start

v_par: ds 1

isPrimo: nop

;carrega valor imediato para o registrador mvi h, 02h ;carrega valor imediato para o registrador mvi l, 01h

jmp inicio_while

;função de dividir funcao_divisao: nop

cpi 01h jz f_1

divisao: nop

;compara A com registrador L cmp l ;salta se o valor de L for igual ao valor contido em A jz incrementa_contador ;compara se A com valor imediato 0 cpi 00h