Asembler x86/Łączenie z językami wysokiego poziomu/Moduły w języku C: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
korekta nazw plików |
Nie podano opisu zmian |
||
Linia 34:
; zadeklarowaliśmy funkcję w C linkowaną statycznie
; extern unsigned int mystrlen(char *); , zatem:
; [EBP+8] zawiera
; [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
cld ; ustalenie kierunku odczytu znaków dla polecenia LODSB
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
or eax,eax ; jeżeli EAX różne od zera
jnz petla ; skok do "petla"
dec ecx ; odjęcie końcowego znaku \0 od wartości zliczonej w 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
<source lang="bash">
|