Publicado por Listeiro 037 em (última atualização em 08/04/2013) [ 2980 hits ]
Login: Listeiro 037, 191069 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 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 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.
GAS Inteiro para String
GAS Informações da CPU
GAS Inteiro para String (formato binário)
Árvore binária de busca em Assembler 8086
Algoritmo de Raiz Quadrada Inteira em Assembly Puro para Linux x86 (GNU Assembler)