Einzelnen Beitrag anzeigen

ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

[MASM] strlen Funktion

  Alt 23. Jan 2009, 21:07
Hallo,

Hoffentlich kennt sich hier wer mit MASM aus

Also ich habe gerade angefangen MASM zu lernen und scheiter daran, eine Funktion zu schreiben,
die wie die strlen in C funktioniert. (Gibt die Anzahl der Bytes von der Startadresse bis zum ersten 0-Byte zurück)

(Ich möchte keine fertige strlen Version, sondern wissen warum meine Version nicht geht)

Also ich habe sogar zwei verschiedene Funktionen. Beide funktionieren manchmal und manchmal nicht (bei beiden
tritt immer der Fehler beim selben Teilstring auf)

...und ich habe keine Ahnung warum


Der Rückgabewert, also die Länge, steht am Ende in cx drin

Version 1:

Code:
STRLEN_DATA_TO_CX macro
   xor cx, cx
   dec ax

@@:
   inc ax
   inc cx
   cmp   DATA[eax], 0
   jnz @B

   dec cx
endm
Version 2:
Code:
STRLEN_DATA_TO_CX macro
   xor cx,cx

   .WHILE DATA[eax] != 0
      inc cx
      inc eax
   .ENDW
endm

Wobei in eax die Startadresse drin steht (immer nach 0501) und DATA so definiert ist:

Code:
DATA db 05,01,"aaa1a",00, 05,01,"a2a",00, 05,01,"3cd",00, 04,01
Ich nehme mal an ich habe hier einen Denkfehler


Falls ihr aus den Codeschnippsel jetzt nicht schlau werdet^^,
hier das ganze Programm (aber ich nehm an der Fehler liegt in den Codeschnippsel)

Code:
;                           ### COMPILER EINSTELLUNGEN ###
.386
.model flat,stdcall
option casemap:none
;                           ### BENÖTIGTE INCLUDES ###
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\gdi32.inc
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\gdi32.lib

INC_DATA_POINTER macro _add
   xor eax,eax
   add DATA_POINTER, _add
   mov ax,DATA_POINTER
endm

;STRLEN_DATA_TO_CX macro
;   xor cx, cx
;   dec ax

;@@:
;   inc ax
;   inc cx
;   cmp   DATA[eax], 0
;   jnz @B

;   dec cx
;endm

STRLEN_DATA_TO_CX macro
   xor cx,cx

   .WHILE DATA[eax] != 0
      inc cx
      inc eax
   .ENDW
endm

.data

DATA_POINTER dw 0                            ; Speichert die aktuelle Position im DATA String
Error db "Es ist leider ein interner Fehler aufgetreten :-(",10,10,0
AppNameDefault db "FD3",0

; ### ZUM TESTEN ###
DATA db 05,01,"aaa1a",00, 05,01,"a2a",00, 05,01,"3cd",00, 04,01

.code
START:
   .WHILE TRUE
                ; Lösche EAX und Speicher den aktuellen Wert des DATA_Pointer
                xor eax, eax
                mov ax, DATA_POINTER

                ; ##########
                ; REGISTER 1
                .IF DATA[eax] == 4

                    INC_DATA_POINTER 1

                    ;4/1
                    .IF DATA[eax] == 1
                        invoke ExitProcess,0
                    .ENDIF

                ; ##########
                ; REGISTER 5
                .ELSEIF DATA[eax] == 5
                    INC_DATA_POINTER 1

                    ;5/1
                    .IF DATA[eax] == 1
                        INC_DATA_POINTER 1
                        invoke MessageBox, 0, ADDR DATA[eax], ADDR AppNameDefault, MB_OK
                        STRLEN_DATA_TO_CX
                        INC_DATA_POINTER cx
                    .ENDIF

                ; #####
                ; ERROR
                .ELSE
                    invoke MessageBox, 0, ADDR Error, ADDR AppNameDefault, MB_OK
                    invoke ExitProcess, 0
                .ENDIF
   .ENDW

   invoke ExitProcess,0

END START
Das Programm soll nichts anderes tun als drei Message Boxes auszugeben mit dem Inhalt:
aaa1a
a2a
3cd

und sich dann beenden.

Die ersten zwei Messages Boxes werden ausgegeben, bei der dritten gibt auf einmal STRLEN einen falschen wert zurück !?

(Nich über das Programm wundern, lern grad erst ASM und schreib irgendwas zum ausprobieren^^)


vielen dank falls sich wer die Zeit nimmt mir weiter zu helfen,


Lg,
Ferby
  Mit Zitat antworten Zitat