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

Usunięta treść Dodana treść
printf -> puts
błąd przy arytmetyce adresów, nie stawia się tutaj znaku $
Linia 28:
zadeklarowaliśmy funkcję w C linkowaną statycznie
extern unsigned int mystrlen(const char*); , zatem:
$8(%EBP) zawiera wskaźnik pierwszego znaku
$4(%EBP) adres powrotu z funkcji
%EBP pierwotnapierwotną wartość rejestru EBP
*/
 
Linia 37:
 
mystrlen:
pushl %ebp ;# tworzymy ramkę stosu
movl %esp,%ebp ;# EBP = ESP (base pointer = stack pointer)
movb $8(%ebp), %esi ;# ESI wskazuje teraz na pierwszy znak danego ciągu
xorl %ecx,%ecx ;# zerowanie rejestru ECX zliczającego znaki w ciąg
cld ;# ustalenie kierunku odczytu znaków dla polecenia LODSB
 
petla:
xorl %eax,%eax ;# zerujemy EAX zanim pobierzemy kolejny znak
lodsbblodsb ; # do rejestru AL pobierany jest znak [esi]
; # indeks ESI zwiększany jest o 1
incl %ecx ; # po każdym przebiegu ECX = ECX+1
 
orl %eax,%eax ;# jeżeli EAX różne od zera
jnz petla ; # skok do "petla"
 
decl %ecx ;# odjęcie końcowego znaku $ od wartości zliczonej w ECX
movl %ecx,%eax ; # wynik funkcji umieszczany jest w EAX
 
movl %ebp,%esp ; # niszczymy ramkę stosu, ESP=EBP
popl %ebp ; # przywracamy pierwotną wartość EBP
ret ; # koniec funkcji
</source>