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