NEAR-Procedur will nicht so wie ich will
-
Hallo!
.MODEL SMALL .STACK 256 .CODE START: ;Paar Mnemonics CALL WARTEN WARTEN PROC NEAR ;Paar Mnemonics WARTEN ENDP END SRART
Folgendes Problem: Wenn ich zwischen CALL WARTEN und der Definition von WARTEN eine Sprungmarke setze, quittiert mir das mein Assembler mit "error A2006: undefined symbol: WARTEN. Stehen an der besagten Stelle nur irgendwelche Mnemonics, etwa MOV oder SUB etc. dann läuft alles einwandfrei.
In meinem Buch ist für einen NEAR-CALL die einzige Einschränkung damit beschrieben, dass die Prozedur sich im selben Segment befinden muss.
Weiß einer Rat?
-
Ich würde gerne helfen. Wie assemblierst Du diese Datei und mit welchem Assembler (Makefile o.ä)? Mit welchen Parameters usw.? Kann man den Assembler, den Du verwendest, irgendwo runterladen?
-
abc.w schrieb:
Ich würde gerne helfen. Wie assemblierst Du diese Datei und mit welchem Assembler (Makefile o.ä)? Mit welchen Parameters usw.? Kann man den Assembler, den Du verwendest, irgendwo runterladen?
So wie ich das sehe, handelt es sich wohl um MS Macro Assembler Ver. 6.0.
Jedenfalls habe ich ihn von der CD, die dem Buch beiliegt. Wenn nötig, kann ichs auch hochladen.
Assembliert wird mit "ml name.asm".
Hier noch mein Programm:.MODEL SMALL .CODE START: MOV DL,00H M1: MOV AH,02H INT 21H INC DL JMP DL,0FFH JE ENDE CALL WARTEN JMP M1 WARTEN PROC NEAR MOV BX,0F00H M2: MOV CX,0FFFFH M3: DEC CX JNZ M3 DEC BX JNZ M2 JMP M1 WARTEN ENDP ENDE: MOV AH,4CH INT 21H END START
Wenn ich "ENDE:" vor die Definition von "WARTEN" setze, tritt der besagte Fehler auf.
-
Ups, statt "JMP DL,0FFH" muss da natürlich "CMP DL,0FFH" stehen.
-
Hallo,
habe dein Problem nachvollzogen, bekomme folgende Fehlermeldung:
Assembling: main.asm
main.asm(10) : error A2006: undefined symbol : WARTENIch kenne mich dem MASM nicht aus, aber ich vermute folgendes: sobald der Assembler "END START" erreicht, ist das Symbol WARTEN nicht mehr "near" oder nicht mehr im selben "scope" oder "Segment" oder was auch immer...
Und so geht es:.MODEL SMALL .CODE START: MOV DL, 00H M1: MOV AH, 02H INT 21H INC DL CMP DL, 0FFH JE ENDE CALL WARTEN JMP M1 ENDE: MOV AH,4CH INT 21H WARTEN PROC NEAR MOV BX,0F00H M2: MOV CX,0FFFFH M3: DEC CX JNZ M3 DEC BX JNZ M2 JMP M1 WARTEN ENDP END START
D.h. "END START" am Ende der Datei und nicht irgendwo in der Mitte...
Version von ml bei mir ist 6.14.8444 und die von link16 ist 5.60.339, Dec 5 1994 (inzwischen 15 Jahre alt!). Würde dir an dieser Stelle empfehlen, zeitgemäße Werkzeuge wie GNU Assembler, binutils und GCC zu verwendenWer programmiert denn heutzutage auf dem PC noch 16 Bit Code
-
abc.w schrieb:
Wer programmiert denn heutzutage auf dem PC noch 16 Bit Code
Mein Prof.
Aber ich werd nicht nein sagen, wenn du mir ein Lehrbuch für 32Bit - Pentium empfehlen möchtest.