0 / 0 / 0
Регистрация: 19.11.2019
Сообщений: 14
1

Вычислить выражение E=(A-B)*(C-A)/B в ассемблерной вставке

26.10.2020, 13:15. Показов 6734. Ответов 1

Вычислить целочисленное выражение, указанное в варианте задания. При этом, и
операнды и результаты вычислений следует выводить как в десятичном, так и в
шестнадцатеричном виде.

A (byte), B (byte), C (dword).
Вычислить: D = (A*B)*B; E = (A-B)*(C-A)/B.

D я смог без проблем решить, с E возникли некоторые проблемы, оно вроде и работает но нужно в dword

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <locale.h>
 
int main()
{
    setlocale(0, "");
    __int8 A = 4;
    __int8 B = 2;
    __int32 C = 3000;
    __int32 D; //Результат выражения D=(A*B)*B
    __int32 E; //Результат выражения E=(A-B)*(C-A)/B
 
    __asm
    {
        mov AL, A; //Заносим переменную А в регистр AL
            mul B; //Умножаем переменную B на регистр AX; результат идёт в пару регистров DX : AX
            mul B;
            cwd;
            mov word ptr D, AX; //Записываем содержимое регистров DX:AX в переменную D
        mov word ptr D + 2, DX;
    }
    printf("\n\tD в десятичной = %d", D);
    printf("\n\tD в шестнадцатиричной = %x", D);
    printf("\n\n");
 
    __asm
    {
        mov AL, A;
        cbw;
        cwd;
        mov CX, DX;
        mov BX, AX;
        mov AX, word ptr C;
        mov DX, word ptr C + 2;
        sub AX, BX; // c-a
        sbb DX, CX;// c-a
        mov BX, AX; // освободили ax
        mov CX, DX; // освободили dx
        mov AL, A;
        //cbw;
        //xchg BX, AX;
        //idiv BX;
        mov AH, B;
        sub AL, AH;
        cbw;
        mov DX, AX;
        mov AX, BX; // засписали c-a
        mov BX, DX;
        mov DX, CX; // записали c-a
        mul BX; // умножаем (c-a)*(a-b)
        mov BX, AX; // освобождаем
        mov CX, DX;// освобождаем
        mov AL, B;
        cbw;
        mov DX, AX; // записываем
        mov AX, BX; // записываем
        mov BX, DX;
        mov DX, CX; // записываем часть (c-a)*(a-b)
        div BX; // делим (c-a)*(a-b)/b
 
        mov word ptr E, AX; //записываем в E
        mov word ptr E + 2, DX;// записываем в E
    }           
    printf("\n\tE в дсятичной = %d", E);
    printf("\n\tE в шестнадцатиричной = %x", E);
    printf("\n\n");
    printf("%d", (A - B) * (C - A) / B);
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2020, 13:15
Ответы с готовыми решениями:

Непонятки в ассемблерной вставке
В общем, все работает, только х2 не принимает значения с минусом, просто игнорирует минус + не...

Операция разыменовывания в ассемблерной вставке
Всем доброго времени! Хочу разыменовать поместить в регистр значение, содержащееся в некоем...

Очищение памяти в ассемблерной вставке
/* Выделить из строки подстроку указанной длины, начиная с заданной позиции. */ ...

Сложение длинных чисел в ассемблерной вставке
У меня есть класс: class Big_int { UINT64* num; //массив разрядов числа size_t s, cap; ...

1
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
27.10.2020, 17:00 2
Лучший ответ Сообщение было отмечено h1p6x как решение

Решение

h1p6x, и зачем Вам 16-битные регистры? Сравните:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <locale.h>
 
int main()
{
    setlocale(0, "");
    __int8 A = 4;
    __int8 B = 2;
    __int32 C = 3000;
    __int32 D; //Результат выражения D=(A*B)*B
    __int32 E; //Результат выражения E=(A-B)*(C-A)/B
 
    __asm
    {
        movsx   eax, A;     //Заносим переменную А в регистр eax
        movsx   ebx, B;     //Заносим переменную B в регистр ebx
        imul    eax, ebx;   //Умножаем eax = eax * ebx
        imul    eax, ebx;   //Умножаем eax = eax * ebx = eax * ebx ^ 2
        mov     D, eax;     //Записываем содержимое  eax в переменную D
    }
    printf("\n\tD в десятичной = %d", D);
    printf("\n\tD в шестнадцатиричной = %x", D);
    printf("\n\n");
 
    __asm
    {
        movsx   eax, A;     //Заносим переменную А в регистр eax
        movsx   ebx, B;     //Заносим переменную B в регистр ebx
        mov     edx, C;     //Заносим переменную C в регистр edx
        sub     edx, eax    //edx = edx - eax = C - A
        sub     eax, ebx    //eax = eax - ebx = A - B
        imul    edx         //edx:eax = (A - B)*(C - A)
        idiv    ebx         //eax = (A - B)*(C - A) / B
        mov     E, eax      //E = (A - B)*(C - A) / B
    }
    printf("\n\tE в дсятичной = %d", E);
    printf("\n\tE в шестнадцатиричной = %x", E);
    printf("\n\n");
    printf("%d", (A - B) * (C - A) / B);
 
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2020, 17:00
Помогаю со студенческими работами здесь

Как правильно вставлять диррективу .386 в ассемблерной вставке
привет)подскажите пожалуйста как правильно вставлять диррективу .386 в ассемблерной вставке?вот я...

Jump в ассемблерной вставке
Использую хак во внешнее приложение. static const DWORD func_hack_Ret = 0x45C5D9; // адрес...

Метки в макросах в ассемблерной вставке
В C++ написан макрос с ассемблерной вставкой, который содержит в себе метку &quot;doit&quot; и команду...

Условный переход в ассемблерной вставке.
max: ...... cmp dl,al; jg max; error C2415: improper operand type не могу понять почему?

Вызов функции в ассемблерной вставке C++.
Нужно ввести строку, объясните как вызвать и как параметры передать. Пусть это будет cin.getline.

Вызов функции WinAPI в ассемблерной вставке
Доброго времени суток! Необходимо получить значение времени вызовом функции WinAPI в ассемблерной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru