Goenitz Napisano Sierpień 23, 2010 Zgłoś Share Napisano Sierpień 23, 2010 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 More sharing options...
Toster Napisano Sierpień 23, 2010 Zgłoś Share Napisano Sierpień 23, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Goenitz Napisano Sierpień 23, 2010 Autor Zgłoś Share Napisano Sierpień 23, 2010 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 More sharing options...
Toster Napisano Sierpień 23, 2010 Zgłoś Share Napisano Sierpień 23, 2010 No skorowiesz jak wyswietlac wartosci z przerwanie 21 to po co pytales jak wyswietlic wartosc ? W zaleznosci czy masz ustawione CF czy nie po ostatnim shifcie wyswietlasz 0 lub 1 i przechodzisz do kolejnej iteracji. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Goenitz Napisano Sierpień 23, 2010 Autor Zgłoś Share Napisano Sierpień 23, 2010 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 More sharing options...
Toster Napisano Sierpień 23, 2010 Zgłoś Share Napisano Sierpień 23, 2010 przeciez ci napisalem, wyswietlaj po jednym znaku. W zaleznosci od tego czy po shifcie flaga jest ustawiona czy nie wyswietlaj jeden znak "0" lub "1" i iteruj tak dlugo az wartosc ktora dzielisz bedzie wynosci 0. Prosciej juz nie umiem. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Goenitz Napisano Sierpień 24, 2010 Autor Zgłoś Share Napisano Sierpień 24, 2010 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 More sharing options...
Toster Napisano Sierpień 24, 2010 Zgłoś Share Napisano Sierpień 24, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Goenitz Napisano Sierpień 24, 2010 Autor Zgłoś Share Napisano Sierpień 24, 2010 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 More sharing options...
Toster Napisano Sierpień 24, 2010 Zgłoś Share Napisano Sierpień 24, 2010 proponuje ci otworzyc kurs asemblera i poczytac na poczatek. Mysle ze twoj problem rozwiaze sie sam jak zrozumiesz flagi procesora. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Goenitz Napisano Sierpień 24, 2010 Autor Zgłoś Share Napisano Sierpień 24, 2010 A co według ciebie źle robię? Link do komentarza Udostępnij na innych stronach More sharing options...
redsx Napisano Sierpień 27, 2010 Zgłoś Share Napisano Sierpień 27, 2010 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.