Implementowanie w assemblerze kodu z C

0

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?

@Edit

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

1

Może jednak trochę inaczej:

mov al, a.byte ; podstawiamy pod al, a.byte czyli tak jakby **** **** - bo nie wiesz co tam jest
AND al, 0xFC ; **** **** and 1111 1100 czyli mamy **** **00
OR al, 0x01 ; **** **00 or 0000 0001 czyli mamy **** **01
mov ah,al ; pod ah podstawiamy al czyli **** **01
AND ah,0x03 ; **** **01 and 0000 0011 daje nam 0000 0001
SHL al,2 ; otrzymujemy **** 0100
AND al,0xE3 ; **** 0100 and 1110 0011 daje nam ***0 0100
OR al, ah ; 0000 0001 or ***0 0100 czyli ***0 0101 

Te *** na początku świadczą o tym że a.bates.c nie zmieniło się

0
_13th_Dragon napisał(a):

Może jednak trochę inaczej:

mov al, a.byte ; podstawiamy pod al, a.byte czyli tak jakby **** **** - bo nie wiesz co tam jest
AND al, 0xFC ; **** **** and 1111 1100 czyli mamy **** **00
OR al, 0x01 ; **** **00 or 0000 0001 czyli mamy **** **01
mov ah,al ; pod ah podstawiamy al czyli **** **01
AND ah,0x03 ; **** **01 and 0000 0011 daje nam 0000 0001
SHL al,2 ; otrzymujemy **** 0100
AND al,0xE3 ; **** 0100 and 1110 0011 daje nam ***0 0100
OR al, ah ; 0000 0001 or ***0 0100 czyli ***0 0101 

Te *** na początku świadczą o tym że a.bates.c nie zmieniło się

Dlaczego:

AND al,0xE3 ; **** 0100 and 1110 0011 daje nam ***0 0100

Nie powinno być ***0 0000?

I jak dobrze rozumiem, to drugie będzie coś takiego?

mov al,a ; **** ****
AND al, 0x1F ; **** **** and 0001 1111 daje nam 000* ****
mov BL,a ; **** ****
mov cl,a ; **** ****
AND bl, 0x03 ; **** **** and 0000 0011 daje nam 0000 00**
AND cl, 0x1F ; **** **** and 0001 1111 daje nam 000* ****
SHL bl,2 ; 0000 **00
ADD bl,cl ; 0000 **00 add 000* **** daje nam 000* ****
SHL bl,3 ; daje nam **** ****
OR al,bl ; daje nam **** ****
0
AND al,0xE3 ; **** **01 and 1110 0011 daje nam ***0 0001
0
_13th_Dragon napisał(a):
AND al,0xE3 ; **** **01 and 1110 0011 daje nam ***0 0001

Nie rozumiem za bardzo, bo al to jest chyba:

SHL al,2 ; otrzymujemy **** 0100

, więc nie powinno być zamiast **** **01 to **** 0100?

1 użytkowników online, w tym zalogowanych: 0, gości: 1