2011-04-09 22 views
7

Sigo teniendo un problema de desbordamiento de enteros y no tengo ni idea de cómo resolverlo ¿Alguien puede ayudar? edx conatins 181 y eax contiene 174Problema de desbordamiento de enteros

 xor eax,edx  
     mov edx,2 
     div edx 
+0

Más información necesaria: por ejemplo, arquitectura objetivo, la versión del ensamblador. – iehrlich

+0

@suddnely_me ¿arquitectura de destino? – user700176

+0

Destinado versión ensamblador OFC> _ < – iehrlich

Respuesta

6

Suponiendo que estás hablando x86, div edx no tiene mucho sentido - un div de 32 bits divide edx: eax por el registro de destino especificado. Afortunadamente, para dividir por 2, realmente no necesita usar div en absoluto.

mov eax, 174 
mov edx, 181 

xor eax, edx 
shr eax, 1 

Si insiste en usar un div por alguna razón, desea utilizar un registro diferente. Tenga en cuenta que el 86 espera que el resultado de la división para caber en un registro, por lo que tendrá a cero EDX antes de la división:

mov eax, 174 
mov edx, 181 

xor eax, edx 
xor edx, edx 
mov ebx, 2 
div ebx 
+0

otra genial :) – Spyros

+0

gracias, funciona ahora como :) – user700176

4

Al dividir el uso de un registro de 32 bits, el dividendo es edx:eax. Desde eax es originalmente 174, y EDX es originalmente 181, esto es lo que sucede:

  1. eax y EDX son xor-ed, con el resultado de ser almacenado en eax. eax ahora es 27
  2. 2 se almacena en edx
  3. edx:eax se divide por edx. Esto significa que 0x20000001B está dividido por 0x2. El resultado de esta operación es 0x10000000D. La CPU intenta almacenar este valor en eax, con el resto, 1, en edx, pero no encaja porque el 1 está en el 33er bit. Por lo tanto, obtienes un desbordamiento.

Puedes solucionar este problema mediante el uso de un registro diferente de EDX para dividir, asegurándose a cero EDX:

xor eax,edx 
mov ecx,2 
xor edx,edx ; Zero edx 
div ecx 
; eax contains 0xD, edx contains 1 
+0

+1 gran explicación – Spyros

Cuestiones relacionadas