Guybrush Threepwood Geschrieben 17. Juni 2003 Geschrieben 17. Juni 2003 Hi, ich hab mir bei Programmersheaven den MicroAsm v1.0 runtergeladen und versucht ein Programm von mir zu Compilieren. Dabei hab ich ein paar Sprungadressen in Labels geändert, und zwar so wie in der dzugehörigen Hilfe gezeigt wird. Trotzdem bekomme ich immer den Fehler "Jump out of Range", habt ihr ne Ahnung warum? Hier mal der Code: #make_COM# ; COM file is loaded at CS:0100h ORG 100h MOV AH,01 INT 21 MOV BL,AL MOV AH,07 INT 21 MOV BH,AL CMP BH,0D JNZ label1 //Jump out of Range MOV BH,30 XCHG BL,BH label1: PUSH BX MOV BH,00 MOV AH,03 INT 10 MOV DL,00 MOV AH,02 INT 10 POP BX MOV DL,BL MOV AH,02 INT 21 MOV DL,BH INT 21 MOV DL,2D INT 21 MOV [0300],BL MOV [0302],BH MOV AH,01 INT 21 MOV BL,AL MOV AH,07 INT 21 MOV BH,AL CMP BH,0D JNZ label2 //Jump out of Range MOV BH,30 XCHG BL,BH label2: PUSH BX MOV AH,03 MOV BH,00 INT 10 MOV AH,02 MOV DL,03 INT 10 POP BX MOV DL,BL MOV AH,02 INT 21 MOV DL,BH INT 21 MOV DL,3D INT 21 MOV [0304],BL MOV [0306],BH MOV CL,00 MOV AL,[0306] SUB AL,30 MOV [0308],AL MOV AL,[0302] SUB AL,[0308] CMP AL,30 JNB label3 //Jump out of Range ADD AL,0A MOV CL,01 label3: MOV [0310],AL MOV AL,[0304] SUB AL,30 MOV [0314],AL MOV AL,[0300] SUB AL,[0314] SUB AL,CL MOV [0312],AL MOV DL,[0312] MOV AH,02 INT 21 MOV DL,[0310] INT 21 MOV AH,07 INT 21 INT 20 [/PHP] Gruß Guybrush Zitieren
striper Geschrieben 17. Juni 2003 Geschrieben 17. Juni 2003 hi, du musst einen NEAR jump und keinen SHORT jump verwenden hab dazu was für dich ausgegegraben: any conditional jump (JA, JB, JE, JZ, JS, JP, JCXZ, JC, JO, and their negative equivalents (JNA, JNB, JNAE, JAE, etc.) all have a range of +127 to -128 of the statement itself. This 1-byte offset jump is called a SHORT jump. I don't know which compiler you are using but on the 386 you can use an alternate form called the NEAR conditional jump which has a range of anywhere in the current segment. Usually a JB NEAR <address> should work. well, it does in NASM :-). maybe .386 may work for you. if you can't use that/must write for 80286 and below, you can use a skip construct: JE OutOfRange becomes: JNE Skip1 'the OPPOSITe. JE -> JNE, JC -> JNC, JNA -> JA, etc. JMP OutOfRange .Skip1: because JMP is a NEAR jump (anywhere in the segment). a FAR jump can only be done using JMPs or CALLs (not a conditional jump) and can jump anywhere- includes a segment and an offset. Viel Spass Striper Zitieren
Guybrush Threepwood Geschrieben 17. Juni 2003 Autor Geschrieben 17. Juni 2003 Usually a JB NEAR <address> should work Damit bekomme ich die Meldung "Unbekanntes Label JNZ NEAR label1":confused: Zitieren
striper Geschrieben 17. Juni 2003 Geschrieben 17. Juni 2003 hast du 368+ Instructions eigeschalten? #################################### Short jumps can only jump +-128 bytes. To fix this, use JUMPS or .386 or je Label change to jne There jmp Label There: or if you use ".386" or better, you can also use the "/m#" command line switch to allow multiple passes TASM /m9 File.ASM and TASM will optimize all JMP/Jcc to the smallest opcode possible. #################################### ich quote mich mal selber: Original geschrieben von striper if you can't use that/must write for 80286 and below, you can use a skip construct: JE OutOfRange becomes: JNE Skip1 'the OPPOSITe. JE -> JNE, JC -> JNC, JNA -> JA, etc. JMP OutOfRange .Skip1: Striper dann versuch doch den Skip Striper Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.