我有这个问题,我必须只将嵌套循环转换为程序集(8086)。你们介意教我或给我看代码吗?非常感谢
#include <iostream>
#include <ctime>
using namespace std;
void main ()
{
time_t start, end;
unsigned short a, b, c, y, count=0;
float diff;
cout << "Enter y : ";
cin >> y;
cout << "Calculation start..." << endl;
start = clock();
//Convert this nested for loop to assembly instructions
**for (a=0; a<y; a++)
for (b=0; b<y; b++)
for (c=0; c<y; c++)
if ((a + 2*b - 8*c) == y)
count++;**
//Do not change the code below
end = clock();
diff = (float)(end - start)/CLOCKS_PER_SEC;
cout << "Calculation complete." << endl;
cout << "Time used is " << diff << " second" << endl;
cout << "There are " << count << " combination to produce " << y << endl;
system ("pause");
答案 0 :(得分:2)
假设我们要翻译以下循环:
for(int x = 0; x&lt; y; x ++)
X86汇编程序不直接支持for
循环,但do..while
循环很好地转换为汇编。因此,第一步是将循环转换为do..while:
int x = 0;
do {
..
x ++;
} while(x < y);
do ... while(x)
可以重写为block: ... if(!x) goto block
我会让读者正确地组装说明书,但说明是:
MOV dst, src
使用src
覆盖dst
。由于您没有足够的寄存器来执行三个嵌套循环和计算,src
可能是一个内存位置。请记住,在X86指令中不能使用多个内存位置。INC dst
会增加dst
处的值。我认为内存位置在这里工作得很好,但如果没有,则侧面有一对MOV
s。CMP arg, arg
执行算术减法,设置适当的标志并丢弃差异。这可以让您知道两个(签名)参数中的哪个更大或更小。请记住,两个参数都不能是内存位置。JLE label
的第一个参数(如果设置标志的最后一条指令是label
(或CMP
},则CMP
会跳转到SUB
))假设两个参数都已签名,则小于或等于第二个。JL, JGE, JG
的工作方式类似,只有Less,Greater或Equal,Greater JA, JB, JAE, JBE
(如果在上方/下方跳转)的工作方式类似,但假设参数是无符号的。JMP
。您不应该在do..while
循环中使用它,但如果您想要while
循环,它们会派上用场。参考。 (A-M):http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf
参考。 (N-Z):http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2b-manual.pdf
答案 1 :(得分:0)
您可以使用-S
标志编译C / C ++代码,以从源生成汇编代码。但是,如果您只是复制代码,那将非常容易辨别。与O0
结合使用可以生成一些有用的程序集来查看。