任何人都可以解释这段代码的作用吗?我有点理解它,但我不太明白当代码标签出现在“循环N-Not-1”下面时会发生什么。我不确定我是否正确理解循环。我认为它们是C ++中的do-while
循环。在这种情况下,N-is-1的循环不会无限期地继续吗?我以为这是一个if-else语句而不是循环?
编写一段计算以下函数的代码: if(N = 1)则Y = -X 其他 Y = X 假设X的值在eax寄存器中。还假设N的值在 ebx注册。 Y的计算值需要放在eax寄存器中 提示1:在代码中使用循环指令 提示2:使用少于五条指令可以解决此问题。
; eax = X, ebx = N ; Write your code below mov ecx, ebx loop N-not-1 N-is-1: neg eax N-not-1: ; Y = eax
答案 0 :(得分:1)
loop
指令对ECX的值进行操作。它首先减少ECX并检查它是否为零。如果它不为零,则它跳转到指定的地址。如果它为零,则中断。
mov ecx, ebx ; this instruction moves the value of N to ecx
loop N-not-1 ; if N is 1 then, on decrementing it becomes 0 and the loop breaks.
N-is-1: neg eax ; if N is 1, eax gets negated as the loop breaks
N-not-1: ; Y = eax // if N is not 1, eax remains unchanged
答案 1 :(得分:1)
首先,这段代码非常糟糕。我在这里复制它没有杂乱:
mov ecx, ebx
loop N-not-1
neg eax
N-not-1:
此代码是一个黑客。它实际上并没有循环。它只是利用了循环指令将做3件事的事实:递减ecx,检查它是否为零,并在一条指令中全部跳转。它等同于以下内容:
dec ebx
cmp ebx, 0
jnz N-not-1
neg eax
N-not-1:
答案 2 :(得分:-1)
loop
指令类似于以下C代码:
for (; ecx != 0; ecx--) {
// instructions
}
并且您的代码使用循环指令来检查ebx(N)与零:
ebx = N;
ecx = ebx;
for (; ecx != 0; ecx--) {
// if ecx=1 (N = 1) we enter the loop
eax = -eax
}
Y = eax
我使用C代码,但在汇编时没有阻塞,一切都用标签控制。