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

Заменить числа произведением их старшего и младшего слова _asm

11.12.2018, 20:01. Показов 2016. Ответов 13
Метки нет (Все метки)

В памяти заданный массив из 10-ти элементов. Заменить эти числа произведением их старшего и младшего слова используя ассемблерную вставку
Вот то что я написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void main () { 
     setlocale(LC_ALL,".1251");
    long x[10]={7, 23, 56, 33, 84, 15, 11, 74, 47,69}; 
    int n = 10;
    _asm { 
 
    mov  EDX, 8                 ; лічильник зовнішнього циклу - на 1 менше 
                                ; кількості елементів масиву 
m3: lea  EBX, x                 ; початкова адреса масиву 
    mov  ECX, EDX               ; лічильник внутрішнього циклу 
m2: mov  EAX, dword ptr[EBX]    ; елемент масиву – в ЕАХ 
    add  EBX, 4 
    cmp  EAX, dword ptr[EBX]    ; порівняння сусідніх елементів
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2018, 20:01
Ответы с готовыми решениями:

Зеркально поменять местами разряды внутри старшего и младшего байтов каждого числа. (раздельная компиляция asm и C)
Сюда посылаю 16-битовое число. Как зеркально поменять местами разряды внутри старшего и младшего...

Логическое сложение младшего и старшего байта слова
Вот собственно условие задачки: Реализуйте с помощью логических операцию, при которой младший байт...

Поменять местами цифры старшего и младшего разрядов данного натурального числа (например из числа 3879 получится 9873)
Поменять местами цифры старшего и младшего разрядов данного натурального числа (например из числа...

Составить программу для сравнения цифр старшего и младшего разрядов числа
Дано натуральное число N. Составить программу для сравнения цифр старшего и младшего разрядов этого...

13
Модератор
Эксперт CЭксперт С++
5105 / 4535 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
11.12.2018, 20:33 2
Ywep6, остальное добавите самостоятельно
Увеличил несколько числа, иначе умножение на старшее слово = 0, дало бы везде 0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main ()
{
    long x[10] = { 100007, 200023, 300056, 400033, 500084, 600015, 700011, 800074, 900047, 1000069 };
    int n = 10;
    _asm 
    {
        mov     ECX, n //длина массива
        lea     EBX, x; //адрес массива
    m1: movzx   EAX, word ptr[EBX] //грузим в EAX младший WORD DWORD-а по адресу [EBX], старший WORD в EAX = 0
        movzx   EDI, word ptr[EBX + 2] //грузим в EDI старший WORD DWORD-а по адресу [EBX], старший WORD в EDI = 0
        mul     EDI //EDX:EAX = EAX*EDI
        mov     [EBX], EAX //пишем DWORD на том же месте
        add     EBX, 4 //адрес следующего DWORD-а
        loop    m1 //по всем элементам массива
    };
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
11.12.2018, 21:35  [ТС] 3
Выводит ошибку в 11 строке может я что то не дописал посмотрите пожалуйста
Миниатюры
Заменить числа произведением их старшего и младшего слова _asm  
0
Модератор
Эксперт CЭксперт С++
5105 / 4535 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
11.12.2018, 21:43 4
Ywep6, хм, может не нравится точка с запятой в предыдущей строке...
У меня все отработало, странно...
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
11.12.2018, 21:46  [ТС] 5
не помогло...
0
Модератор
Эксперт CЭксперт С++
5105 / 4535 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
11.12.2018, 21:47 6
Ywep6, скопируй сюда текст, посмотрю у себя
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
11.12.2018, 21:48  [ТС] 7
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
#include <iostream>
using namespace std;
int main()
{
    long x[10] = { 100007, 200023, 300056, 400033, 500084, 600015, 700011, 800074, 900047, 1000069 };
    int n = 10;
    _asm
    {
        mov     ECX, 10 //длина массива
        lea     EBX, x //адрес массива
    m1: movzx   EAX, word ptr[EBX] //грузим в EAX младший WORD DWORD-а по адресу [EBX], старший WORD в EAX = 0
        movzx   EDI, word ptr[EBX + 2] //грузим в EDI старший WORD DWORD-а по адресу [EBX], старший WORD в EDI = 0
        mul     EDI //EDX:EAX = EAX*EDI
        mov[EBX], EAX //пишем DWORD на том же месте
        add     EBX, 4 //адрес следующего DWORD-а
        loop    m1 //по всем элементам массива
        dec  EDX; //зменшення лічильника зовнішнього циклу
        jnz  m1; //закінчення зовнішнього циклу
    }
    cout << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
        cout << x[i] << " ";
    cout << endl;
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
5105 / 4535 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
11.12.2018, 22:06 8
Исключение 3 - это останов по int3
Как вариант - перегрузи студию, может куда-то залетела
Завтра продолжим, если что...
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
11.12.2018, 22:11  [ТС] 9
код который я скинул работает? просто у меня студия кривая?
0
Модератор
Эксперт CЭксперт С++
5105 / 4535 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
12.12.2018, 12:53 10
Лучший ответ Сообщение было отмечено Ywep6 как решение

Решение

Ywep6, попробуйте еще раз:
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
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
    long x[10] = { 100007, 200023, 300056, 400033, 500084, 600015, 700011, 800074, 900047, 1000069 };
    int n = 10;
    __asm
    {
        mov     ECX, 10 //длина массива
        lea     EBX, x //адрес массива
    m1: movzx   EAX, word ptr[EBX] //грузим в EAX младший WORD DWORD-а по адресу [EBX], старший WORD в EAX = 0
        movzx   EDI, word ptr[EBX + 2] //грузим в EDI старший WORD DWORD-а по адресу [EBX], старший WORD в EDI = 0
        mul     EDI //EDX:EAX = EAX*EDI
        mov     [EBX], EAX //пишем DWORD на том же месте
        add     EBX, 4 //адрес следующего DWORD-а
        loop    m1 //по всем элементам массива
    }
 
    cout << "Обработанный массив: ";
    for (int i = 0; i < n; i++)
        cout << x[i] << " ";
    cout << endl;
 
    return 0;
}
У меня все работает...
1
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
12.12.2018, 18:41  [ТС] 11
теперь куча ошибок наверное что то со студеей , можете кинуть скрины теста мне для отчета нужно а то времени что то переустанавливать по просту нету
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
12.12.2018, 19:01  [ТС] 12
отмена все работает только...
Миниатюры
Заменить числа произведением их старшего и младшего слова _asm  
0
Модератор
Эксперт CЭксперт С++
5105 / 4535 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
12.12.2018, 19:09 13
Ywep6, ну, или сделать по-английски, или установить русскую консоль
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 123
12.12.2018, 19:41  [ТС] 14
Все работает спасибо огромное!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2018, 19:41
Помогаю со студенческими работами здесь

Напишите программу, считающую сумму старшего и младшего разряда заданного с клавиатуры целого числа.
Напишите программу, считающую сумму старшего и младшего разряда заданного с клавиатуры целого числа.

Вывести целые числа от 2 до n, для которых значение младшего байта меньше значения старшего в двоичном представлении
Подскажите пожалуйста, как реализовать такую программу на С или на С++, которая находит все целые...

Найти все целые числа в диапазоне от 2 до n, у которых значение младшего байта меньше чем значение старшего и вывести
Если можно, напишите с // в трудных местах. Учусь на первом курсе, лекции немного отстают от...

Определение младшего и старшего байта
Всем привет, подскажите пожалуйста, как определить младший и старший байт от 10-го числа типа 20250...


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

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

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