Przez przypadek usunąłem mój ostatni post, zamiast go edytować :/
Otóż mam w C podane:
union{
usigned char BYTE;
struct {
unsigned char a:2;
unsigned char b:3;
unsigned char c:3;
}bytes
}un_z
un_z a;
Należy obliczyć to w asemblerze:
a.bytes.a = 1;
a.bytes.b = a.bytes.a;
Rozwiązanie do tego zadania (nie moje autorstwa) jest takie:
mov al, a.byte
AND al, 0xFC
OR al, 0x01
mov ah,al
AND ah,0x03
SHL al,2
AND al,0xE3
OR al, ah
I teraz nie wiem czy dobrze rozumiem, ale jest tak, że na początku:
a.bytes.a
to 0000 0011
a.bytes.b
to 0000 0111
a.bytes.c
to 0000 0111
I teraz:
a.bytes.a = 1;
To oznacza, że z 0000 0011
należy zrobić 0000 0001
?
Oraz czy:
a.bytes.b = a.bytes.a;
oznacza, że z 0000 0111
należy zrobić 0000 0011
?
A także nie wiem, czy dobrze rozumiem co się dzieje w tym kodzie. Napiszę w komentarzach tak jak ja myślę.
mov al, a.byte //podstawiamy pod al, a.byte czyli tak jakby 0000 0011
AND al, 0xFC //0000 0011 and 1111 1100 czyli mamy 0000 0000
OR al, 0x01 //0000 0000 or 0000 0001 czyli mamy 0000 0001
mov ah,al //pod ah podstawiamy al czyli 0000 0001
AND ah,0x03 //0000 0001 and 0000 0011 daje nam 0000 0001
SHL al,2 // otrzymujemy 0000 0100
AND al,0xE3 //0000 0100 and 1110 0011 daje nam 0000 0010
OR al, ah
//otrzymujemy 0000 0011
Dobrze to rozumiem?
Oraz inny przykład:
a.bytes.c = a.bytes.a + a.bytes.b;
Kod (nie mojego autorstwa) to:
mov al,a
AND al, 0x1F
mov BL,a
mov cl,a
AND bl, 0x03
AND cl, 0x1F
SHL bl,2
ADD bl,cl
SHL bl,3
OR al,bl
I teraz ja to rozumiem tak:
mov al,a // pod al podstawiamy 0000 0011
AND al, 0x1F // 0000 0011 and 0001 1111 daje 0000 0011
mov bl,a //pod bl dajemy 0000 0011
mov cl,a //pod cl dajemy 0000 0011
AND bl, 0x03 //0000 0011 and 0000 0011 daje 0000 0011
AND cl, 0x1F //0000 0011 and 0001 1111 daje 0000 0011
SHL bl,2 // otrzymujemy 0000 1100
ADD bl,cl // otrzymujemy 0000 1111
SHL bl,3 //otrzymujemy 0111 1000
OR al,bl // otrzymujemy 0111 1011
Dobrze to rozumiem?
dodanie znaczników <cpode=c>, <code class="asm"> i `` - fp