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