Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
ignisdivine
4 / 4 / 0
Регистрация: 27.03.2011
Сообщений: 38
#1

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

21.05.2012, 01:42. Просмотров 2245. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 01:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос inline assembler VS чтение по указателю (C++):

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

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

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? - C++
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая функция, чтоб она подошла под inline ? Как...

inline функции vs инструкции inline функций - C++
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные, то их лучше делать inline функциями, т....

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
21.05.2012, 09:30 #2
Я intel'овскую систему команд не знаю, но подозреваю, что операция mov делает пересылку одного слова (4 байт), а тебе при чтении из указателя нужно пересылать только 1 байт. Поэтому второй "mov" надо заменить на однобайтный. Наверное он "movb" называется

Ну и так, на всякий случай. У mov'а источник и приёмник точно в таком порядке пишутся?
0
skaa
Хочу в Исландию
1029 / 828 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
21.05.2012, 19:10 #3
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
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
21.05.2012, 19:13 #4
skaa, так у тебя же фактически лишняя пересылка присутсвует. Без неё разве никак?
0
skaa
Хочу в Исландию
1029 / 828 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
21.05.2012, 19:44 #5
Процессоры семейства х86 позволяют использовать в командах только один косвенный аргумент. Т.е. из памяти в память MOV нельзя.
1
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
21.05.2012, 20:37 #6
А "result" во вставке трактуется как память?
0
skaa
Хочу в Исландию
1029 / 828 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
21.05.2012, 20:52 #7
Конечно! Он и НЕ во вставке трактуется как память.
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
21.05.2012, 21:30 #8
Цитата Сообщение от skaa Посмотреть сообщение
Конечно! Он и НЕ во вставке трактуется как память.
Просто привык работать с gnu'шными вставками, где в основном работают именно с регистрами, а не памятью. Ну а как переменная трактуется вне вставки - это исключительно внутреннее дело компилятора. В режиме с оптимизациями большинство переменных попадут на регистр
0
skaa
Хочу в Исландию
1029 / 828 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
21.05.2012, 22:02 #9
Я дизассемблировал функцию 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
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.05.2012, 19:51 #10
Гарантии тут: x86 calling conventions
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
22.05.2012, 20:33 #11
Цитата Сообщение от Nick Alte Посмотреть сообщение
Гарантии тут: x86 calling conventions
Тут гарантии только в том, что результат передаётся на регистре %eax. Но никто тебе не даст никаких гарантий, что компилятор сохранит значение от ассемблерной вставки до точки возврата
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.05.2012, 20:50 #12
Цитата Сообщение от Evg Посмотреть сообщение
Но никто тебе не даст никаких гарантий, что компилятор сохранит значение от ассемблерной вставки до точки возврата
Теперь ясно, что имелось в виду. Что ж, таковы издержки работы со встроенным ассемблером. Недаром рекомендуется выносить ассемблерные функции в полноценный asm. Впрочем, компилятор тоже не инопланетяне делают и можно ожидать от него в этом плане некоторой логичности: если он видит, что в eax пишут, а return-а нету, почему бы и не догадаться, что имел в виду автор произведения.
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
22.05.2012, 21:09 #13
Цитата Сообщение от Nick Alte Посмотреть сообщение
Что ж, таковы издержки работы со встроенным ассемблером
Если писать так, как написано в 3-м посту, то всё будет однозначно и надёжно

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

И еще вопрос, возможно ли, что запись или чтение в RAM выполнятся некорректно, т.е. запишется/считается не то, что на самом деле существует в памяти или не то, что должно писаться в память?
0
skaa
Хочу в Исландию
1029 / 828 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
24.05.2012, 21:39 #15
Непонятно... Напиши на C что ты хочешь сделать, а мы переведём на ассемблер.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2012, 21:39
Привет! Вот еще темы с ответами:

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

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

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

Определение тактовой частоты. Еrror C2400: inline assembler syntax error in 'opcode' - Assembler
в VS в _asm пишу определение тактовой чистоты,ругается: error C2400: inline assembler syntax error in 'opcode'; found 'constant' в C++...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.05.2012, 21:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru