Целочисленная проблема переполнения - PullRequest
7 голосов
/ 09 апреля 2011

У меня постоянно возникает проблема с переполнением целых чисел, и я понятия не имею, как ее решить. Может кто-нибудь помочь? Edx Conatins 181 и Eax содержит 174

       xor eax,edx       
       mov edx,2
       div edx   

Ответы [ 2 ]

6 голосов
/ 09 апреля 2011

Если вы говорите о x86, div edx на самом деле не имеет смысла - 32-битный div делит edx: eax на указанный целевой регистр.К счастью, чтобы разделить на 2, вам вообще не нужно использовать div.

mov eax, 174
mov edx, 181

xor eax, edx
shr eax, 1

Если вы по какой-то причине настаиваете на использовании div, вы хотите использовать другойрегистр.Обратите внимание, что x86 ожидает, что результат деления поместится в один регистр, поэтому перед делением вам нужно будет обнулить edx:

mov eax, 174
mov edx, 181

xor eax, edx
xor edx, edx
mov ebx, 2
div ebx
5 голосов
/ 09 апреля 2011

При делении с использованием 32-битного регистра, дивиденд равен edx:eax. Поскольку eax изначально 174, а edx изначально 181, вот что происходит:

  1. eax и edx - это xor-ed, результат сохраняется в eax. eax сейчас 27
  2. 2 хранится в edx
  3. edx:eax делится на edx. Это означает, что 0x20000001B делится на 0x2. Результат этой операции 0x10000000D. Процессор пытается сохранить это значение в eax, с остатком 1 в edx, но оно не подходит, потому что 1 находится в 33-м бите. Следовательно, вы получаете переполнение.

Вы можете исправить это, используя регистр, отличный от edx, чтобы убедиться, что edx равен нулю:

xor eax,edx
mov ecx,2
xor edx,edx ; Zero edx
div ecx
; eax contains 0xD, edx contains 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...