Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 关于汇编语言循环_Loops_Assembly_X86 - Fatal编程技术网

Loops 关于汇编语言循环

Loops 关于汇编语言循环,loops,assembly,x86,Loops,Assembly,X86,有人能解释一下这个代码的作用吗?我有点理解它,但我不太明白当代码标签出现在“循环N-Not-1”下面时会发生什么。我不确定我是否正确理解循环。我认为它们是 > do,而在C++中循环。在这种情况下,N-is-1的循环不是无限期地继续吗?我以为这是if-else语句而不是循环 编写一段代码,计算以下函数: 如果(N=1),那么Y=-X 其他的 Y=X 假设X的值在eax寄存器中。还假设N的值在 ebx寄存器。Y的计算值需要放在eax寄存器中。 提示1:在代码中使用循环指令。 提示2:这个问题可以用

有人能解释一下这个代码的作用吗?我有点理解它,但我不太明白当代码标签出现在“循环N-Not-1”下面时会发生什么。我不确定我是否正确理解循环。我认为它们是 > do,而在C++中循环。在这种情况下,N-is-1的循环不是无限期地继续吗?我以为这是if-else语句而不是循环

编写一段代码,计算以下函数: 如果(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

循环
指令类似于以下C代码:

(;ecx!=0;ecx--)的
{
//指示
}
您的代码使用循环指令检查ebx(N)是否为零:

ebx=N;
ecx=ebx;
对于(;ecx!=0;ecx--){
//如果ecx=1(N=1),我们进入循环
eax=-eax
}
Y=eax

我使用了类似C的代码,但在汇编中没有块,一切都由标签控制。

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

首先,这段代码的表现非常糟糕。我在这里复制它,没有混乱:

    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: