GNU Asembler - konwersja liczby z dziesietnego na szesnastkowy

GNU Asembler - konwersja liczby z dziesietnego na szesnastkowy
QR
  • Rejestracja:ponad 5 lat
  • Ostatnio:3 miesiące
  • Postów:17
0

Witajcie,
Mam problem z wykonaniem zadania. Zadanie to polega na konwersji liczby z systemu dziesiętnego na system szesnastkowy a następnie wypisanie wartości. (Liczba początkowa jest z góry zadeklarowana).
Wszystko działa dla liczby max 8 bitowej (mniejszej niz 255) gdy naprzykład podam liczbe 280 przy próbie ponownej kompilacji występuje następujący błąd:
Warning: value 0x118 truncated to 0x18
Rozumiem,że błąd pochodził ze złej deklaracji typu danych (zamiast word wykorzystałem byte - za mała pojemnosc)
Przy próbie zmiany z byte na word program wypisuje totalne głupoty - naprzykład dla wartości 280 wypisał "0x18".
Składnia GNU Asembler - jestem totalnie zielony i jest to moja pierwsza styczność z tym językiem programowania dlatego proszee o wyrozumiałość i pomoc ! :D
Poniżej załączam kod programu - czy ktoś jest w stanie podrzucić jakieś pomysły/rozwiązanie ? Heeelp ! :D

Kopiuj
.globl _start

.data
	
var:	.byte	 240		# jesli zamienie na .word 280 - wypisuje glupoty

outstr:	.ascii	"value = 0xhl\n"
.equ	strlen, . - outstr
 
.text
	
_start:

#pass only the necessary arguments

	mov	var,%al
	mov	$outstr+10,%rdi

#invoke conversion

	call	convert_byte

#print the result

	mov	$1,%eax
	mov	$1,%edi
	mov	$outstr,%rsi
	mov	$17,%edx
	syscall

#and exit

	mov	$60,%eax
	xor	%edi,%edi
	syscall


#convert byte to a string (hex)

convert_byte:

	mov	%al,%bl

	and	$0x0F,%al
	call	convert_nibble

	shl	$8,%ax

	mov	%bl,%al
	shr	$4,%al
	call	convert_nibble

	mov	%ax,(%edi)

	ret

convert_nibble:
	cmp	$10,%al
	jc	below10
	add	$55,%al
	ret
below10:
	add	$48,%al
	ret
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Nie no cały ten kod trzeba poprawić. Masz np. mov var,%al a al to 8 bitów. Masz też mov %al,%bl i znów używasz rejestrów 8 bitowych. Siłą rzeczy nawet jak zmienisz tą początkową deklaracje na worda to potem wpiszesz sobie kawałek tej liczby do al i potem to konwertujesz. Co zresztą widać w twoim błędzie, podałeś liczbę 0x0118 czy dwa bajty 01 18, a po przypisaniu mov var,%al do al poszedł tylko ten niski bajt więc 0x18


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
QR
  • Rejestracja:ponad 5 lat
  • Ostatnio:3 miesiące
  • Postów:17
0

Bardzo dziękuje za odpowiedź ! :D
No więc po wielu próbach zamiany rejestrów wykombinowałem tak skoro long to liczba 32bit to wykorzystałem rejestry 32bitowe:

Kopiuj
globl _start
 
.data
   
var:   .long	3735927486  
 
outstr:	.ascii	"value = 0x0000000000000000\n"
.equ    strlen, . - outstr
 
.text
   
_start:
 
 
    mov var,%eax
    mov $outstr+10,%rdi #Tutaj tej linii kompletnie nie rozumiem co oznacza +10?
 
 
    call    convert_byte
 
 
    mov $1,%eax
    mov $1,%edi
    mov $outstr,%rsi
    mov $17,%edx
    syscall
 
 
    mov $60,%eax
    xor %edi,%edi
    syscall
 
 
#convert byte to a string (hex)
 
convert_byte:
 
    mov %eax,%ebx
 
    and $0x0F,%eax
    call    convert_nibble
 
    shl $8,%rax #w poprzednim kodzie nigdzie nie był wykorzystany rejestr ax ale był to rejestr dwukrotnie większy więc analogicznie zamieniłem go na rax
 
    mov %ebx,%eax
    shr $4,%eax  #co tutaj sie dzieje ?
    call    convert_nibble
 
    mov %ax,(%edi)
 
    ret
 
convert_nibble:
    cmp $10,%eax
    jc  below10
    add $55,%eax
    ret
below10:
    add $48,%al
    ret

Co do pierwszego komentarza Wiem tylko tyle,że w poprzednim przypadku działało to tak: do rejestru przeznaczenia zostaje załadowany wskaźnik wskazujący na 10 #miejsce w outstr – tam będzie załadowany wynik funkcji convert_byte #czyli przekonwertowana liczba.
Co do drugiego i trzeciego komentarza to wiem tylko tyle,że przesuwa wszystkie bity z %ax o 8 w lewo, daje miejsce na drugi znak
Niestety program dalej nie działa - kompiluje się ale - wypisuje jedynie wartość: 0x00000000
Co dalej robie źle :/ ? Czy ktoś/Pan jest mi w stanie wyjaśnić co

RI
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:40
0

Na początku nauki warto korzystać ze składni intela, a nie AT&T,
dodając na początku kodu:

Kopiuj
.intel_syntax

Aby przekonwertować liczbę wykonujesz:

Kopiuj
 call    convert_byte

Program, w pierwszej wersji robił to co ma robić, konwertował bajt.
Aby dokonać konwersji większej liczby, będzie potrzebne więcej pracy.
Nie kopiuj bezmyślnie kodu, bo tylko wydłużasz swoją pracę.

SHL - przesunięcie bitów w lewo
SHR - przesunięcie bitów w prawo

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Zacznij od zastanowienia sie jak ten kod w ogóle działa a nie jak to przerobić. Czemu w ogóle reprezentacja hex? ;) Popatrz na to co się dzieje jak masz liczby reprezentowane jako hexy, jak to odpowiada bajtom! Cały trik polega na tym że jeden bajt odpowiada jednej "cyfrze" szesnastkowej. Liczba 0xABCD ma cyfry A, B, C, D i składa się też, na poziomie pamięci, z takich właśnie bajtów! Więc konkwersje 0xABCD na liczbę szesnastkową można by spokojnie zrobić po jednym bajcie. Mogłes nie ruszać tej funkcji convert byte którą miałeś, a zamiast tego wywołać tą funkcje w pętli, dla każdego bajtu twojej wejściowej liczby. Jedyne o czym trzeba pamiętać to endianness -> czy mniej znaczące bajty są z przodu czy z tyłu liczby tzn czy masz w pamieci ABCD czy DCBA.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)