Skocz do zawartości

[Asembler] Operacje na bitach


Goenitz

Polecane posty

Mam zadanie w którym muszę zmienić liczbę (dec) co ma jeden bajt na liczbę w systemie bin, hex i oct. Nie mogę wykorzystywać operacji dzielenia, tylko przesunięcia. Składnia kodu: Intela (kompilator tasm). Wiem, że można wykonywać przesunięcie w prawo opcją "shr" by otrzymać efekt dzielenia. Ale nie wiem jak mam otrzymać resztę z przesunięcia i w jaki sposób wypisać to na ekran. Dlatego czy mógłby prosić by mi ktoś w bardzo prosty sposób wytłumaczyć jak ja mam to zrobić? Dzięki z góry.

Link do komentarza
Udostępnij na innych stronach

nie ma czegos takiego jak reszta z przesuniecia. W zaleznosci od tego czy przesuwasz w lewo czy w prawo ostatni bit z danej strony rejestru wyskakuje do bitu rejestru oznaczanego jako carry flag (CF). Nie wiem czy o to ci chodzilo.

Co do wypisywania na ekran to pytanie brzmi z czego chcesz korzystac ? z funkcji biosu czy bezposrednio adresu pamieci ekranu ?

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

CYTAT(Toster @ pon, 23 sie 2010 - 21:01) <{POST_SNAPBACK}>

nie ma czegos takiego jak reszta z przesuniecia. W zaleznosci od tego czy przesuwasz w lewo czy w prawo ostatni bit z danej strony rejestru wyskakuje do bitu rejestru oznaczanego jako carry flag (CF).

 

Powiem tak, że chcę np. po wpisaniu np. liczby 10 wyświetliło mi w w bin 1010. I tak podanie mi wartości binarnej każdej liczby jaką wpiszę z przedziału od 0 do 255. Da się te zera i jedynki z CF wypisać by stworzyć wartość binarną? Jeśli nie to może jest inny sposób?

 

 

Co do wypisywania na ekran to pytanie brzmi z czego chcesz korzystac ? z funkcji biosu czy bezposrednio adresu pamieci ekranu ?

 

Z przerwań. Np. tego:

mov dl, <<do dl dajemy co wyświetlić

mov ah, 02h

int 21h

Link do komentarza
Udostępnij na innych stronach

No skorowiesz jak wyswietlac wartosci z przerwanie 21 to po co pytales jak wyswietlic wartosc ?

Sama znajomość przerwania niewiele mi daje. Przykład:

Shr - to opcja przesunięcia bitu w prawo. Tak zwane dzielenie przez 2.

Weźmy np. Liczbę 25:

 

25 shr o 1 = 12 reszty 1

12 shr o 1 = 6 reszty 0

6 shr o 1 = 3 reszty 0

3 shr o 1 = 1 reszty 1

1 shr o 1 = 0 reszty 1*

 

25dec = *11001bin

 

To jak wyświetlić tą liczbę od końca tam gdzie jest gwiazdka? I jak potem to przerobić na system hex i oct?

Link do komentarza
Udostępnij na innych stronach

Toster to będzie coś takiego?

 

mov bl, Liczba_Dec
Wyswietl_Bin:
shr bl, 1
mov dl, cf  
mov ah, 02h
int 21h
test bl, FFh
jnz Wyswietl_Bin

Opcja Test działa podobno jak And, tylko nie zapisuje wyniku i poza flagami nic nie zmienia. Dlatego więc zastosowałem ją do sprawdzenia czy wartość w bl (co ma 8 bitów) to zero.

Jeśli nie tak to słucham rad sensei.

Link do komentarza
Udostępnij na innych stronach

masz kompilator to sprawdz, w asmie to ja siedzialem z 10 lat temu jak nie dalej. Wytlumaczylem ci z grubsza jak do tego podejsc ale nie pamietam skladni mnemonicow dla x86 ani nie mam kompilatora.

Co do tego kodu co wkleiles to jakos podejrzanie wyglada mi linijka mov dl, cf co to ma robic ?

przeciez operacje shr ustawiaja ci flagi na rejestrze procesora wiec po co ci test ?

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Co do tego kodu co wkleiles to jakos podejrzanie wyglada mi linijka mov dl, cf co to ma robic ?

przeciez operacje shr ustawiaja ci flagi na rejestrze procesora wiec po co ci test ?

Ma na celu wypisać ten ostatni bit, który znika po przesunięciu. Mówiłeś, że jest on do cf przeniesiony.

Link do komentarza
Udostępnij na innych stronach

mov bl, Liczba_Dec

Wyswietl_Bin:

shr bl, 1

mov dl, cf

mov ah, 02h

int 21h

test bl, FFh

jnz Wyswietl_Bin

 

prawie dobrze

 

mov bl,liczba

xxx:

shr bl,1

mov dl,30h ( juz bedzie znak "0")

adc dl,0 (dodajesz carry (cf) i zero do dl - jeśli jest carry ustawiony to dodasz 1 - jeśli nie to dodasz 0)

(kod znaku "0" to 30h "1" to 31)

 

 

mov ah,2

int 21h

cmp bl,0 ( jeśli 0 to wszystkie "bity =1 wyszły ")

jnz xxx

 

 

można odrazu zapamiętać bity - dla ósemkowego i szesnastkowego

 

 

mov cx,0

mov bl,liczba

xxx:

shr bl,1

mov dl,30h ( juz bedzie znak "0")

adc dl,0 (dodajesz carry (cf) i zero do dl - jeśli jest carry ustawiony to dodasz 1 - jeśli nie to dodasz 0)

(kod znaku "0" to 30h "1" to 31)

adc cl,0 ----------------------------------------- dla 8

add cl,cl --------------------------------------- można przesunąć ale trzeba by kasować CF a nie wiem jaki mnemo ...:)

 

 

mov ah,2

int 21h

cmp bl,0 ( jeśli 0 to wszystkie "bity =1 wyszły ")

jnz xxx

 

 

dalej dla 8

 

- jeśli tylko jeden znak to nie ma bólu -

push cx

and cl,8 ---- kasujesz bity 123 - i zostaje "4"bit -8

shr cl,1

shr cl,1

shr cl,1

add cl,30h

mov dl,cl

mov ah,2

int 21

pop cx

and cl,07

add cl,30h

mov dl,cl

mov ah,2

int 21h

 

- zamiana dziesiętnego znaku na hex to chyba nie ma sensu ---

- no chyba ze jest kilka znaków

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...