Witam. Jakiś czas temu rozpoczęliśmy na studiach naukę asemblera i zostaliśmy rzuceni z marszu na głęboką wodę. Nie jestem zwolennikiem nauki przez analizę cudzego kodu, wolę krok po kroku sprawdzić treści w książce, ale tym razem niestety nie mam wyboru - goni mnie czas.
Poniżej przedstawię kawałek kodu pod linuxa w formacie NASM. Bardzo prosiłbym o pomoc w analizie wybranych przeze mnie fragmentów.
section. text
global _start
_start:
mov eax, 3
mov ebx, 0
mov ecx, tekst
mov edx, [dlugosc]
int 80h
xor ecx, ecx ; dlaczego ecx i ebx są zerowane w miejscu, kiedy linijkę wcześniej wprowadzaliśmy do nich podstawowe wartości? czy to nie powinno spowodować błędów w kompilacji?
xor ebx, ebx
_add:
inc ebx ; nawet, jeśli nie podalibyśmy żadnej litery a, program powinien wejść do tego miejsca i zinkrementować ebx. Czy nie będzie w takim razie w przekroju całego programu o jedną literę a za dużo, czy popełniam gdzieś błąd myślowy?
_petla:
mov sil, [tekst+ecx]
inc ecx
cmp sil, 97
je _add
cmp ecx, 19 ; największa czarna magia dla mnie - 19 to komenda XOFF, mająca pauzować transmisję. Jakie ma to powiązania z instrukcją porównania?
jne _petla
_end:
add ebx, 47 ; co to ma wywołać? 47 to w kodzie ASCII zwykły slash, jaki ma cel sumowanie tego z zawartością rejestru bazowego?
mov [tekst],ebx
mov eax, 4
mov ebx, 1
mov ecx, tekst
mov edx, 1
int 80h
mov eax, 1
int 80h
section .data
tekst TIMES 20 db 0 ; dlaczego zmienna tekst jest deklarowana jako dwudziestokrotne zero?
dlugosc dd $-tekst ; prosiłbym jeszcze o wyjaśnienie zapisu $-tekst
To wszystko. Program niemal w całości jest dla mnie niezrozumiały, więc jeśli ktoś byłby w stanie, oprócz odpowiedzi na moje pytania, krok po kroku przedstawić działanie kodu, byłbym bardzo wdzięczny. Pozdrawiam.