Обращение к полю структуры по указателю - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Есть функция:
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;
 
}
В функции есть параметр image_header типа BMPHeader*. BMPHeader это структура, содержащая поля width и height. Мне необходимо получить доступ к этим двум полям. Пока ничего кроме ручного подсчёт смещения я придумать не смог (в моём случае это 18 и 22). Если ли способ обратиться к полю структуры по указателю с помощью имени поля? На этом сайте я нашёл пример следующего вида:
les     bx, CubePtr
mov     eax, es:[bx].Object8.Color
В моём случае это не работает:
les ebx, image_header
mov eax, es:[ebx].BMPHeader.width
mov w, eax
->error C2411: BMPHeader: недопустимый член структуры или объединения в "второй операнд" ->error C2410: width: неоднозначное имя члена в "второй операнд" Компилятор - Visual C, masm Как можно решить эту проблему? Спасибо!

Решение задачи: «Обращение к полю структуры по указателю»

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
    }   
}

Объяснение кода листинга программы

  1. Структура Point содержит поля x и y типа int, а также поле next типа Point*.
  2. Структура List содержит поля len типа int, head типа Point и tail типа Point.
  3. Функция getpt принимает указатель на структуру Point и использует ассемблерный блок для обращения к полям x и y по указателю pt.
  4. Ассемблерный блок начинается с инструкции mov esi,pt, которая копирует указатель pt в регистр esi.
  5. Инструкции mov eax,[esi]pt.x и mov ebx,[esi]pt.y используются для обращения к полям x и y по указателю pt.
  6. Значение поля x хранится в регистре eax, а значение поля y хранится в регистре ebx.
  7. Возвращаемое значение функции getpt — это указатель на структуру Point.
  8. Данный код работает только на процессорах, поддерживающих набор инструкций SSE (Streaming SIMD Extensions).
  9. Данный код может быть использован для обращения к полям структуры Point, которая является частью структуры List.
  10. Значения полей x и y можно получить с помощью функций getx и gety соответственно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы