Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Asembler zamiana liczby w systenie ósemkowym na dziesiętny !

19 Kwi 2005 09:27 2649 6
  • Poziom 12  
    Witam !
    zaczynam wlasnie nauke asemblera i prosze o pomoc w napisamiu programiku (tak jak w temacie), ktory by zamienił liczbe napisaną ósemkowo na dzisiętną ??
    Przydają mi się wszystkie informacje jak zacząć, jakieś kody pomysły i wogóle !
    z góry wielkie dzieki pozdrawiam
  • Poziom 27  
    witam

    nic prostszego! zaczynasz od wyzerowania wyniku i zrobienia pętli dla wszystkich cyfr liczby wejściowej, począwszy od najbardziej znaczącej
    W pętli:
    1. mnożysz wynik przez podstawę liczby wejściowej (czyli 8)
    2. dodajesz do wyniku kolejną cyfrę liczby wej. na którą wskazuje stan pętli

    np zmieniasz liczbę 157
    Code:
    1. wynik=0
    

    2a. wynik*=8  podstawa liczby wej
    2b. wynik+=1  pierwsza cyfra
    3a. wynik*=8  podstawa liczby wej
    3b. wynik+=5  druga cyfra
    4a. wynik*=8  podstawa liczby wej
    4b. wynik+=7  trzecia cyfra

    wynik=111 decymalnie
  • Poziom 12  
    a wiec na poczatku dzieki za zainteresowanie moim tematem i pomoc
    Ale niestety nie udaje mi sie napisać tego - czy bylbys w stanie mi napisac chodciaż mniej wiecej kod albo jakis początek zeby mnie naprowadzic bo naprawde jestem poczatkujacy !!
    dzieki pozdrawiam
  • Poziom 27  
    program w ibasic professional

    instr(x, y) szuka stringu Y w stringu X i zwraca jego index lub zero
    chr$(x) zmienia liczbę X na znak ascii (string)
    liczba: string z liczbą do konwersji; tylko cyfry i wielkie litery
    podstawa: 1-36

    Code:
    print ToDec("157", 8)
    
    print ToDec("FFFF", 16)
    getch()



    sub ToDec(liczba:STRING, podstawa:INT),UINT
       POINTER dekoder
       UINT index, wynik, x

       index   = 0
       wynik   = 0
       dekoder = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

       x = instr(*<STRING>dekoder, chr$(liczba[index]) )

       while x
          index++
          wynik *= podstawa
          wynik += (x-1)
          x = instr(*<STRING>dekoder, chr$(liczba[index]) )
       wend

       return wynik
    endsub


    kod w asmie bezpośrednio z parsera możesz ściągnąć z http://people.freenet.de/sapero/ToDec.asm

    napisz wreszcie o jaki assembler chodzi
  • Poziom 12  
    hmmm dzięki za pomoc teraz musze to wszystko przeanalizować bo się troszke zamieszałem ... szkoda że nie umisz mi tego napisac w asemblerze takim najwyklejszym asm16 bo z tych kodów jest troszke ciezej ale postaram sie dzieki. Jak bys dala rade jeszcze cos wymyslic to pisz bede bardzo wdzięczny pozdrawiam
  • Poziom 27  
    tak jak poprzednio: liczba to pointer do stringu który chcesz zmienić na int
    Code:
    %include "asm.mac"
    
    global ToDec


    SUB ToDec, liczba, podstawa
          %define wynik ebx
          mov edi,dekoder
          mov esi,liczba
          xor wynik,wynik
          or ecx,-1
    .go
          xor eax,eax
          lodsb
          call instr, edi, eax
          and al,al
          jz .quit
          dec eax
          push eax

          mov eax,wynik
          mul dword podstawa
          pop ebx
          add eax,ebx
          mov wynik,eax
          loop .go

    .quit
          mov eax,wynik
    ENDSUB


    SUB instr, searchString, CharToFind
          %define wynik edx
          xor wynik,wynik
          mov ebx,CharToFind
          mov esi,searchString
          or  ecx,-1
    .go:
          lodsb
          and al,al
          jz .notf
          cmp al,bl
          loopne .go
    ;found
          sub esi,searchString
          mov wynik,esi
    .notf
          mov eax,wynik
    ENDSUB




    segment .data use32
    dekoder db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",0


    "sub" i "endsub" to typowe makra zabezpieczające rejestry na stosie,
    "sub" dodatkowo oblicza ile funkcja ma parametrów i w "endsub" odpowiednio jest tworzony ret n
    parametry funkcji są definiowane jako [ebp+8] (pierwszy) i [ebp+12] (drugi)

    SUB:
    Code:
    Dump of file ToDec.obj
    

    File Type: COFF OBJECT
    push        ebp
    mov         ebp,esp
    push        ecx
    push        ebx
    push        edi
    push        esi

    ENDSUB:
    Code:
    pop         esi
    
    pop         edi
    pop         ebx
    pop         ecx
    leave
    ret         8

    http://people.freenet.de/sapero/todec-dump.txt
  • Poziom 12  
    Witam !!
    temat uznaję za zakończony w prawdzie udało mi się napisać inaczej ten program niż kolega sugerował ! gdyby ktoś miał z tym problem proszę pisać na meila postaram się pomóc w miarę czasu
    z góry dziękuje za całą pomoc pozdrawiam