Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Доступ к полям структуры из asm-блока

15K
07 февраля 2006 года
arcadeboy
6 / / 07.02.2006
Вот такой код:
Код:
typedef struct {
    int x, y;
} point_t;

#include <stdio.h>

int main()
{
    point_t p = {23, 2};

    __asm {
        xor ax, ax
        mov p.x, ax
        mov p.y, ax
    }

    printf("%d %d", p.x, p.y);

    return 0;
}


И он не работает.. :( Помогите, пожалуйста.
929
07 февраля 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by arcadeboy
Вот такой код:
Код:
typedef struct {
    int x, y;
} point_t;

#include <stdio.h>

int main()
{
    point_t p = {23, 2};

    __asm {
        xor ax, ax
        mov p.x, ax
        mov p.y, ax
    }

    printf("%d %d", p.x, p.y);

    return 0;
}


И он не работает.. :( Помогите, пожалуйста.


 
Код:
...
mov [word ptr p],ax
mov [word ptr p]+4,ax
...
15K
07 февраля 2006 года
arcadeboy
6 / / 07.02.2006
Цитата:
Originally posted by sp999
 
Код:
...
mov [word ptr p],ax
mov [word ptr p]+4,ax
...



Четко! Спасибо. :)

3
07 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sp999
 
Код:
...
mov [word ptr p],ax
mov [word ptr p]+4,ax
...


IMHO так делать не следует

Проблема у автора топика в несоответствии размерности.
Попробуй так:
__asm {
xor eax, eax
mov p.x, eax
mov p.y, eax
}

15K
07 февраля 2006 года
arcadeboy
6 / / 07.02.2006
Цитата:
Originally posted by Green
IMHO так делать не следует

Проблема у автора топика в несоответствии размерности.
Попробуй так:
__asm {
xor eax, eax
mov p.x, eax
mov p.y, eax
}



Не, я компилировал под DOS, т. е. тип int там имеет размер в 2 байта (если делать по-твоему, он выдает ошибку, что мол не знаю, что такое eax). Просто не работает такой вариант (mov имя_переменной.имя_поля, ax (или eax)), не могу понять почему...

А когда делаешь так:

 
Код:
__asm {
        xor ax, ax
        mov [word ptr p], ax
        mov [word ptr p] + 2, ax
    }


Все работает.. Или это проблема компилятора?
3
07 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by arcadeboy
Не, я компилировал под DOS, т. е. тип int там имеет размер в 2 байта (если делать по-твоему, он выдает ошибку, что мол не знаю, что такое eax). Просто не работает такой вариант (mov имя_переменной.имя_поля, ax (или eax)), не могу понять почему...

А когда делаешь так:

 
Код:
__asm {
        xor ax, ax
        mov [word ptr p], ax
        mov [word ptr p] + 2, ax
    }


Все работает.. Или это проблема компилятора?


Понимаешь, не факт, что смещение будет равно двум.
Поэтому я советую найти путь точного указания поля.
Попробуй так
mov [word ptr p.x], ax

или заведи указатели на поля до асмовской вставки:

int px = &p.x;
...
mov px, ax

15K
07 февраля 2006 года
arcadeboy
6 / / 07.02.2006
Цитата:
Originally posted by Green
Понимаешь, не факт, что смещение будет равно двум.
Поэтому я советую найти путь точного указания поля.
Попробуй так
mov [word ptr p.x], ax

или заведи указатели на поля до асмовской вставки:

int px = &p.x;
...
mov px, ax



Признаться, меня это тоже немного смущало.. Хотя вряд-ли я буду переносить этот код еще куда-то. :)

Кстать,

 
Код:
mov [word ptr p.x], ax
, тоже работает! Пожалуй на этом пока и остановлюсь.

Всем большое спасибо. :)
15K
10 февраля 2006 года
arcadeboy
6 / / 07.02.2006
OK, и совсем простой вопрос :). Есть указатель, как в asm-блоке изменить значение переменной, на которую он указывает?

 
Код:
...
int i;
int* pi = &i;

__asm {
??? ; здесь мне надо установить значение i
}
...


Обещаю, это последний вопрос :)..
15K
12 февраля 2006 года
arcadeboy
6 / / 07.02.2006
Цитата:
Originally posted by arcadeboy
Есть указатель, как в asm-блоке изменить значение переменной, на которую он указывает?

 
Код:
...
int i;
int* pi = &i;

__asm {
??? ; здесь мне надо установить значение i
}
...



Ответ:

 
Код:
__asm {
    mov si, pi
    xor ax, ax
    mov [si], ax
}


Разобрался :)! Уже и не пойму, что раньше не так делал...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог