;Datei: strcmpn.asm ;enthält Funktion strcmpnew ; ;Compilierung mit ; tasm /ml strcmpn ;oder ; tasm /ml /zi strcmpn ; ;/ml ist wichtig, damit die Schreibweise der Funktionen exakt beibehalten wird ;(C/C++ ist case-sensitive) ; ;/zi erzeugt Debuginformation mit Zeilennummern (für Debug-Versionen von Programmen) ; .386 code segment byte public 'CODE' use32 public _strcmpnew assume cs:code _strcmpnew proc near ;nach C-Konvention muß der Funktionsname mit einem Unterstrich beginnen ; ;Prototyp in C: ;extern "C" int strcmpnew(const char *str1, const char *str2) ; ;Funktions-Code push esi ;Register esi und push edi ; edi müssen in Visual C++ gerettet werden pushfd ;EFlags sichern, da Direction-Flag verändert wird ;auf dem Stack befinden sich jetzt: ; [esp+20] dword-near-Zeiger auf str2 ; [esp+16] dword-near-Zeiger auf str1 ; [esp+12] near-Rücksprungadresse ; [esp+ 8] gerettetes esi ; [esp+ 4] gerettetes edi ; [esp] gerettete EFlags ;für Zugriff auf die übergebenen Zeiger: _str2 equ [esp+20] _str1 equ [esp+16] cld ;Blocktransportrichtung: inkrementell mov esi,_str1 ;Offset str1 -> esi mov edi,_str2 ;Offset str2 -> edi mov ax,ds mov es,ax ;es mit ds initialisieren (für scas-Befehl) cmploop: lods byte ptr [esi] ;Byte von String 1 nach al laden scas byte ptr [edi] ;Vgl. mit Byte von String 2 jne short Diff ;ungleich ? cmp al,0 ;Stringende ? jnz cmploop ;wenn nicht, dann nächstes Zeichen Equal: xor eax,eax ;str1 = str2 -> 0 zurückgeben jmp short _End ;fertig Diff: ja short Str2LessStr1 ;Flags von cmp sind immer noch gültig mov eax,-1 ;str1 < str2 -> -1 zurückgeben jmp short _End ;fertig Str2LessStr1: mov eax,1 ;str2 < str1 -> +1 zurückgeben _End: popfd ;EFlags wiederherstellen pop edi ;edi und pop esi ; esi wiederherstellen ret ;Stack wird vom Aufrufer "aufgeräumt" _strcmpnew endp code ends end