[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [linux] Re: Manipuler un bit en c
bonjour,
ca fait quelque temps que je me demandais si une manipulation de bits via
champs de bit pourrais être fait de façon optimisé en assembleur. Alors j'ai
fait ce teste une fois pour toute.
vous avez ci dessous du code source en C avec le résultat en assembleur
intercalé.
Il semblerais que ce soit très bien comme solution et ca rend le code source
plus clair.
donc ...
main()
{
int i;
unsigned char test;
struct One_by_One
{
unsigned char a:1;
unsigned char b:1;
unsigned char c:1;
unsigned char d:1;
unsigned char e:1;
unsigned char f:1;
unsigned char g:1;
unsigned char h:1;
};
union
{
unsigned char o;
struct One_by_One b;
} plok;
plok.o = 145;
.LM3:
mov r3, #145
mov r2, r3
strb r2, [fp, #-18] /* plok se trouve sur le stack en -18 */
.stabn 68,0,27,.LM4-_main
test = 145;
.LM4:
mov r3, #145
mov r2, r3
strb r2, [fp, #-17] /* test se trouve sur le stack en -17 */
.stabn 68,0,29,.LM5-_main
plok.b.a = 1;
.LM5:
ldrb r3, [fp, #-18] /* on cas rechercher plok from stack */
orr r2, r3, #1 /* le OR attendus (! bits inversés en
mémoire) */
mov r3, r2
strb r3, [fp, #-18]
.stabn 68,0,31,.LM6-_main
plok.b.e = 1;
.LM6:
ldrb r3, [fp, #-18]
orr r2, r3, #16
mov r3, r2
strb r3, [fp, #-18]
.stabn 68,0,33,.LM7-_main
plok.b.g = 0;
.LM7:
ldrb r3, [fp, #-18]
and r2, r3, #191 /* pil poil se qu'on peux imaginer */
mov r3, r2
strb r3, [fp, #-18]
.stabn 68,0,35,.LM8-_main
if (plok.b.d == 1)
.LM8:
ldrb r3, [fp, #-18]
and r2, r3, #8 /* tout a zero sauf le bit d */
and r3, r2, #255 /* partie haute du registre a zero, c'est
ici qu'on pourrais suspecter un
manque d'optimisation, mais j'ai pas
compilé, ici en full optimisation */
cmp r3, #0
beq L2
.stabn 68,0,36,.LM9-_main
i = 632;
else
i = 237;
if ((plok.o & 4) == 4)
.LM11:
ldrb r3, [fp, #-18]
and r2, r3, #4
and r3, r2, #255 /* ca à l'air pas mal finalement les champs
de bits */
cmp r3, #0
beq L4
.stabn 68,0,41,.LM12-_main
i = 92;
else
i = 402;
if(test == 23) /* test juste pour se rendre compte comment se
passe une comparaison classique */
.LM14:
ldrb r3, [fp, #-17] @ zero_extendqisi2
/* tiens je ne connaissais pas cette
méthode de mise à zero du reste du registre
faut dire que je programme tresssss tressss
rarement en assembleur :-) */
cmp r3, #23
bne L6
.stabn 68,0,46,.LM15-_main
i = 53;
else
i = 321;
}
_______________________________________________
Linux Mailing List
Archives: http://unixtech.be/mailman/listinfo/linux