2011-11-22 16 views
6

Estoy aprendiendo acerca de la división en lenguaje ensamblador. De acuerdo con el libro del que estoy aprendiendo, el resultado de la operación idiv se coloca en eax y el resto en edx.Cómo implementar el operador de mod en el ensamblado

Un ejercicio en el libro es implementar number = result % divisor en el montaje.

Hubiera pensado que esto sería equivalente a una operación de división normal, excepto que edx sería el resultado.

Esto no funcionó, sin embargo, y edx devolvió aparentemente basura.

¿Por qué? ¿Cómo implementa el pseudocódigo anterior en el ensamblaje?

+4

Yo codificaría una pequeña función C y vería el ensamblaje generado (por ejemplo, con 'gcc -O -fverbose-asm -S tiny.c') –

+2

Su pregunta es similar a http://stackoverflow.com/questions/8021772/assembly-language-how-to-do-modulo/8022107 Muestra tu código real si tienes problemas específicos (lo más probable es que no estés borrando la parte superior superior de rdx: rax, edx: eax o dx: hacha). – user786653

+0

Difícil de adivinar sin ver el código, pero un error común es olvidarse de cero antes del idiv. –

Respuesta

15

de enteros módulo puede implementarse de dos maneras:

primer lugar mediante el uso de DIV o IDIV, en el que el resto se pone en EDX, pero hay que cero EDX primero, o para Intel cita:

Tamaño del operando ----------- | Dividendo | Divisor | Cociente | Remanente

Quadword/doblepalabra | EDX: EAX | r/m32 | EAX | EDX.

por ejemplo:

eax = eax % 9 

cuando sin signo se convierte en:

XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder  
MOV ECX,9 
DIV ECX 
MOV EAX,EDX 

cuando se firmó, que es:

MOV ECX,9 
CDQ ;this will clear EDX due to the sign extension 
IDIV ECX 
MOV EAX,EDX 

La segunda forma es una optimización utilizado cuando Modulo usando un poder de dos, en este caso usted AND por o ne menos que la potencia de dos, por ejemplo: eax = eax % 8 se convierte en AND EAX,7.

+0

Dado que idiv es la versión firmada, ¿no debería CDQ a edx? – harold

+0

Intenté eliminar mi pregunta, pero usted ya había respondido. Solo quiero señalar que puede cambiar bastante después de agregar un ejemplo de código. –

+0

@harold: ustedes, olvidaron eso, buena captura :) – Necrolis

Cuestiones relacionadas