Перевести программу (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

Объяснение кода листинга программы

  1. Задача программы - вычислить НОД (наибольший общий делитель) двух чисел A и B.
  2. Переменные:
    • A - первое число для вычисления НОД
    • B - второе число для вычисления НОД
    • k - переменная, используемая в алгоритме бинарного поиска НОД
  3. Алгоритм вычисления НОД:
    • Если A или B равны нулю, то НОД равен другому числу.
    • Используется бинарный алгоритм, который делит оба числа на общее кратное (НОК) двух чисел и продолжает делить до тех пор, пока одно из чисел не станет равным нулю.
    • НОД вычисляется путем повторения этой операции до тех пор, пока другой параметр не станет равным нулю.
  4. Код программы написан на языке Assembler и использует библиотеки msvcrt.lib и masm32.lib.
  5. В функции main() выполняются следующие действия:
    • Установка локали на русский язык
    • Ввод чисел A и B с помощью функции scanf()
    • Вывод результата вычисления НОД с помощью функции printf()
    • Завершение программы с помощью функции getch()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы