整数溢出问题
回答
假设你正在谈论的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
另一个伟大的:) – Spyros 2011-04-09 18:32:19
感谢,工程样的现在:) – user700176 2011-04-09 18:46:40
当使用一个32位的寄存器分割,被除数是edx:eax
。由于eax最初为174,edx最初为181,所以会发生以下情况:
- eax和edx是异或,结果存储在eax中。 eax现在是27
- 2存储在edx中
edx:eax
除以edx。这意味着0x20000001B除以0x2。此操作的结果是0x10000000D。 CPU尝试将此值存储在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
+1很好的解释 – Spyros 2011-04-09 18:31:59
- 1. 溢出问题
- 2. 火狐溢出:滚动调整问题
- 3. 溢出和调整大小问题
- 4. 整数溢出
- 5. 整数溢出/下溢
- 6. IE6溢出问题
- 7. CSS溢出问题
- 8. IE7溢出问题
- 9. DIV溢出问题
- 10. 问题溢出div
- 11. 溢出的问题
- 12. css溢出问题
- 13. 表溢出问题
- 14. Java溢出问题
- 15. Ext.MessageBox溢出问题
- 16. USRP2溢出问题
- 17. IE9溢出问题
- 18. DIV溢出问题
- 19. html溢出问题
- 20. 整数不溢出
- 21. 长整数溢出
- 22. 整数溢出C
- 23. rlimit64整数溢出
- 24. 整数溢出PHP模数
- 25. TSQL日期溢出问题
- 26. 溢出问题:-webkit-paged-x
- 27. 在IE7 jscrollPane溢出问题
- 28. 溢出-y滚动问题
- 29. 溢出:隐藏的问题
- 30. CSS3翻译问题溢出
需要更多信息:例如,目标体系结构,汇编程序版本。 – iehrlich 2011-04-09 18:18:41
@suddnely_me目标架构? – user700176 2011-04-09 18:21:15
意味着汇编版本OFC> _ < – iehrlich 2011-04-09 18:22:43