• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zamiana liczby ósemkowej na dziesiętną- FASM

VPS Starter Arubacloud
0 głosów
231 wizyt
pytanie zadane 8 maja 2023 w Assembler przez Saskus Nowicjusz (150 p.)

Cześć.Mam problem z wyswietleniem liczby ósemkowej w postaci dziesiętnej. Stosuję tutaj algorytm dzielenia przez 10. Wszystko by działało gdyby nie fakt, że nie wyświetla mi się liczba dziesiątek i nie wiem dokładnie dlaczego. Np. po wpisaniu liczby 171o, wyświetla się dziesiętnie 101, zamiast 121 itp. 

Mam taki kod:

format PE Console 4.0

entry start
include 'win32ax.inc'
include 'win_macros.inc'

section '.text' code readable executable
start:

        ustaw_kursor 0,0
        wyswietl txt1


        xor dx, dx
        mov [zm1], dx
        mov ecx,10
ety1:
        push ecx

ety2:
        pob_znak

        cmp al,8                ;Backspace
        jne ety3

        pop ecx
        cmp cx,10
        je  ety1
        
        inc cx
        push ecx
        wysw_znak 8
        wysw_znak ' '
        wysw_znak 8
        jmp ety2

ety3:
        cmp al, 'q'
        je koniec

        cmp al, 13  ;enter
        je konwertowanie
        push ecx
        cmp al,'0'
        jb  ety2
        cmp al,'7'
        ja  ety2
        
        wysw_znak al

        and ax, 7
        shl word [zm1], 3
        add [zm1], ax

        pop ecx
        dec ecx
        cmp ecx, 0
        jne ety1
      ;  loop ety1

        ustaw_kursor 20,10
        wyswietl txt2

ety4:
        pob_znak
        cmp al,1bh      ;Esc
        jne ety4

konwertowanie:
        pop ecx
        cmp ecx, 10
        je ety1

wysw_bin:
        wyswietl txt4

        mov bx, [zm1]
        mov ecx, 16
ety5:  ;ety1 w 6asm
        push ecx
        shl bx, 1
        jc ety6
        mov dl, '0'
        jmp ety7
ety6: ;ety2 w 6asm
        mov dl, '1'
ety7: ;ety3 w 6asm
        wysw_znak dl
        pop ecx
        loop ety5

wysw_dec:
        wyswietl txt6

        mov ax,[zm1]
        mov dx,0
        mov bx,10
        div bx
                      

        add dx,30h
        push edx
                                                               
        mov dx,0
        div bx

        add ax,3030h
        push eax
        wysw_znak al
        pop eax
        wysw_znak ah

        pop edx
        wysw_znak dl




wysw_oct:


        pob_znak
koniec:

        end_prog


section '.data' data readable writeable
        txt1 db 'Wprowadz w postaci osemkowej',10,13,NULL
        txt2 db 'nacisnij Esc',NULL
        zm1 dw 32
        txt3 db 10,13,'konwertowanie',13, 13, NULL
        txt4 db 10,10,'wartosc BIN: ', NULL
        txt5 db 10,10,'wartosc OCT: ', NULL
        txt6 db 10,10,'wartosc DEC: ',NULL

 

komentarz 26 maja 2023 przez overcq Pasjonat (21,540 p.)

W linii 53 wystarczy or.

Natomiast pod etykietą wysw_dec nie przetwarzasz wszystkich cyfr dziesiętnych w pętli, więc dostajesz tylko pierwszą resztę z dzielenia przez 10 (pierwszą cyfrę), a później jakieś śmieci, które zostały w ax (wynik dzielenia, a nie reszta). Może chciałeś użyć dx?

1 odpowiedź

0 głosów
odpowiedź 25 maja 2023 przez Pawel1995 Gaduła (3,810 p.)

Ciężko dziś o specjalistę z asemblera. Na pewno próbowałbym porównać swój kod do innych, jak tu:

