Tasm Probleme

cooldown

New member
Hallo liebe HaBo-Community,

Ich weiß nicht, wie es bei euch aussieht und ob mir hier jemand helfen kann, aber momentan bin ich am Erlernen von Assembler auf Windows und habe mir diverse Bücher geholt, die so anfängerfreundlich sind wie die Sonne kalt.

Ich bin dann auf dieses Forum gestoßen und ich glaube, dass dieses Forum genau das Wissen beherbergt, das mir eventuell helfen könnte. (Ich wäre euch äußerst dankbar :) )


Ich habe momentan das Buch "Assembler - Grundlagen der PC-Programmierung" von E.-W. Dieterich in der Hand. Die Webseiten, an denen man die benötigten Daten für die Abarbeitung des Buches braucht, sind leider down. Naja, man braucht sie nicht wirklich, aber das Buch arbeitet sehr viel mit eigenen Makros und diese sind in einer Datei abgespeichert.
Code:
%pushlctl
%nolist
%noCref
%NoSyms
;;--------------------
SReg	macro	regs
irp	reg,<regs>
push	reg
endm
ENDM
;;--------------------
RReg	macro	regs
irp	reg,<regs>
pop	reg
endm
ENDM
;;-------------------
;;HILFSDATEN
	.DATA
_puffer	db	256	dup	(0)
_gr	dw	255
	.CODE
;;-------------------
ReadS	macro	StringOfs,Elnge,ALnge
	Local	weiter
;;-------------------
		SREG	<ax,bx,cx,dx,es,si,di>
	IFNB	<ELnge>
		mov	ax,ELnge
		mov	_gr,ax
	ELSE
		mov	_gr,255
	ENDIF
		mov	bx,0			;;handle für Standardeingabe
		mov	cx,255			;;Anzahl zu lesender Bytes
		mov	dx,Offset _puffer	;;Lesen in Puffer
		mov	ah, 03Fh		;;Lesen aus einer Datei
		int	21h
	

		dec	ax			;;Carriage Return/Line feed
		dec	ax			;; gleich abziehen
		cmp	ax,_gr			;;Vergl. mit gelesenen Zeichen
		jle	weiter			;;falls ok, dann weiter
		mov	ax,_gr			;;sonst: auf Elnge abschneiden
		mov	di,_gr
		mov	_puffer[di],0
	
weiter:

	IFNB	<ALnge>				;;falls ALnge angegeben,
		mov	ALnge,ax		;;gelesene Länge zurückgeben
	ENDIF
		mov	cx,ax			;;Vorbereitung für Kopie
		inc	ax			;;des Strings aus Hilfspuffer
		cld				;;in angegebenen Speicherbereich
		mov	ax,ds
		mov	es,ax
		mov	si, Offset _puffer
		mov	di, Offset StringOfs
		rep	movsb			;; kopieren des Hilfspuffers
		RREG	<di,si,es,dx,cx,bx,ax>
		endm
;;------------------------------------------------------------------------------

readZ	macro	Zahl

	
		readS	_puffer,8, _gr
		dedu	Zahl, _puffer, _gr
		ENDM


;;----------------------------------------

laenge	macro	Text
		Local	SuchSchleife, gefunden, M_Ende
		SReg	<bx,cx,dx,es,di>
		mov	ax,ds
		mov	es,ax			;;es auf .DATA
		mov	di,Text
		mov	bx,di
		xor	al,al			;;Null-Byte Suchen
		mov	cx,256
		cld

Suchschleife:
		scasb				;;Suche nach NUL
		je	gefunden
		loop	Suchschleife
		;;nicht gefunden?
		mov	ax,-1			;;Fehlerwert nach ax
		jmp	M_Ende

gefunden:
		dec	di			;;wegen Zeigervorlaufs
		mov	ax,di
		sub	ax,bx			;;Längenberechnung in Byte
		
M_Ende:		RReg	<di,es,dx,cx,bx>
		ENDM
;;-------------------------------------------
write	macro	Text,Ausgabe
;;-------------------------------------------
		SReg	<ax,bx,cx,dx>
		ifb	<Text>
		%out	>>	WRITE:	1. Parameter fehlt
		.err
		endif
		

	IFB	<Ausgabe>
			mov	bx,1
	ELSE
		ifdif	<Ausgabe>,<bx>
			mov	bx,Ausgabe	;;PRN für Drucker
		endif
	ENDIF
		Laenge	<Text>
			mov	cx,ax		;;Laenge in cx
		ifdif	<Text>,<dx>
			mov	dx,Text		;;Stringadresse in dx
		endif
			mov	ah,40h		;;Ausgabe auf Datei
			int 21h
		RReg	<dx,cx,bx,ax>
		ENDM
;;----------------------------
		

writeZ	macro	Zahl, Lnge, Ausgabe

			push	di
	IFB	<Lnge>
			dude	Zahl, _puffer,8			;;zahl nach Ascii wandeln
			mov	di, 8
	ELSE
			dude	Zahl, _puffer, Lnge
			mov	di,Lnge
	ENDIF
			mov	_puffer[di],0			;;Stringende
			write	<Offset _puffer>
			pop	di
	ENDM
;;----------------------------

writeS	macro	Text, Ausgabe
	write	<Offset Text>,Ausgabe
	ENDM

;;----------------------------
print	macro	Text, Ausgabe
	
	local	db	_T

	.DATA

_T	Text, 0
	.CODE
			write	<Offset _T>, Ausgabe
	ENDM



println		macro	Text, Ausgabe
	local _T
.DATA
_T	label byte
	ifnb	<Text>
		db	Text
	endif
		db	10,13,0
		.CODE
	write	<Offset _T>,Ausgabe
	ENDM

nl	macro
		SReg	<ax,dx>
		mov	ah,2		;;char direkt ausgeben
		mov	dl, 10		;;line feed
		int 21h
	
		mov dl,13		;;carriage return
		int 21h
		RReg	<dx,ax>
		ENDM

		.DATA
RandSeed	dw	1h		;;Startwert für Random-Generator
randomize	macro

		SReg	<ax,cx,dx>
		mov	ah,2ch
		int 21h

		mov	RandSeed,dx
		RReg	<dx,cx,ax>
		ENDM



random	macro	von, bis

		local alles


		SReg	<ax,bx,cx>
		mov	ax, RandSeed
		mov	bx,32719
		mul	bx
		add	ax,3
		mov	bx,32749
		div	bx
		mov	RandSeed,dx
		xor	ax,ax
		div	bx

		mov	bx,bis
		sub	bx,von
		inc	bx
		jz	alles
		xor	dx,dx
		div	bx
		add	dx,von
alles:		RReg	<cx.bx.ax>
		ENDM



exec	macro	procedure,parameterliste


		irp	param,<parameterliste>
		mov	ax,param
		push	ax
		endm
		call	procedure
		endm


dude	macro	INT, ZAHLSTR,ANZ

		ifb	<INT>
			%out	">> dude: 1. Parameter fehlt!"
			.err
		endif
		ifb	<ZAHLSTR>
			%out	">> dude: 2. Parameter fehlt!"
			.err
		endif
		
		
		SReg	<ax,bx,cx,dx,si>
		mov	ax,INT
		mov	bx,OFFSET ZAHLSTR
		
		ifnb	<ANZ>
			mov	cx,ANZ-1
		else
			mov	cx,7
		endif
		
		add	bx,cx
		call	_text:dude_p
		RReg	<si,dx,cx,bx,ax>
		ENDM



		.CODE
			locals

	dude_p	proc	near

		.DATA

	@@vz	db	?
		.CODE
	
		mov	dl, ' '
		mov	@@vz, dl
		cmp	ax, 0
		jns	@@pos
		mov	dl,'-'
		mov	@@vz,dl
		neg	ax
@@pos:		mov	si,10
		sub	dx,dx
		div	si
		add	dl,'0'
		mov	[bx],dl
		dec	bx
		dec	cx
		js	DudeAbr
		jz	DudeAbr

Umwand:		sub	dx,dx
		div	si
		cmp	ax,0
		jnz	Stelle
		cmp	dx,0
		jnz	Stelle
		mov	dl, ' '
		jmp	Ausgabe

Stelle:		add	dl, '0'
Ausgabe:	mov	[bx],dl
		dec	bx
		loop	Umwand
		mov	dl,@@vz
		mov	[bx],dl
		ret

DudeAbr:	mov	dx, offset Fehlermeldung
		mov	ah,09h
		int 21h
		ret
		.data
Fehlermeldung	db	10,13,"---->>>>",7,7
		db	"LAUFZEIT-FEHLER beim Zahlenwandeln",10,13
		db	"Wahrscheinlich Längen-Parameter"
		db	" zu klein bei "
		db	"DUDE- oder writeZ-Aufruf !!! "
		db	7,7,7,10,13,"$"
		.code
dude_p endp

dedu	macro	NUMERIC, STRING; SIZE
	local	NeuesZeichen, Weiterschalten
	local	Positiv,Vz,Weiter,Ende

vz	dw	+1
	.CODE


	ifb	<NUMERIC>
		%out	">> dude: 1. Parameter fehlt!"
		.err
	endif
	ifb	<STRING>
		%out	">>dedu: ". Parameter fehlt!"
		.err
	endif
		SReg	<ax,bx,cx,dx,di>
		mov	vz, +1
		xor	ax,ax
		mov	di,10

	ifb	<SIZE>
		mov	cx,8
	else
		mov	cx,SIZE
	endif
		xor	si,si

NeuesZeichen:
	mov	bl,[si+STRING]
	cmp	bl,0
	je	Ende
	mul	di
	cmp	bl,'-'
	jne	Weiter
	mov	[vz],-1
	jmp	Weiterschalten
Weiter:
	cmp	bl,'0'
	jl	Weiterschalten
	cmp	bl,'9'
	jg	Weiterschalten
	and	bx,15
	add	ax,bx

Weiterschalten:
	inc	si
	loop	NeuesZeichen
	
Ende:
	cmp	vz,-1
	jne	Positiv
	neg	ax
Positiv:
	if	((.type Numeric) and 16) gt 0
		mov vz,ax
	else
		mov	Numeric,ax
	endif
		RReg	<di,dx,cx,bx,ax>
	if	((.type Numeric) and 16) gt 0
		mov	Numeric, vz
	endif
ENDM



%poplctl
%nomacs
Ich habe mir die Mühe gemacht, diese aus den letzten Seiten abzuschreiben und wollte gleich anfangen weiter zu lernen. Nun kommt es bei mir jetzt zu Problemen:

Als ich folgenden Code ausführen wollte:(Ich habe diesen genommen, da er bei mir eigentlich die eindeutigsten Fehlermeldungen hinterlässt)
Code:
DOSSEG
.MODEL	SMALL
.STACK	100H
include	macros.mac
.CODE
begin:
	mov	ax,@Data
	mov	ds,ax
	print	"Diese Datei heisst "
	print	??FileName
	print	" und wurde am "
	print	??Date
	print	" um "
	print	??Time
	println	" übersetzt."
	mov	ax,4c00h
	int	21h
end begin
Bekam ich folgende Fehlermeldungen:
Unbenannt.PNG - directupload.net

Die Liste ist hier:

Code:
Turbo Assembler	 Version 3.0	    08/05/15 00:36:21	    Page 1
try.asm



      1				     DOSSEG
      2	0000			     .MODEL  SMALL
      3	0000			     .STACK  100H
      4				     include macros.mac
1     5
1     6
1     7
1     8
1     9
1    10
1    11
1    12
1    13
1    14
1    15
1    16
1    17
1    18
1    19
1    20
1    21
1    22
1    23
1    24
1    25
1    26
1    27
1    28
1    29
1    30
1    31
1    32
1    33
1    34
1    35
     36	004F			     .CODE
     37	004F			     begin:
     38	004F  B8 0000s			     mov     ax,@Data
     39	0052  8E D8			     mov     ds,ax
     40					     print   "Diese Datei heisst "
     41					     print   ??FileName
     42					     print   " und wurde am "
     43					     print   ??Date
     44					     print   " um "
     45					     print   ??Time
     46					     println " übersetzt."
     47	01FF  B8 4C00			     mov     ax,4c00h
     48	0202  CD 21			     int     21h
     49				     end begin
Turbo Assembler	 Version 3.0	    08/05/15 00:36:21	    Page 2
Symbol Table




Symbol Name			  Type	 Value

??0000				  Near	 _TEXT:006F
??0001				  Near	 _TEXT:007A
??0002				  Near	 _TEXT:007F
??0003				  Near	 _TEXT:00AC
??0004				  Near	 _TEXT:00B7
??0005				  Near	 _TEXT:00BC
??0006				  Near	 _TEXT:00E9
??0007				  Near	 _TEXT:00F4
??0008				  Near	 _TEXT:00F9
??0009				  Near	 _TEXT:0126
??000A				  Near	 _TEXT:0131
??000B				  Near	 _TEXT:0136
??000C				  Near	 _TEXT:0163
??000D				  Near	 _TEXT:016E
??000E				  Near	 _TEXT:0173
??000F				  Near	 _TEXT:01A0
??0010				  Near	 _TEXT:01AB
??0011				  Near	 _TEXT:01B0
??0012				  Byte	 DGROUP:01C8
??0013				  Near	 _TEXT:01DD
??0014				  Near	 _TEXT:01E8
??0015				  Near	 _TEXT:01ED
??DATE				  Text	 "08/05/15"
??FILENAME			  Text	 "try	  "
??TIME				  Text	 "00:36:21"
??VERSION			  Number 0300
@32BIT				  Text	 0
@@POS				  Near	 _TEXT:0013
@@VZ				  Byte	 DGROUP:0104
@CODE				  Text	 _TEXT
@CODESIZE			  Text	 0
@CPU				  Text	 0101H
@CURSEG				  Text	 _TEXT
@DATA				  Text	 DGROUP
@DATASIZE			  Text	 0
@FILENAME			  Text	 TRY
@INTERFACE			  Text	 00H
@MODEL				  Text	 2
@STACK				  Text	 DGROUP
@WORDSIZE			  Text	 2
AUSGABE				  Near	 _TEXT:003B
BEGIN				  Near	 _TEXT:004F
DUDEABR				  Near	 _TEXT:0047
DUDE_P				  Near	 _TEXT:0000
FEHLERMELDUNG			  Byte	 DGROUP:0105
RANDSEED			  Word	 DGROUP:0102
STELLE				  Near	 _TEXT:0038
UMWAND				  Near	 _TEXT:0025
_GR				  Word	 DGROUP:0100
_PUFFER				  Byte	 DGROUP:0000
_T				  Number [DGROUP:BP-0002]
Turbo Assembler	 Version 3.0	    08/05/15 00:36:21	    Page 3
Symbol Table




Macro Name

DEDU
DUDE
EXEC
LAENGE
NL
PRINT
PRINTLN
RANDOM
RANDOMIZE
READS
READZ
RREG
SREG
WRITE
WRITES
WRITEZ

Groups & Segments		  Bit Size Align  Combine Class

DGROUP				  Group
  STACK				  16  0100 Para	  Stack	  STACK
  _DATA				  16  01D6 Word	  Public  DATA
_TEXT				  16  0204 Word	  Public  CODE
Turbo Assembler	 Version 3.0	    08/05/15 00:36:21	    Page 4
Error Summary



**Error** try.asm(9) PRINT(6) Symbol already different kind: _T
**Error** try.asm(10) PRINT(6) Symbol already different	kind: _T
**Error** try.asm(11) PRINT(6) Symbol already different	kind: _T
**Error** try.asm(12) PRINT(6) Symbol already different	kind: _T
**Error** try.asm(13) PRINT(6) Symbol already different	kind: _T
**Error** try.asm(14) PRINT(6) Symbol already different	kind: _T

Ich verzweifle langsam xD

Ich weiß, dass es nach viel aussieht, aber vielleicht findet sich ein nettes und geübtes Auge, dem mein Problem sofort auffällt. Ich bin ein absoluter Neuling und würde sowas ungern aufgeben, nur weil es hier scheitert. Ich weiß sonst nicht, wohin damit.

Ich danke euch im Voraus!
 

Willi007

New member
Hallo Cooldown,
du hast zwei Stelle bei macro print falsch abgeschrieben :
Falsch:
print macro Text, Ausgabe

local db _T // ohne db

.DATA

_T Text, 0 // Zwischen _T und Text, 0 mit db
.CODE
write <Offset _T>, Ausgabe
ENDM

richtig:
;;----------------------------
print macro Text, Ausgabe
local _T
;; ----------------------------
.DATA
_T db text,0
.CODE
write <Offset _T>, Ausgabe
ENDM
;; -----------------------------

MfG
Willi
 

Kenny-f-Powers

New member
Boa,
Vielen vielen Dank aus dem Jahre 2020 euch beiden, ich habe mir das Buch gekauft und nach einer Seite abtippen wollte es auf einmal fliegen lernen. jetzt bleibt es ganz und ich bin Happy...alternativ wollte ich den Herrn Dieterich mal anrufen :D
 
Oben