Как обращаться к членам структуры в ассемблерной вставке на си? - Assembler

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

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

функция делает распаковку битовых групп. По заданию поля битовой группы передаются в структуре. Как к ним можно обращаться в ассемблерной вставке?
struct SomeBitGroup{
unsigned char scale, r_m, mod, kop;
unsigned short cond, cond_a;
}sbg;
 
void ToUnpack(long pack, struct SomeBitGroup *sbg);//прототип, как видите
 
//сама функция с идиотской реализацией
 
void ToUnpack(long pack, struct SomeBitGroup *sbg)
{
 
__asm{
mov eax, pack
// выделить 5 младших битов (4-0) из Value
mov [scale], al
and [scale], 0x1f
shr eax, 5
// выделить 3 битов (7-5) из Value
mov [r_m], al
and [r_m], 0x7
shr eax, 3
// выделить 6 битов (13-8) из Value
mov [mod], al
and[mod], 0x3f
shr eax, 6
//выделить 11 битов (24-14) из Value 
mov [cond], ax
and [cond], 0x7ff
shr eax, 11
// выделить 7 битов (31-25) из Value 
mov [kop], al
and [kop], 0x7f
}

Решение задачи: «Как обращаться к членам структуры в ассемблерной вставке на си?»

textual
Листинг программы
struct SomeBitGroup{
unsigned char scale, r_m, mod, kop;
unsigned short cond, cond_a;
}sbg;
struct BitGr{
unsigned char scale:5;
unsigned char r_m:3;
unsigned char mod:6;
unsigned short cond:11;
unsigned char kop:7;
};
union pck{
    long p;
    struct BitGr b;} pck;
void ToUnpack(union pck pack, struct SomeBitGroup *sbg);//прототип, как видите
 
//сама функция с идиотской реализацией
 
void ToUnpack(union pck pack, struct SomeBitGroup *sbg)
{
sbg->scale=pack.b.scale;
sbg->r_m=pack.b.r_m;
sbg->mod=pack.b.mod;
sbg->cond=pack.b.cond;
sbg->kop=pack.b.kop;
}

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

  1. Объявление структуры SomeBitGroup с полями scale, r_m, mod, kop, cond, cond_a.
  2. Объявление структуры BitGr с полями scale, r_m, mod, cond, kop.
  3. Объявлениеunion pck, которая может содержать либо значение p типа long, либо инициализированную структуру BitGr без имени.
  4. Прототип функции ToUnpack, которая принимает два аргумента: pack типа union pck и sbg типа struct SomeBitGroup* и не возвращает ничего.
  5. Реализация функции ToUnpack, которая присваивает значения полей структуры SomeBitGroup соответствующим полям структуры BitGr из переданного аргумента pack.
  6. Конец кода.

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

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