我是汇编语言的新手,我无法处理嵌套的循环语句。 我希望在其他语言中使用相同的表达式,例如:
for(i=0;i<10;i++){
for(j=0;j<10;j++){
statements....
}
}
我想用汇编语言表达这个表达式。 感谢...
答案 0 :(得分:3)
让我们一步一步地解决这个问题。第一步是将for
拆分为单独的部分:
i=0;
do {
j=0;
do {
/* statements.... */
j++;
} while(j < 10);
i++;
} while(i < 10);
while
主要是测试和跳跃:
i=0;
second:
j=0;
first:
/* statements.... */
j++;
if(j < 10)
goto first;
i++;
if(i < 10)
goto second;
接下来,重命名变量,使它们具有寄存器的名称:
ebx=0;
second:
ecx=0;
first:
/* statements.... */
ecx++;
if(ecx < 10)
goto first;
ebx++;
if(ebx < 10)
goto second;
现在它非常靠近装配,转换起来很简单:
mov ebx,0 ;ebx=0;
second:
mov ecx,0 ;ecx=0;
first:
;/* statements.... */
inc ecx ;ecx++;
cmp ecx,10 ;if(ecx < 10)
jb first ;goto first;
inc ebx ;ebx++;
cmp ebx,10 ;if(ebx < 10)
jb second ;goto second;
答案 1 :(得分:1)
这是我在C中使用内联汇编编写的一个简单示例,我在Visual Studio中使用Intel表示法进行了测试。我将计入eax
,这是用于函数返回值的寄存器,循环的所有迭代(即100)。 ebx
举行i
计数器,ecx
举行j
计数器。
如果您在内联使用它们时使用它们时要小心,ecx
用于对象内的this
引用,mul
和div
也使用它。您可以使用您喜欢的任何寄存器甚至堆栈。我使用xor
重置计数器,因为xor
操作比mov eax,0
操作便宜。
#include <stdio.h>
int countLoops()
{
_asm
{
xor eax,eax
xor ebx,ebx
xor ecx,ecx
outer_loop :
cmp ebx,10
je final
add ebx,1
inner_loop:
cmp ecx,10
je reset_inner_loop
add ecx,1
add eax,1
jmp inner_loop
reset_inner_loop:
xor ecx,ecx
jmp outer_loop
final:
};
}
int main(void )
{
int numOfLoops = countLoops();
printf("%d\n", numOfLoops);
return 0;
}
here之前也回答了这个问题。