Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 9

С помощью ассемблерной вставки сложить a+b, вывести результат, в переменную bool записать было ли переполнение

22.09.2016, 21:30. Показов 5775. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать ассемблерную вставку
Есть переменные
C++
1
2
unsigned char a,b;
bool c;
Как с помощью ассемблерной вставки сложить a+b, вывести результат сложения и в переменную bool записать было ли переполнение?

Что-то типа такого
a=255
b=255
a+b=254 (unsigned)
overflow (unsigned)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2016, 21:30
Ответы с готовыми решениями:

Из ассемблерной вставки в локальную переменную
Нужно из ассемблерной вставки передать содержимое стека st(0) из указанного места в локальную переменную процедуры из которой запущена...

Записать в переданную переменную результат с помощью указателя
суть задания, чтобы в переданную переменную записать результат через указатель y =|x - cos(x)| #include "stdafx.h" #include...

Сортировку массива с помощью ассемблерной вставки
Ассемблерная вставка в "Делфи". Необходимо написать сортировку массива на делфи и с помощью ассемблерной вставки отсортировать тот же...

15
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.09.2016, 21:35
Зависит от компилятора.
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 9
22.09.2016, 21:35  [ТС]
Работаю в visual studio
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.09.2016, 22:23
C++
1
2
3
4
5
6
7
8
9
10
    __asm {
        mov c, 0
        mov a, 255
        mov b, 255
        mov al, a
        add al, b
        jnc l_end
        mov c, 1
    l_end:
    }
1
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 9
22.09.2016, 22:37  [ТС]
nmcf,
а если нужно вводить a и b с консоли? пишет "конфликт размеров операндов"
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.09.2016, 22:40
Какие размеры? Всё покажи.
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 9
22.09.2016, 22:43  [ТС]
Задание звучит так:
Имеются переменные:
C++
1
unsigned char a,b;
Программа должна запросить значения переменных. Написать ассемблерную вставку, которая вычислит a+b и запишет в
переменную bool наличие переполнения.
Например ввели
a = 255 и b = 255
Вывело
a+b=254
overflow

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
 
