Publicado por Listeiro 037 em (última atualização em 19/04/2013) [ 2950 hits ]
Login: Listeiro 037, 190166 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 8.
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 7.
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 caracter 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 caracter um a um.
Diferença entre a primeira e a segunda implementação:
* Na primeira o que se efetua são divisões por 8, 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 8 = Deslocamento de três casas à direita.
Resto de divisão por 8 = Os bits que somem no deslocamento de três 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 8 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.
Retorna o maior elemento de um vetor
Hora do sistema
Fatorial em assembly
Escrita de um número em binário na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembler)
Escrita de um número em binário na tela em Assembly Puro para Linux x86 (GNU Assembly)