我是彙編語言的新手,我無法處理嵌套的循環語句。 我想如其他語言,如相同的表達式:彙編語言中的嵌套循環
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