https://stackoverflow.com/questions/40613534/assembly-conversion-hexadecimal-to-decimal-4-digit-max

 

Jeszcze ChatGPT podpowiedział mi w zakresie samej konwersji ósemkowej liczby na dziesiętną:

 

Aby zamienić liczbę ósemkową na dziesiętną w asemblerze, można zastosować następujący algorytm:

  1. Wczytaj liczbę ósemkową do rejestru.
  2. Inicjalizuj zmienną pomocniczą "dziesiętna" na 0.
  3. Przejdź przez cyfry liczby ósemkowej od prawej do lewej.
  4. Dla każdej cyfry wykonaj następujące kroki:
    • Pomnóż cyfrę przez odpowiednią potęgę liczby 8 (np. 8^0, 8^1, 8^2 itd.), zaczynając od potęgi 0 dla pierwszej cyfry.
    • Dodaj wynik do zmiennej pomocniczej "dziesiętna".
  5. Po przejściu przez wszystkie cyfry, zmienna "dziesiętna" będzie zawierać wynikową liczbę dziesiętną.

Poniżej przedstawiam przykładowy kod w asemblerze x86 dla procesora Intel, który wykonuje konwersję liczby ósemkowej na dziesiętną:

section .data
    liczba_dwuk wyraz dw 123o  ; Przykładowa liczba ósemkowa (123)

section .text
    global _start

_start:
    mov ax, [liczba_dwuk]   ; Wczytaj liczbę ósemkową do rejestru AX
    xor bx, bx              ; Zeruj rejestr BX (licznik potęgi 8)
    xor cx, cx              ; Zeruj rejestr CX (zmienna pomocnicza "dziesiętna")

convert_loop:
    mov dx, ax              ; Skopiuj zawartość rejestru AX do DX
    and dx, 7               ; Wyodrębnij ostatnią cyfrę ósemkową
    imul dx, bx, 8          ; Pomnóż cyfrę przez potęgę 8
    add cx, dx              ; Dodaj wynik do zmiennej pomocniczej "dziesiętna"
    inc bx                  ; Inkrementuj licznik potęgi 8

    shr ax, 3               ; Przesuń rejestr AX o 3 bity w prawo (odrzucenie ostatniej cyfry)
    test ax, ax             ; Sprawdź, czy AX jest równy zero (czy wszystkie cyfry zostały przetworzone)
    jnz convert_loop        ; Jeśli AX jest różne od zera, powtórz pętlę

    ; Wynik znajduje się w rejestrze CX (zmienna pomocnicza "dziesiętna")
    ; Tutaj można dodać kod obsługujący wynik (np. wyświetlenie na ekranie)

    mov eax, 1              ; Kod wyjścia 1 (exit)
    xor ebx, ebx            ; Kod powrotu 0
    int 0x80                ; Przerwanie systemowe

Ten kod wczytuje liczbę ósemkową 123 (w notacji ósemkowej, sufiks "o") i konwertuje ją na liczbę dziesiętną. Wynik znajduje się w rejestrze CX (zmienna pomocnicza "dziesiętna"). Można dodać odpowiedni kod obsługujący wynik (np. wyświetlanie na ekranie) przed kodem wyjścia.

Należy zauważyć, że przykład ten odnosi się do asemblera x86 dla procesora Intel. Składnia i instrukcje mogą się różnić w zależności od używanego asemblera i platformy sprzętowej.

Podobne pytania

0 głosów
1 odpowiedź 369 wizyt
pytanie zadane 2 września 2018 w Assembler przez Cixo Gaduła (4,070 p.)
0 głosów
1 odpowiedź 253 wizyt
pytanie zadane 26 sierpnia 2018 w Assembler przez Cixo Gaduła (4,070 p.)
0 głosów
0 odpowiedzi 332 wizyt
pytanie zadane 16 grudnia 2016 w Assembler przez emkaa Nowicjusz (130 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...