汇编语言,代码更正和if语句

时间:2013-11-05 13:56:19

标签: assembly if-statement x86 comparison

考虑签名的数字(如+-),编写代码提取,检查是否:

[EAX]*[ESI + 4*EBX]%[EDX + 3] |ECX%[EDX + 3]小于或等于[EBX + 20],如果为真,则将1放入EAX

这是我到目前为止所做的,但我无法弄清楚如何将其与[EBX + 20]进行实际比较:

 MOVSX EAX, [input1]
 MOVSX ESI, [input2]
 MOVSX EBX, [input3]
 MOVSX EDX, [input4]
 IMUL EBX, 4
 ADD ESI,EBX
 IMUL EAX, ESI
 ADD EDX, 3
 IDIV ECX, EDX
 OR EDX, ECX
 IDIV EAX, EDX

此代码缺少与EBX + 20的比较,并将1放入EAX。我还可以将%解释为IDIV吗?

通过回答这个问题,你可以帮助我整个系统编程课程(选修)。提前谢谢!

1 个答案:

答案 0 :(得分:-1)

请注意,IDIV无法通过任何方式划分ecx。它仅适用于EAX:EDX对。这样,您就不需要将EDX用于其他任何目的。

汇编语言中的方括号表示括号中地址指向的内存。在任务方面,只有ecx被其值使用。所有其他寄存器都包含一些内存地址,并且必须从内存中读取值。

此外,我假设所有寄存器在输入上都有正确的值:

compare:
         mov    eax, [eax]         ; eax = [eax]
         imul   eax, [esi+4*ebx]   ; eax = [eax]*[esi+4*ebx]
         mov    esi, edx           ; use esi instead of edi: esi = edx

         cdq              ; convert 32bit eax to 64bit eax:edx needed for division.

         idiv   [esi+3]   ; the remainder is in edx
         mov    edi, edx  ; store it in edi in order to use edx later.

         mov    eax, ecx  ; we can divide only eax:edx

         cdq

         idiv   [esi+3]   ; the second remainder is in edx

         or     edi, edx

         mov    eax, 0          ; prepare for the output value
         cmp    edi, [ebx+20]
         jg     end             ; edi is greater than [ebx+20]
         inc    eax             ; edi is less or equal than [ebx+20] so make eax = 1
end:
         retn