Последние записи
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
24th
Мар
Поиск минимального и максимального значений (C++ и Ассемблер)
Posted by obzor under assembler, c/c++
Помогите найти минимальное и максимальное значения.
На вход идет массив цифр из 5 элементов , нужно найти min и max в Ассемблере и вывести в C++.
Вот вроде забацал (используя пример с интернета):
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int max, min; //ИЗМЕНЕНО: вместо max2, переменная min; вместо multiplication, переменная summa
int a[5] = { 1, 7, 0, 2, 3};
_asm
{
; max element one
cld //ДОБАВЛЕНО: для установки направления поиска от меньшего адреса к большему
//в твоем примере из-за отсутствия этой строки могли быть ошибки при исполнении
//---эта часть - поиск максимума---
lea esi, a //записываешь адрес массива в регистра ESI
mov ebx, dword ptr[esi] //читаешь значение по адресу указываемому регистром ESI, в регистр EBX
mov ecx, 5 //записываешь значение 10 (количество элементов массива) в регистр ECX
M1:
lodsd //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
cmp eax, ebx //сравниваешь содержимое двух регистров
jle M2 //условный переход: переходить если первый регистр (EAX) <= второму регистру (EBX)
mov ebx, eax //сохраняешь большее значение из регистра EAX в регистре EBX
M2 :
loop M1 //цикл: уменьшение ECX на 1, переход на метку M1 если ECX не равен нулю
mov max, ebx //сохраняем найденный максимум в переменной max
//---эта часть - поиск максимума---
//---эта часть - поиск минимума---
lea esi, a //записываешь адрес массива в регистра ESI
mov ebx, dword ptr[esi] //читаешь значение по адресу указываемому регистром ESI, в регистр EBX
mov ecx, 5 //записываешь значение 10 (количество элементов массива) в регистр ECX
M3:
lodsd //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
cmp eax, ebx //сравниваешь содержимое двух регистров
jge M4 //ИЗМЕНЕНО: условный переход: переходить если первый регистр (EAX) >= второму регистру (EBX)
// cmp eax, max //УДАЛИТЬ
// je M4 //УДАЛИТЬ
mov ebx, eax //сохраняешь меньшее значение из регистра EAX в регистре EBX
M4 :
loop M3 //цикл: уменьшение ECX на 1, переход на метку M3 если ECX не равен нулю
mov min, ebx //ИЗМЕНИТЬ: сохраняем минимум в переменной min
//---эта часть - поиск минимума---
}
cout << "Max: " << max << " Min : " << min << endl;
cin >> max; // чтобы консоль не закрывалась
return 0;
}
Элементы массива размером DWORD (32-бит):
_asm {
mov ecx,5 ; ЕСХ = всего элементов
lea esi,mas ; ESI = адрес массива
mov ebx,[esi] ; EBX = первый элемент
find: lodsd ; ЕАХ = очередной элемент массива
cmp eax,ebx ; сравниваем..
jae miss ; переход, если больше
xchg ebx,eax ; иначе: обменять местами
miss: Loop find ; промотать ЕСХ-раз..
mov [min],ebx ; запомнить мин. в переменной
}
Примажусь к славе. Только будет lea esi,a
#include "stdafx.h"
#include <iostream>
int main()
{
int max, min;
int a[5] = { 11, 7, 5, 2, 3 };
_asm
{
mov ecx, 5 // ЕСХ = всего элементов
lea esi, a // ESI = адрес массива
mov ebx, [esi]// EBX = первый элемент
find : lodsd // ЕАХ = очередной элемент массива
cmp eax, ebx // сравниваем..
jae miss // переход, если больше
xchg ebx, eax //иначе: обменять местами
miss : Loop find // промотать ЕСХ - раз..
mov [min], ebx // запомнить мин.в переменной
}
std::cout << "Min. element = " << min << std::endl;
system("pause");
}
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)