我是汇编语言的新手,我无法处理嵌套的循环语句。 我想如其他语言,如相同的表达式:汇编语言中的嵌套循环
for(i=0;i<10;i++){
for(j=0;j<10;j++){
statements....
}
}
我想用汇编语言这种表达。 谢谢...
我是汇编语言的新手,我无法处理嵌套的循环语句。 我想如其他语言,如相同的表达式:汇编语言中的嵌套循环
for(i=0;i<10;i++){
for(j=0;j<10;j++){
statements....
}
}
我想用汇编语言这种表达。 谢谢...
这里有一个简单的例子,我用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之前回答。
让我们一次一步地解决这个问题。第一步是打破了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;
为什么不编译它并研究生成的机器码? –
哪一种汇编语言?你的目标是什么架构? – BonzaiThePenguin
我正在使用x86架构 – Webster