Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38

inline assembler VS чтение по указателю

21.05.2012, 01:42. Показов 3958. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Задача состоит в чтении 1 байта по адресу указателя. Проблема с пониманием, что не так с типами операндов.
C++
1
2
3
4
5
6
7
char readFromPointer(char* pointer)
{
    char result; 
    __asm mov edi, pointer
    __asm mov result, [edi]
    return result;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2012, 01:42
Ответы с готовыми решениями:

GCC Inline Assembly перевести в Visual Studio Inline Assembler
Здравствуйте. Есть код на GCC Inline Assembly и его нужно перевести в Visual Studio Inline Assembler. Не работал с GCC Inline Assembly...

inline assembler в СИ
Доброго! каким образом можно связать внешную переменную и встроенный ассмблер в Си? чтоб было примерно так: int abc = 666; ...

Inline assembler mingw
Добрый вечер ув. пользователи форума. Возникла проблема с ассемблером, и его реализацией в mingw. Имеется функция void call_hook ( void...

23
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.05.2012, 09:30
Я intel'овскую систему команд не знаю, но подозреваю, что операция mov делает пересылку одного слова (4 байт), а тебе при чтении из указателя нужно пересылать только 1 байт. Поэтому второй "mov" надо заменить на однобайтный. Наверное он "movb" называется

Ну и так, на всякий случай. У mov'а источник и приёмник точно в таком порядке пишутся?
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
21.05.2012, 19:10
C++
1
2
3
4
5
6
7
8
9
10
11
char    readFromPointer(char* pointer)
{
    char result; 
_asm
{
    mov edi,pointer
    mov al,[edi]
    mov result,al
}
    return result;
}
. Проверено в VS2008.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.05.2012, 19:13
skaa, так у тебя же фактически лишняя пересылка присутсвует. Без неё разве никак?
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
21.05.2012, 19:44
Процессоры семейства х86 позволяют использовать в командах только один косвенный аргумент. Т.е. из памяти в память MOV нельзя.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.05.2012, 20:37
А "result" во вставке трактуется как память?
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
21.05.2012, 20:52
Конечно! Он и НЕ во вставке трактуется как память.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.05.2012, 21:30
Цитата Сообщение от skaa Посмотреть сообщение
Конечно! Он и НЕ во вставке трактуется как память.
Просто привык работать с gnu'шными вставками, где в основном работают именно с регистрами, а не памятью. Ну а как переменная трактуется вне вставки - это исключительно внутреннее дело компилятора. В режиме с оптимизациями большинство переменных попадут на регистр
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
21.05.2012, 22:02
Я дизассемблировал функцию readFromPointer в VS 2008. Забавно, что в таком варианте
C++
1
2
3
4
5
6
7
8
char    readFromPointer(char* pointer)
{
_asm
{
    mov edi,pointer
    mov al,[edi]
}
}
она прекрасно работает потому что возвращает результат через регистр AL. Но надеяться на такое я бы не стал... где гарантия что компилятор в следующий раз то же самое сделает?
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.05.2012, 19:51
Гарантии тут: x86 calling conventions
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.05.2012, 20:33
Цитата Сообщение от Nick Alte Посмотреть сообщение
Гарантии тут: x86 calling conventions
Тут гарантии только в том, что результат передаётся на регистре %eax. Но никто тебе не даст никаких гарантий, что компилятор сохранит значение от ассемблерной вставки до точки возврата
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.05.2012, 20:50
Цитата Сообщение от Evg Посмотреть сообщение
Но никто тебе не даст никаких гарантий, что компилятор сохранит значение от ассемблерной вставки до точки возврата
Теперь ясно, что имелось в виду. Что ж, таковы издержки работы со встроенным ассемблером. Недаром рекомендуется выносить ассемблерные функции в полноценный asm. Впрочем, компилятор тоже не инопланетяне делают и можно ожидать от него в этом плане некоторой логичности: если он видит, что в eax пишут, а return-а нету, почему бы и не догадаться, что имел в виду автор произведения.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.05.2012, 21:09
Цитата Сообщение от Nick Alte Посмотреть сообщение
Что ж, таковы издержки работы со встроенным ассемблером
Если писать так, как написано в 3-м посту, то всё будет однозначно и надёжно

Цитата Сообщение от Nick Alte Посмотреть сообщение
если он видит, что в eax пишут, а return-а нету, почему бы и не догадаться, что имел в виду автор произведения
Компилятор руководствуется соображениями эффективного построения кода, а так же дополнительных возможностей, требуемых языком программирования или чем-то ещё. В конкретно данной функции в самом начале мог быть создан локальный объект типа класс, а потому компилятор в конце функции обязан построить вызов деструктора. Независимо от того, что имел в виду афтор кода
1
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 19:11  [ТС]
Всем спасибо за помощь, однако в процессе раздумий задача изменилась и теперь необходимо считать не побайтно, а блок определенной длины. Причем, чтобы длину блока можно было выставлять достаточно большой (1-10 МБ). С похожими командами в ассемблере не сталкивался. Кто что может подсказать?

И еще вопрос, возможно ли, что запись или чтение в RAM выполнятся некорректно, т.е. запишется/считается не то, что на самом деле существует в памяти или не то, что должно писаться в память?
0
Хочу в Исландию
 Аватар для skaa
1041 / 840 / 119
Регистрация: 10.11.2010
Сообщений: 1,630
24.05.2012, 21:39
Непонятно... Напиши на C что ты хочешь сделать, а мы переведём на ассемблер.
1
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 21:45  [ТС]
Нашел инструкции MOVSx - movsb, movsw, movsd.
Но почему-то программа падает не дойдя даже до половины элементов, проверял на значениях записываемых в ecx (при всех прочих равных условиях) 1000 еще работает, а 100000 уже нет, при всей выделяемой памяти в 1 МБ. В описании этих функций присутствует момент, что в счетчик CX нужно записывать значение элементов (байт, слов, двойных слов), но в данном случае кол-во элементов и байт совпадает ведь.

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
char* allocate(long dwSize)
{
     char* memPointer = (char*)VirtualAlloc(
                     (LPVOID) NULL,                               // Next page to commit
                     dwSize,                                         // Page size, in bytes
                     MEM_COMMIT | MEM_RESERVE,         // Allocate a committed page
                    PAGE_READWRITE);                          // Read/write access
     return memPointer;
}
 
int main()
{
  int size= 1048576;
  char* pointer = allocate(size);
  char* pointer2 = allocate(size);
  int block_size = size;
 
  __asm lea     si, pointer
  __asm lea     di, pointer2
  __asm mov    ecx, block_size
  __asm rep     movsb;
 
  return 0;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.05.2012, 22:00
В VirtualAlloc делает реальное выделение памяти? Я почитал описание, толком ни х не понял, но такое ощущение, что она просто резервирует адреса. Если выделать память через malloc, то что-нибудь изменится?
0
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 22:26  [ТС]
http://msdn.microsoft.com/en-u... 85%29.aspx

The malloc function has the disadvantage of being run-time dependent. The new operator has the disadvantage of being compiler dependent and language dependent.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.05.2012, 22:44
Ты можешь просто взять и подставить malloc (или calloc) вместо allocate и посмотреть, что получится?
0
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
24.05.2012, 23:13  [ТС]
Также не работает, падает на movsb.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2012, 23:13
Помогаю со студенческими работами здесь

Inline Assembler & C++
int main(int argc, char *argv) { perevod(); cout<<"Type Esc to Escape \n"; __asm { mov ah,01h ...

Как исправить код? / Inline assembler
#include <stdio.h> int main(int argc, char** argv ) { int aa; int bb; aa = 42; bb = 10;

Компиляция Inline assembler (вставки ассемблера)
Доброго времени суток! Уважаемые кодеры! Помогите с компиляцией С++ со вставками ассемблера. g++ или gcc выдает ошибку: ...

Обращение к переменным объекта с использованием указателя this из inline assembler
Мне нужно написать класс на С++ с учетом возможности ввода количества столбцов и строк матрицы. Матрица должна размещаться в динамической...

Работа со строками. Удалить из строки символы в скобках inline assembler.
Удалить из строки символы в скобках inline assembler. Подскажите в какую сторону копать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru