C ++到Assembly 8086

时间:2013-11-19 06:41:18

标签: assembly

我有这个问题,我必须只将嵌套循环转换为程序集(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");

2 个答案:

答案 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(如果在上方/下方跳转)的工作方式类似,但假设参数是无符号的。
  • 标签用冒号表示,如C / C ++
  • 如果您觉得需要无条件跳转,请使用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结合使用可以生成一些有用的程序集来查看。