and assembly x86 masm

and assembly x86



Montaje de la divisiĆ³n x86 con DX: AX (1)

Estoy trabajando con masm y me he encontrado con un escenario que no entiendo cómo resolverlo, por ejemplo:

X = (A)/(C*D)

Si multiplico C * D primero, mi valor es DX: AX y que yo sepa, no puedo usar eso como un divisor. Si hago la división por separado como A / C y A / D, corro el riesgo de perder precisión (de los recordatorios, etc.). ¿Cuál es la mejor manera de implementar esto?


Como nota correctamente, no puedes usar un número de 32 bits como divisor en una división de 16 bits, pero como solo nos interesa hacer una división de enteros, eso no es un problema.

Hay dos casos a considerar (para la división sin firmar):

  • DX == 0 : El resultado de C*D ajusta en 16 bits, por lo que podemos proceder de forma normal usando ax como el divisor de 16 bits.
  • DX > 0 ( DX != 0 ): C*D es mayor que 65335 ( 0xFFFF ) y la división de 16 bits sin signo de A y ese número siempre será 0 y el resto simplemente es A

O podría hacer como C y simplemente asumir que el resultado de C*D ajusta a 16 bits. :)