Как обращаться к членам структуры в ассемблерной вставке на си? - 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; }
Объяснение кода листинга программы
- Объявление структуры
SomeBitGroup
с полямиscale
,r_m
,mod
,kop
,cond
,cond_a
. - Объявление структуры
BitGr
с полямиscale
,r_m
,mod
,cond
,kop
. - Объявлениеunion
pck
, которая может содержать либо значениеp
типаlong
, либо инициализированную структуруBitGr
без имени. - Прототип функции
ToUnpack
, которая принимает два аргумента:pack
типаunion pck
иsbg
типаstruct SomeBitGroup*
и не возвращает ничего. - Реализация функции
ToUnpack
, которая присваивает значения полей структурыSomeBitGroup
соответствующим полям структурыBitGr
из переданного аргументаpack
. - Конец кода.