Доступ к полям структуры из asm-блока
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;
}
И он не работает.. :( Помогите, пожалуйста.
Вот такой код:
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
...
mov [word ptr p],ax
mov [word ptr p]+4,ax
...
Четко! Спасибо. :)
mov [word ptr p],ax
mov [word ptr p]+4,ax
...
IMHO так делать не следует
Проблема у автора топика в несоответствии размерности.
Попробуй так:
__asm {
xor eax, eax
mov p.x, eax
mov p.y, eax
}
IMHO так делать не следует
Проблема у автора топика в несоответствии размерности.
Попробуй так:
__asm {
xor eax, eax
mov p.x, eax
mov p.y, eax
}
Не, я компилировал под DOS, т. е. тип int там имеет размер в 2 байта (если делать по-твоему, он выдает ошибку, что мол не знаю, что такое eax). Просто не работает такой вариант (mov имя_переменной.имя_поля, ax (или eax)), не могу понять почему...
А когда делаешь так:
xor ax, ax
mov [word ptr p], ax
mov [word ptr p] + 2, ax
}
Все работает.. Или это проблема компилятора?
Не, я компилировал под DOS, т. е. тип int там имеет размер в 2 байта (если делать по-твоему, он выдает ошибку, что мол не знаю, что такое eax). Просто не работает такой вариант (mov имя_переменной.имя_поля, ax (или eax)), не могу понять почему...
А когда делаешь так:
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
Понимаешь, не факт, что смещение будет равно двум.
Поэтому я советую найти путь точного указания поля.
Попробуй так
mov [word ptr p.x], ax
или заведи указатели на поля до асмовской вставки:
int px = &p.x;
...
mov px, ax
Признаться, меня это тоже немного смущало.. Хотя вряд-ли я буду переносить этот код еще куда-то. :)
Кстать,
Всем большое спасибо. :)
int i;
int* pi = &i;
__asm {
??? ; здесь мне надо установить значение i
}
...
Обещаю, это последний вопрос :)..
Есть указатель, как в asm-блоке изменить значение переменной, на которую он указывает?
int i;
int* pi = &i;
__asm {
??? ; здесь мне надо установить значение i
}
...
Ответ:
mov si, pi
xor ax, ax
mov [si], ax
}
Разобрался :)! Уже и не пойму, что раньше не так делал...