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

Получение значения элемента массива с помощью ассемблерной вставки

18.05.2016, 15:52. Показов 1608. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть функция
C
1
2
3
4
5
6
7
8
9
int kontr(char* str1, int len)
{
    __asm{
        lea esi, [str1];
        xor ebx, ebx;
        mov eax, [esi + ebx];
        //ну и дальше
    }
}
Проблема в том, что в eax заносится не значение str1[0], а адрес. Как исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2016, 15:52
Ответы с готовыми решениями:

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

С помощью ассемблерной вставки найти отрицательные элементы в массиве, и среднее положительных элементов
Создать массив X. Определить среднее арифметическое положительных чисел, из отрицательных создать массив Y. При этом максимальное и...

С помощью ассемблерной вставки сложить a+b, вывести результат, в переменную bool записать было ли переполнение
Нужно написать ассемблерную вставку Есть переменные unsigned char a,b; bool c; Как с помощью ассемблерной вставки сложить a+b,...

18
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
18.05.2016, 16:03
Roman12345, попробуйте так

Assembler
1
lea esi, str1;
Добавлено через 55 секунд
Roman12345, не уверен, но кажется вы пишете туда адрес самого указателя, а не строки
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 16:11  [ТС]
obivan, Не помогает. Я как не пробовал туда все равно адрес заносится.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
18.05.2016, 16:18
Цитата Сообщение от Roman12345 Посмотреть сообщение
lea esi, [str1];
А по-моему это вообще не нужно, раз у тебя в параметре указатель.
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 16:22  [ТС]
Hikari, Так то да, только в результате у меня получается тоже самое.
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
18.05.2016, 16:26
Цитата Сообщение от Roman12345 Посмотреть сообщение
Assembler
1
mov eax, [esi + ebx];
Это ты поместил { a[0],a[1],a[2],a[3] } в eax
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.05.2016, 16:28
Roman12345, str1 - адрес, вот и надо его записать в esi
Assembler
1
mov esi, [str1]
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 16:28  [ТС]
AlexVRud, Можешь объяснить подробнее и как правильно тогда сделать?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.05.2016, 16:30
И исправь
Assembler
1
mov al, [esi + ebx]
если str1 это char*
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
18.05.2016, 16:31
eax имеет размер в четыре байта. Соответственно ты копируешь 4-ре байта по адресу esi + ebx.
Если нужен байт, то обнули eax и помести данные в al
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.05.2016, 16:32
Roman12345, str1 - указатель на символы, вот и надо читать символы
Можно еще так:
Assembler
1
movzx eax, byte ptr[esi + ebx]
с обнулением старших разрядов eax
1
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 16:54  [ТС]
Спасибо вроде помогло, только у меня теперь новая проблема.
C
1
2
3
4
5
6
7
8
9
int kontr(char* str1, int len) 
{
    __asm{
        mov esi, [str1];
        xor ebx, ebx
        xor eax, eax;
        mov al, [esi+ebx];
    }
};
Теперь что бы не вводил всегда заносится ноль(((
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
18.05.2016, 16:58
Цитата Сообщение от Roman12345 Посмотреть сообщение
Assembler
1
mov esi, [str1];
С квадратными скобками - это скопировать данные по адресу
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.05.2016, 17:01
Roman12345, как вызывается функция?

Добавлено через 1 минуту
AlexVRud, все правильно
Берем адрес строки из стека
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 17:01  [ТС]
_liv_,
C
1
2
scanf("%s", buf);
geg=kontr(buf, strlen(buf));
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.05.2016, 17:12
Roman12345, как положено, получаем первый символ из введенной строки...

Добавлено через 58 секунд
Что такое geg?
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 17:18  [ТС]
_liv_, geg это int в котором будет 0 или 1 в зависимости от результата. Строки вводятся типа "1dr3", "1234", "567f" и т.д.
Только почему вот в al ноль?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
18.05.2016, 18:15
Все должно работать!
Киньте мне exe
Гляну под отладчиком

Добавлено через 51 минуту
Понял свои ошибки?
1
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 34
18.05.2016, 18:24  [ТС]
Проблема решена, тему можно закрывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2016, 18:24
Помогаю со студенческими работами здесь

Ошибка компиляции ассемблерной вставки
Добрый вечер. Захотелось мне сделать ассемблерную вставку в C++ код. Сделал. Но компилятору MinGW чето не нравится. Выдает следующие ошибки...

Выполнить с использованием ассемблерной вставки
Нужно подсчитать кол-во цифр в троке из 10 символов. Реализовать в виде ассемблерной вставки. Подскажите пожалуйста как сделать!

В программе написать функции: вставки элемента, поиска максимального элемента, определения среднего арифметического элементов массива
В целочисленном массиве Х(N) после каждого четного числа вставить максимальный элемент массива. Найти среднее арифметическое элементов ...

Как вывести числа в цикле ассемблерной вставки?
Доброго времени, суток! Мне нужно вывести каждый результат получившийся в цикле, как это можно сделать? _asm { metka: .... ftp...

С помощью алгоритма вставки, нужно сортировать парные числа массива в порядке возрастания
Приветствую! Нужно написать программу которая из текстового файла будет считывать в массив числа (например, 2 6 4 13 15 29). После...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
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 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru