考虑签名的数字(如+
,-
),编写代码提取,检查是否:
[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
吗?
通过回答这个问题,你可以帮助我整个系统编程课程(选修)。提前谢谢!
答案 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