Asembler x86/Łączenie z językami wysokiego poziomu/Moduły w języku C: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
DrJolo (dyskusja | edycje)
korekta nazw plików
DrJolo (dyskusja | edycje)
Nie podano opisu zmian
Linia 34:
; zadeklarowaliśmy funkcję w C linkowaną statycznie
; extern unsigned int mystrlen(char *); , zatem:
; [EBP+8] zawiera drugiwskaźnik argumentpierwszego od prawejznaku
; [EBP+4] adres powrotu z funkcji
; [EBP] pierwotna wartość rejestru EBP
Linia 45:
mov ebp,esp ; EBP = ESP (base pointer = stack pointer)
mov esi,[ebp+8] ; ESI wskazuje teraz na pierwszy znak danego ciągu
xor ecx,ecx ; zerowanie rejestru ECX zliczającego znaki w ciąg
xor ecx,ecx
cld ; ustalenie kierunku odczytu znaków dla polecenia LODSB
cld
 
petla:
Linia 53:
lodsb ; do rejestru AL pobierany jest znak [esi]
; indeks ESI zwiększany jest o 1
inc ecx ; po każdym przebiegu ECX = ECX+1
inc ecx
or eax,eax
 
or eax,eax ; jeżeli EAX różne od zera
jnz petla
jnz petla ; skok do "petla"
 
dec ecx ; odjęcie końcowego znaku \0 od wartości zliczonej w ECX
dec ecx
mov eax,ecx ; wynik funkcji umieszczany jest w EAX
 
mov esp,ebp ; niszczymy ramkę stosu, ESP=EBP
pop ebp ; przywracamy pierwotną wartość EBP
ret ; koniec funkcji
</source>
 
Następnie pozostaje jedynie zlikowaćzlinkować statycznie powstałe pliki obiektowe w jeden plik wykonywalny '''str''' korzystając z polecenia:
 
<source lang="bash">