Hejka,
Od dzisiaj zacząłem naukę programowania w Assembly. Przerobiłem troszkę książki do Assembly i zrobiłem z niej póki co wszystkie zadania, ale zadania znacząco się utrudniły. Docelowo mam zrobić program, który wypisuje liczby od 90 do 100 i operuje głównie na rejestrach. Dla uproszczenie chciałem stworzyć program, który zapisuje pierwsze 10 liczb na stosie i wyświetla wszystkie 10. Dopiero potem chciałem zrobić te zadanie z książki. Niestety program nie wyświetla nic na wyjściu, Analizowałem go już któryś raz. Może jest ktoś chętny kto by mi pomógł, albo chociaż nakierował?
; Program zapisuje na stosie 10 wartości 0,1,2...10
; Następnie wypisuje ostatnią wartość na ekran
; Program w fazie roboczej. Domyślnie ma wypisywać wszystkie wartości z stosu na ekran
section .text ; sekcja na kod
global _start ; wymagane rozpoczęcie etykietą globalną
_start: ; początek kodu w etykiecie _start
push rbp ; umieszczenie rejestru rbp na początku stosu
mov rbp, rsp ; zapisanie do rbp prawdziwego wskaźnika stosu
mov rbx, 10 ; maksymalna wartość zmiennej, a przy okazji ich ilość
xor rsi, rsi ; zerowanie rejestru
cmp rsi, rbx
jb loop
loop:
cmp rsi, rbx ; porównywanie dwóch wartości i zapisywanie wyniku porównania do flag
jae show ; jeżeli [rsi] >= [rbx] czyli jeżeli ilość liczb i ich wartość osiąga maksimum lub więcej przerwij wykonywanie pętli (loop) i idź do kodu zaczynającego się od etykiety show
push rsi ; zapis liczbę na stosie
inc rsi ; zwiększ liczbę o jeden
jb loop ; jeżeli [rsi] <= [rbx] wykonaj pętle jeszcze raz
show:
mov rax, 1 ; wywołanie funkcji zapisu do pliku
mov rdi, 1 ; deskryptor ustawiony na terminal/ekran
pop rbp ; zdjęcie wartości z wierzchołka stos i zapisanie jej do rejestru rbp
mov rsi, rbp ; co ma zostać wyświetlone
mov rdx, 1 ; jaką ma długość w bajtach
syscall ; wywołanie systemowe
mov rax, 60 ; numer funkcji systemowej - sys_exit
syscall ; wywołanie tej funkcji