5/5/2008
Algoritmo para divisão de inteiros
Para a divisão inteira A / B, onde A e B tem n bits, use um
registrador adicional P, e concatene‐o à esquerda de A:
(P|A):
• Zere o P
• Execute o loop n vezes:
– Empurre (shl) para a esquerda (P|A) em 1 bit
– Subtraia B de P
– Atribua o complemento do bit mais significativo de (P‐B)
ao bit menos significativo de A
– Se (P‐B) é negativo, restaure P anterior
• Ao final, A contém o quociente, e P o resto da divisão.
Exemplo: 32/24 (6 bits)
• 32= 100000 e 24 = 011000, consequentemente ‐24 = 101000
• Inicialmente (P|A) = 000000|100000
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Após shl: 000001|000000
P‐B: 101001 Î setar menor bit de A para 0, restaura P
(P|A) = 000001|000000
Após shl: 000010|000000
P‐B: 101010 Î setar menor bit de A para 0, restaura P
Após shl: 000100|000000
P‐B: 101100 Î setar menor bit de A para 0, restaura P
Após shl: 001000|000000
P‐B: 110000 Î setar menor bit de A para 0, restaura P
Após shl: 010000|000000
P‐B: 111000 Î setar menor bit de A para 0, restaura P
Após shl: 100000|000000
P‐B: 001000 Î setar menor bit de A para 1, novo P = P‐B
Final: 001000 |000001
1
5/5/2008
idiv do Assembler
Instrução idiv b
• b: Divide o inteiro de AX / b e coloca resultado
em AL e resto em AH
• w:Divide o inteiro em DX:AX /b e coloca
resultado em AX e resto em DX
• l: Divide o inteiro em EDX:EAX /b e
coloca resultado em EAX e resto em EDX
2
Download

Algoritmo para divisão de inteiros Exemplo: 32/24 (6 bits) - PUC-Rio