Перевести программу (C++ -> Asm) - Assembler
Формулировка задачи:
нужно перевести из ассемблера в С++
#include "stdafx.h" #include <iostream> using namespace std; //бинарный алгоритм вычисления НОД int NOD(int A, int B) { int k=1; while ((A!=0) && (B!=0)) { while ((A%2==0) && (B%2==0)) { A/=2; B/=2; k*=2; } while (A%2==0) A/=2; while (B%2==0) B/=2; if (A>=B) A-=B; else B-=A; } return B*k; } //главная функция void main() { setlocale(LC_ALL,"Rus"); int A, B; cout<<"A > "; cin>>A; cout<<"B > "; cin>>B; cout<<"НОД("<<A<<", "<<B<<")="<<NOD(A, B); system("pause>>void"); }
Решение задачи: «Перевести программу (C++ -> Asm)»
textual
Листинг программы
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm includelib \masm32\lib\masm32.lib includelib \masm32\lib\msvcrt.lib ;setlocale LC_ALL = 6 .data L$9 DB 'Rus',0 L$10 DB 'A:',0 L$11 DB '%d',0 L$12 DB 'B:',0 L$13 db 'НОД( %d, %d)= %d',0 .data? A dd ? B dd ? ; //#include "stdafx.h" ; #include <stdio.h> ; #include <conio.h> ; #include <locale.h> ; //using namespace std; ; //бинарный алгоритм вычисления НОД ; int NOD(int A, int B) .code NOD: push ebx push esi push edi mov ebx,dword ptr 10H[esp] mov ecx,dword ptr 14H[esp] ; { ; int k=1; mov esi,1 ; while ((A!=0) \ mov edi,esi L$1: test ebx,ebx je L$8 test ecx,ecx je L$8 L$2: mov eax,ebx mov edx,ebx sar eax,1fH xor edx,eax sub edx,eax and edx,1 xor edx,eax sub edx,eax je L$4 L$3: mov eax,ebx mov edx,ebx sar eax,1fH xor edx,eax sub edx,eax and edx,edi xor edx,eax sub edx,eax jne L$5 ; && (B!=0)) ; { ; while ((A%2==0) \ ; && (B%2==0)) ; { ; A/=2; ; B/=2; ; k*=2; ; } ; while (A%2==0) mov edx,ebx ; A/=2; mov eax,ebx sar edx,1fH sub eax,edx sar eax,1 mov ebx,eax jmp L$3 L$4: mov eax,ecx mov edx,ecx sar eax,1fH xor edx,eax sub edx,eax and edx,1 xor edx,eax sub edx,eax jne L$3 mov edx,ebx mov eax,ebx sar edx,1fH sub eax,edx sar eax,1 mov ebx,eax mov edx,ecx mov eax,ecx sar edx,1fH sub eax,edx sar eax,1 add esi,esi mov ecx,eax jmp L$2 L$5: mov eax,ecx mov edx,ecx sar eax,1fH xor edx,eax sub edx,eax and edx,edi xor edx,eax sub edx,eax jne L$6 ; while (B%2==0) mov edx,ecx ; B/=2; mov eax,ecx sar edx,1fH sub eax,edx sar eax,1 mov ecx,eax jmp L$5 ; if (A>=B) L$6: cmp ebx,ecx jl L$7 ; A-=B; sub ebx,ecx ; else B-=A; jmp near ptr L$1 L$7: sub ecx,ebx jmp near ptr L$1 ; } ; return B*k; L$8: mov eax,ecx imul eax,esi ; } pop edi pop esi pop ebx ret ; //главная функция ; int A, B; ; void main() main: push ebx ; { ; setlocale(LC_ALL,"Rus"); invoke crt_setlocale, LC_ALL, ADDR L$9 ; puts("A:"); invoke crt_puts, ADDR L$10 ; scanf("%d",&A); invoke crt_scanf, ADDR L$11, ADDR A ; puts("B:"); invoke crt_puts, ADDR L$12 ; scanf("%d",&B); invoke crt_scanf, ADDR L$11, ADDR B ; printf("НОД( %d, %d)= %d", A,B,NOD(A, B)); push [B] push [A] call NOD add esp,8 invoke crt_printf, [A], [B], eax ; getch(); invoke crt__getch ; } invoke crt_exit, 0 end main
Объяснение кода листинга программы
- Задача программы - вычислить НОД (наибольший общий делитель) двух чисел A и B.
- Переменные:
- A - первое число для вычисления НОД
- B - второе число для вычисления НОД
- k - переменная, используемая в алгоритме бинарного поиска НОД
- Алгоритм вычисления НОД:
- Если A или B равны нулю, то НОД равен другому числу.
- Используется бинарный алгоритм, который делит оба числа на общее кратное (НОК) двух чисел и продолжает делить до тех пор, пока одно из чисел не станет равным нулю.
- НОД вычисляется путем повторения этой операции до тех пор, пока другой параметр не станет равным нулю.
- Код программы написан на языке Assembler и использует библиотеки msvcrt.lib и masm32.lib.
- В функции main() выполняются следующие действия:
- Установка локали на русский язык
- Ввод чисел A и B с помощью функции scanf()
- Вывод результата вычисления НОД с помощью функции printf()
- Завершение программы с помощью функции getch()
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д