Publicado por Listeiro 037 em (última atualização em 02/08/2012) [ 2428 hits ]
Login: Listeiro 037, 191040 pontos
Publicado por Listeiro 037 em 01/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 2.
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: 0 e 1.
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 2, 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 2 = Deslocamento de uma casa à direita.
Resto de divisão por 2 = O bit que some no deslocamento de uma casa à direita.
Publicado por Listeiro 037 em 31/07/2012
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 2 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 caracter é enviado ao registrador para ser usado na impressão de um único caracter.
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.
sdfgsd
"Clear Screen" para Linux x86 em Assembly Puro (Nasm - Netwide Assembler)
Assembler 8086 - Recebe um caractere do usuário e imprime o código ASCII em pontos
Árvore binária de busca em Assembly - com comentários
GAS Inteiro para String (formato binário)