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

Assembler wypisz 10 liczb na ekranie

VPS Starter Arubacloud
0 głosów
1,622 wizyt
pytanie zadane 27 października 2017 w Assembler przez Bish0p Obywatel (1,940 p.)

Witam

Mam do napisania program w assemblerze który wypisuje mi 10 liczb na ekranie (kolejnych)

Nie bedzie zaskoczenia jak powiem że nie działa xD

Bład znajduje sie najprawdopodobnie w momencie inkrementacji liczb wyświetlanych na ekranie

section .data

wysw 	db	"%d",10
liczba dd	5

section .text
 global _start
_start:

mov esi,0

_petla:
cmp esi,10
je _koniec
mov eax, 4
mov ebx, 1
mov ecx, [wysw]
mov edx, liczba
int 80h
inc ecx      ;(najprawdopodobnie tutaj jest bład)
inc esi

jmp _petla
_koniec:

mov eax,1
mov ebx,0
int 80h

Z góry dziekuje za pomoc

1 odpowiedź

+3 głosów
odpowiedź 27 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Tak na szybko:

mov ecx, [wysw]

Tracisz wcześniejszą wartość ecx. Użyj na przykład stosu (lub innego rejestru), żeby ją sobie później przywrócić smiley

komentarz 27 października 2017 przez Bish0p Obywatel (1,940 p.)
funkcja printf powinna wystarczyć żeby pozbyć się tego błędu nie ?
komentarz 27 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Poczekaj, pobawię się chwilę, może później jak się uda, to dam znać. smiley

komentarz 27 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Hmm, ty mówisz o funkcji printf, ale wywołujesz wywołanie systemowe. Więc jak w końcu? wink

komentarz 27 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Przepisałem ten kod na taki z użyciem printf, natomiast jest jakiś śmieszny błąd. smiley Muszę ogarnąć gdzie.

komentarz 27 października 2017 przez Hiskiel Pasjonat (22,830 p.)
Cóż to za język?! Jakiś taki nieogarnięty... To był jakiś pierwszy z pierwszych czy co?
1
komentarz 27 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
edycja 27 października 2017 przez Eryk Andrzejewski

Okej, popracowałem trochę nad tym (szczerze mówiąc to nigdy wcześniej nie pisałem nic w asmie pod Linuksa, prawie wcale w user mode nie pisałem kodu asma, może przez to miałem też trochę problemy wink) i udało się. Zastosowałem funkcję printf z biblioteki standardowej języka C. Oto kod:

extern printf

section .data
format db "%d", 0xA
number dd 5
 
section .text
global main
main:
	; Backup ramki stosu i ustawienie jej dla naszej funkcji
	push ebp
	mov ebp, esp
	
	; Wyzerowanie licznika i wrzucenie liczby pocztatkowej do rejestru EAX
	xor ecx, ecx	
	mov eax, dword [number]

	loop:
		; Jesli ECX = 10 (wykonano 10 obiegow petli), to przejdz do zakonczenia
		cmp ecx, 10
		je end
		
		; Backup rejestrow EAX i ECX (funkcja printf zmieni ich zawartosc)
		push ecx
		push eax
	
		; Wypisz aktualny numer (EAX) przy pomocy funkcji printf
		push eax
		push format
		call printf
		
		; Przesun wskaznik stosu o 8 bajtow (wrzucilismy dwa 4 bajtowe elementy - stos na 32 bitowym systemie ma 4 bajty per element)
		add esp, 8
		
		; Przywroc poprzednie wartosci EAX i ECX
		pop eax
		pop ecx
		
		; Zwieksz ECX i EAX o 1 i skocz do poczatku petli
		inc ecx
		inc eax
		jmp loop

	end:
		; Przywroc poprzednia wartosc EBP i wyjdz z funkcji
		pop ebp
		ret

Kompilowałem nasmem (bo chyba tego asemblera sam używasz) i linkowałem GCC w taki sposób:

nasm -f elf32 -F dwarf -g kod.asm
gcc -m32 test.o -o test -g

Te "dziwne" parametry wynikają z mojej potrzeby posiadania symboli w pliku wykonywalnym - korzystałem z debuggera.

@EDIT

Jak widać, w kodzie zastosowałem mnóstwo komentarzy, może nie są one zbytnio potrzebne, ale napisałem, żebyś zrozumiał, o co tam biega. smiley

komentarz 27 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Swipeyro

To jest język asemblera dla architektury x86 - podstawowy sposób komunikacji programisty z procesorem (no, kod maszynowy już pomijam). Jako, że procesor wykonuje operacje w sposób niskopoziomowy (umie dodawać, odejmować i wykonywać wiele innych operacji, nie umie natomiast np. sortować liczb, jeśli programista go tego nie nauczy wink), toteż nie ma tutaj miejsca na zbytnie abstrakcje. Przez to język jest odrobinkę dziwny dla ludzi, którzy myślą bardziej wysokopoziomowo, ale da się go opanować.

W dzisiejszych czasach raczej nie pisze się kodu w języku Asemblera, ale są oczywiście wyjątki - rzeczy specyficzne dla danej architektury można wykonać tylko z poziomu tego języka (no chyba że ktoś udostępni interfejs dla języków wysokiego poziomu smiley), więc np. podczas tworzenia systemu operacyjnego bez choćby wstawek kodu języka asemblera się nie obejdzie.

komentarz 27 października 2017 przez Hiskiel Pasjonat (22,830 p.)
To tak:

1. Do czego mógłby się przydać assembler?

2. Czy normalne języki (c++ itd.) Też tak mogą? xD ("komunikacja" z procesorem)
komentarz 5 stycznia 2018 przez gielo Użytkownik (720 p.)
Assembler przydaje się wszędzie tam gdzie wymagana jest jak największa wydajność

W C++ można korzystać z tzw. wstawek asemblerowych
komentarz 5 stycznia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Nie wiem, może się mylę, ale współczesne kompilatory potrafią generować bardzo wydajne pliki (czasem nawet lepszy niż będzie to w stanie zrobić programista języka asemblera), więc tutaj mógłbym polemizować.

W każdym razie język asemblera będzie konieczny w przypadku programowania czegoś ściśle zależnego od architektury procesora.

Podobne pytania

0 głosów
0 odpowiedzi 211 wizyt
0 głosów
0 odpowiedzi 410 wizyt
pytanie zadane 30 października 2018 w Assembler przez annonymouzinho Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 933 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 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!

...