2013-11-19 3 views
-2

У меня есть вопрос, что мне нужно преобразовать только вложенный цикл в сборку (8086). Вы, ребята, хотите научить меня или показать мне код? Большое спасибоC++ to 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"); 
+3

определить «научить меня». «дайте мне код» определенно не приемлемый вопрос, тем более, что вы не проявили никаких усилий. –

+1

Вопросы, требующие кода, должны демонстрировать минимальное понимание решаемой проблемы.Включите попытки решения, почему они не работают и ожидаемые результаты. –

+0

Я пытаюсь учиться, но я действительно не знаю, как должен идти код, но вы можете просто игнорировать «дать мне код». Извините – user3007600

ответ

0

Вы можете скомпилировать C/C++ код с -S флагом для создания кода сборки из источника. Однако, если вы просто скопируете код, это будет очень легко сказать. Это в сочетании с O0 может генерировать некоторую полезную сборку для просмотра.

+0

Я почти уверен, что его учитель имел в виду ручную конверсию , Я считаю, что автоматическая компиляция будет легко заметна и бесполезна в качестве домашней работы. –

+0

yes Jan Dvorak Мне нужно ручное преобразование, но я не собирался копировать и вставлять код. Как я уже сказал, я хочу научиться этому и понять его, а не просто копировать и вставлять копии, поскольку это последний вопрос прошлого года. Я не хочу рисковать. Джейсон Солтер, мне нужно использовать метод push и pop для этого цикла? – user3007600

+0

Вам не понадобится использовать их специально, но есть много способов отслеживать, поэтому вам нужно будет хранить некоторую информацию в стеке. Как и в любой программе, есть много способов написать этот код. Вы также можете хранить и получать информацию о стеке, сохраняя вещи относительно указателя стека. – Jason

2

давайте говорить, что мы хотим, чтобы перевести следующий цикл:

для (INT х = 0; х < у; х ++)

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 работает так же, только с меньшими затратами, больше или равно, больше
  • JA, JB, JAE, JBE (Переход, если выше/ниже) работает аналогично, но предполагает, что аргументы были без знака вместо этого.
  • метки обозначены двоеточиями, как в C/C++
  • , если вы чувствуете необходимость безусловного перехода, используйте JMP. Вы не должны нуждаться в этом для цикла do..while, но они пригождаются, если вы хотите использовать цикл while.

Реф. (А-М): 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

Смежные вопросы