Asembler x86/Łączenie z językami wysokiego poziomu/Moduły w języku C: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
zapobieganie przed przepełnieniem bufora |
użycie asemblera gnu |
||
Linia 2:
// zawartość pliku str.c
#include <stdio.h>
extern unsigned int mystrlen (char
int main()
{
char
printf("Wprowadź dowolny ciąg znaków..\n");
scanf("%31s",
printf("Wprowadzony ciąg zawiera %d znaków.\n",mystrlen(
return 0;
}
Linia 24:
<source lang="bash">
</source>
Linia 30:
<source lang="asm">
; zadeklarowaliśmy funkcję w C linkowaną statycznie▼
; extern unsigned int mystrlen(char *); , zatem:▼
; [EBP+8] zawiera wskaźnik pierwszego znaku▼
; [EBP+4] adres powrotu z funkcji▼
; [EBP] pierwotna wartość rejestru EBP▼
global mystrlen▼
*/
.text
▲.global mystrlen
mystrlen:
xor %ecx,%ecx ; zerowanie rejestru ECX zliczającego znaki w ciąg
cld ; ustalenie kierunku odczytu znaków dla polecenia LODSB
petla:
xor %eax,%eax ; zerujemy EAX zanim pobierzemy kolejny znak
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
ret ; koniec funkcji
</source>
|