Exception Hla程序集异常与分区

Exception Hla程序集异常与分区,exception,assembly,division,hla,Exception,Assembly,Division,Hla,当我使用这段代码时,我得到一个异常。至少这是我从学校的编译器那里得到的 给出了i,j的值, j=348,i=457830(i声明为int 32,j声明为int 16) 我应该在EAX中返回的值是:(I-j)%(3+j) 我想要的是剩下的,我得到了,但是除了这个例外,我不能得到我的家庭作业的分数。你不应该将EDX初始化为零(在DIV之前),因为它将与DIV一起使用吗?您的DIV将执行(EDX:EAX)/EBX。x86指令集解释了如何工作(在本例中使用32位寄存器)。EDX:EAX表示64位无符号整

当我使用这段代码时,我得到一个异常。至少这是我从学校的编译器那里得到的

给出了i,j的值, j=348,i=457830(i声明为int 32,j声明为int 16)

我应该在EAX中返回的值是:(I-j)%(3+j)
我想要的是剩下的,我得到了,但是除了这个例外,我不能得到我的家庭作业的分数。

你不应该将EDX初始化为零(在DIV之前),因为它将与DIV一起使用吗?您的DIV将执行(EDX:EAX)/EBX。x86指令集解释了如何工作(在本例中使用32位寄存器)。EDX:EAX表示64位无符号整数。如果未将EDX初始化为零,则该除法将使用EDX中可能存在的垃圾(EDX是64位部分的上32位)dividend@MichaelPetch:他正在使用
cdq
将eax扩展到edx:eax。该代码应该适用于这些值。(但是Juras,您应该使用
idiv
,或者清除edx,而不是将符号扩展到其中)。我看不出问题。请尝试使用调试器单步执行,以确保正确加载值。
div
如果结果不适合32位,则可能出现故障。(也许符号位是在eax中设置的,所以EDX:eax得到了一个接近2^64的数字,这需要一个非常大的除数才能降到32位?@PeterCordes我实际上错过了CDQ,主要是因为它不是一个典型的函数调用(我想我的眼睛跳过了这行,以为这是一个注释)没有意识到这是符号扩展指令。但即使你排除了这里有符号和无符号混合的事实,给出的测试值也不应该引起问题。缺少的是i和j的声明和初始化,以了解到底发生了什么。@MichaelPetch:是的,完全正确。就像我说的,我没有看到任何问题对于
i
j
的值,此代码有任何错误。可能是由于发布的代码之外的内容而加载了垃圾数据。@MichaelPetch,谢谢。使用idiv而不是div似乎是解决方案。
mov(i,eax);
movzx(j,ebx);  
sub(ebx,eax);  
add(3,ebx); 

cdq; 
div(ebx); 
mov(edx,eax);