关于汇编语言循环

时间:2015-02-04 09:16:42

标签: loops assembly x86

任何人都可以解释这段代码的作用吗?我有点理解它,但我不太明白当代码标签出现在“循环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

3 个答案:

答案 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代码,但在汇编时没有阻塞,一切都用标签控制。