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 : WARTEN

    Ich 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 verwenden 🤡 Wer 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. 😃


Anmelden zum Antworten