Обращение к полю структуры по указателю - Assembler
Формулировка задачи:
Доброго времени суток. Есть функция:
В функции есть параметр image_header типа BMPHeader*. BMPHeader это структура, содержащая поля width и height. Мне необходимо получить доступ к этим двум полям. Пока ничего кроме ручного подсчёт смещения я придумать не смог (в моём случае это 18 и 22). Если ли способ обратиться к полю структуры по указателю с помощью имени поля?
На этом сайте я нашёл пример следующего вида:
В моём случае это не работает:
->error C2411: BMPHeader: недопустимый член структуры или объединения в "второй операнд"
->error C2410: width: неоднозначное имя члена в "второй операнд"
Компилятор - Visual C, masm
Как можно решить эту проблему?
Спасибо!
void bmp_mirror_asm(BMPHeader* image_header, ...) { BGRComponents tmp; uint i = 0; uint j = 0; uint w = 0; uint h = 0; __asm { mov ebx, image_header mov eax, [ebx+18] mov w, eax mov eax, [ebx+22] mov h, eax } return; }
les bx, CubePtr mov eax, es:[bx].Object8.Color
les ebx, image_header mov eax, es:[ebx].BMPHeader.width mov w, eax
Решение задачи: «Обращение к полю структуры по указателю»
textual
Листинг программы
struct Point { int x,y; Point* next; }; struct List { int len; Point* head; Point* tail; }; void getpt(Point* pt) { __asm { mov esi,pt mov eax,[esi]pt.x mov ebx,[esi]pt.y } }
Объяснение кода листинга программы
- Структура Point содержит поля x и y типа int, а также поле next типа Point*.
- Структура List содержит поля len типа int, head типа Point и tail типа Point.
- Функция getpt принимает указатель на структуру Point и использует ассемблерный блок для обращения к полям x и y по указателю pt.
- Ассемблерный блок начинается с инструкции mov esi,pt, которая копирует указатель pt в регистр esi.
- Инструкции mov eax,[esi]pt.x и mov ebx,[esi]pt.y используются для обращения к полям x и y по указателю pt.
- Значение поля x хранится в регистре eax, а значение поля y хранится в регистре ebx.
- Возвращаемое значение функции getpt — это указатель на структуру Point.
- Данный код работает только на процессорах, поддерживающих набор инструкций SSE (Streaming SIMD Extensions).
- Данный код может быть использован для обращения к полям структуры Point, которая является частью структуры List.
- Значения полей x и y можно получить с помощью функций getx и gety соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д