int main()
{   
    unsigned char a, b;
    bool c;
    cin >> a >> b;
 
    __asm {
        ...
    }
    _getch();
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.09.2016, 22:54
Ну это к ассемблеру не относится. Ввести char как числа нельзя, вводи unsigned, а потом запишешь в unsigned char.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
23.09.2016, 05:58
Цитата Сообщение от nmcf Посмотреть сообщение
add al, b
Хм, а регистр флагов разве можно изменять в __asm вставке? Я всегда в pushfd/popfd оборачиваю.

Using and Preserving Registers in Inline Assembly

When using __asm to write assembly language in C/C++ functions, you don't need to preserve the EAX, EBX, ECX, EDX, ESI, or EDI registers. For example, in the POWER2.C example in Writing Functions with Inline Assembly, the power2 function doesn't preserve the value in the EAX register. However, using these registers will affect code quality because the register allocator cannot use them to store values across __asm blocks. In addition, by using EBX, ESI or EDI in inline assembly code, you force the compiler to save and restore those registers in the function prologue and epilogue.

You should preserve other registers you use (such as DS, SS, SP, BP, and flags registers) for the scope of the __asm block. You should preserve the ESP and EBP registers unless you have some reason to change them (to switch stacks, for example). Also see Optimizing Inline Assembly.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.09.2016, 06:51
jupman, а где там регистр флагов используется?
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
23.09.2016, 07:05
Kastaneda, инструкция add флаги модифицирует
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.09.2016, 07:27
jupman, если бы в ассемблерной вставке нельзя было бы изменять флаги OF и CF, то нельзя было бы пользоваться такими инструкциями как ADD, MUL и т.д.
И на кой черт тогда она вообще нужна? Грош цена такой вставке.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
23.09.2016, 07:31
castaway, почему нельзя? Просто нужно сохранять изначальное значение EFLAGS (pushfd/popfd).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.09.2016, 09:11
jupman, но там же, в примерах, они его не сохраняют почему-то. Может, это зависит от положения asm-блока.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
23.09.2016, 09:45
castaway, вообще да, я тут поэкспериментировал с компилятором msvc, код такой:

C
1
2
3
4
5
6
7
8
    if (a < b) {
 
        c = 0;
    }
    else {
 
        c = 1;
    }
Компилирует (с ключом /O2) в линейную конструкцию:

Assembler
1
2
3
4
004019AC   . 8B5424 08      MOV EDX,DWORD PTR SS:[ESP+8]
004019B0   . 33C0           XOR EAX,EAX
004019B2   . 3B5424 0C      CMP EDX,DWORD PTR SS:[ESP+C]
004019B6   . 0F9DC0         SETGE AL
Пробуем сделать подлянку:

C
1
2
3
4
5
6
7
8
9
10
11
12
    if (a < b) {
 
        c = 0;
    }
    else {
 
        __asm {
            clc
        }
 
        c = 1;
    }
Но компилятор это учитывает и возвращает ветвления:

Assembler
1
2
3
4
5
6
7
004019AC   . 8B5424 08      MOV EDX,DWORD PTR SS:[ESP+8]
004019B0   . 3B5424 0C      CMP EDX,DWORD PTR SS:[ESP+C]
004019B4   . 7D 04          JGE SHORT CppTest.004019BA
004019B6   . 33C0           XOR EAX,EAX
004019B8   . EB 06          JMP SHORT CppTest.004019C0
004019BA   > F8             CLC
004019BB   . B8 01000000    MOV EAX,1
PS: Но я считаю все равно, раз в MSDN предупреждают, лучше сохранять флаги.

Добавлено через 31 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Может, это зависит от положения asm-блока.
Да, может быть. А может просто ошибка в документации (которую я процетировал в #9).
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
23.09.2016, 21:20
Лучший ответ Сообщение было отмечено jackofinteresti как решение

Решение

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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(0, "");
    unsigned int a, b, c;
    int m;
    bool m1;
    cout << "Введите число а ="; cin >> a; cout << endl;
    cout << "Введите число b ="; cin >> b; cout << endl;
    m = 0;
 
        __asm {
                xor eax,eax
                xor ebx,ebx
                mov eax,a
                mov ebx,b
                add eax,ebx
                jo exit_1
                mov c, eax
                jmp exit1
            exit_1:
                xor ebx,ebx
                mov ebx,1
                mov m,ebx
            exit1:
                    }
        if (m != 1)
        {
            m1 = true;
            cout << "Сумма а + в =  " << c << endl;
        }
        else
        {
            m1 = false;
            cout << "Режим переполнения" << endl;
        }
        
    system("pause");
    return 0;
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2016, 21:20
Помогаю со студенческими работами здесь

Обменять значения элементов массивов с помощью ассемблерной вставки
Доброго времени суток. имеется задача необходимо: Обменять значения элементов массивов char x и *y; при выборке значения из массива *y...

Получение значения элемента массива с помощью ассемблерной вставки
У меня есть функция int kontr(char* str1, int len) { __asm{ lea esi, ; xor ebx, ebx; mov eax, ; //ну и дальше } ...

Вычисление кусочной функции с помощью ассемблерной вставки в код на Pascal
Итак суть задания. В соответствии с заданием, вычисления у1 и у2 запрограммируйте на языке Ассемблера, вычисление у - на языке Паскаль....

Нужно с помощью ассемблерной вставки изменить массив на обратный порядок
Нужно с помощью ассемблерной вставки изменить массив на обратный порядок Вот попытался, но не меняет местами. var m: array of...

Определить размер кеша инструкций первого уровня с помощью ассемблерной вставки
Не знал в каком разделе создать тему, но думаю этот вопрос будет понятен программистам С++. Встала такая задача: определить размер кеша...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru