Publicado por Listeiro 037 em (última atualização em 15/04/2013) [ 2854 hits ]
Login: Listeiro 037, 191144 pontos
Publicado por Listeiro 037 em 29/07/2012
Changelog: Esta segunda implementação usa deslocamento para a direita (shr) e operação "E" (and) para encontrar os valores da conversão ao invés de dividir o número por 16.
Revisando o primeiro código:
Os valores encontrados eram armazenados numa pilha. O primeiro valor a ser armazenado na pilha é o de impressão de nova linha.
Quando os valores forem desempilhados, este marcará o fim da pilha e então cessará a impressão.
A pilha é necessária devido ao modo de como os valores são obtidos na divisão.
Sendo o primeiro resto considerado o último dígito a ser impresso, este deverá entrar primeiro na pilha, de modo que será o último depois que todos os que entraram depois deles forem desempilhados.
No primeiro código, o número era dividido por dois e ao resto da divisão era acrescido o endereço de uma string que continha os possíveis caracteres de impressão do intervalo de 0 a 9, mais as letras do intervalo 'a' ... 'f', que equivalem aos valores hexadecimais de 10 a 15.
Este valor é armazenado na pilha e será retirado no momento de impressão de caracteres, que será o desempilhamento.
De modo que será passada à interrupção de kernel o valor desempilhado, o endereço para a impressão de um caractere na posição da string deslocado tantas posições de memória quanto fosse o resultado do resto da divisão.
O quociente era então dividido novamente e segue-se repetidamente até que todas as divisões sejam feitas.
A partir deste ponto, os valores serão desempilhados e passados à chamada de kernel, que imprimirá o caractere um a um.
Diferença entre a primeira e a segunda implementação:
* Na primeira o que se efetua são divisões por 16, trabalhando-se com os restos como sinais a serem impressos e os quocientes divididos novamente.
* Na segunda implementação usa-se uma operação "E" (and) para saber apenas o valor do último bit do número. Após isto o bit é descartado com a operação de deslocamento à direita. O valor encontrado na operação "E" é acrescido do endereço da string e empilhado, sendo desempilhado quando for feita a impressão de dígitos.
Quociente de divisão por 16 = Deslocamento de quatro casas à direita.
Resto de divisão por 16 = Os bits que somem no deslocamento de quatro casas à direita.
Publicado por Listeiro 037 em 28/02/2013
Changelog: Este terceiro método de escrita não usa mais a string com os caracteres a serem usados na impressão.
É feita normalmente a sequência de divisões por 16 e acumulados os restos para impressão de caracteres.
Ao invés disso os caracteres são colocados diretamente na pilha.
Daí o endereço da pilha com o caractere é enviado ao registrador para ser usado na impressão de um único caractere.
Sendo repetido isto em loop, até ser encontrado por comparação o valor que identifica o final da série de caracteres, que é o "\ 0", o mesmo da linguagem C.
Publicado por Listeiro 037 em 28/02/2013
Changelog: Esta nova implementação combina parte do desenvolvimento das versões 2 e 3:
- Ao invés de usar a divisão (div), combina o deslocamento para a direita (shr) e operação "E" (and) para encontrar os valores da conversão.
- Os caracteres vão sendo colocados diretamente na pilha.
- O loop de impressão é interrompido ao ser encontrado o caractere nulo "\ 0", que é o mesmo de fim de string na linguagem C.
GAS Inteiro para String
GAS Uppercase
Fibonnaci de N em Assembly
Relógio em assembly NES 8 bits (variante do 6502)
Calcula ano de nascimento - C + Assembly