Post by p***@web.de_________________________
.model tiny
.code
org 100h
mov word ptr [offset xyz],cs
lea bx, hallo
lea dx, xy
mov ah, 4bh
xor al,al
int 21
hallo dw 0
dw [offset cmd]
xyz dw,?
dw -1,-1
dw -1,-1
cmd db 03," /?",13
xy db "C:\asm\tasm.exe",0
end start
______________________________
Assembliert habe ich das ganze mit "tasm", gelinkt mit "tlink /t" und
ausgeführt unter Freedos. Herausgekommen ist folgendes: "Invalid
opcode at 0118 027a 0246 0000....
Weiss jemand, wo der Fehler liegt?
Was soll dein Program nach dem int21 auch machen, es führt
den dahinter liegenden Datenbereich als Befehle aus. Kein
Wunder, daß das zu einem "Invalid opcode" führt.
Ein anderes Problem ist, daß das laufende com Programm den
gesamten Speicher (bzw. den größten freien Speicherblock)
zugewiesen bekommt. Wenn du den nicht benötigten Bereich
nicht wieder frei gibst, dürfte kaum genügend freier Speicher
vorhanden sein um ein externes Program auszuführen. Willst
du die Funktuion 4b nur mal ausprobieren oder willst du sie
tatsächlich benutzen um TASM zu starten. Im zweiten Fall
soltest du überlegen, ob nicht eine batch Datei wesentlich
einfacher wäre.
Ich hab die Fkt. 4b nur einmal benutzt als es um die Frage
ging, ob man von einem DOS com Program eine Windows Messagebox
aufrufen kann. Ich habe dazu aus dem com Programm heraus ein
Windows exe Programm geschrieben und dies dann mit 4b/int21
gestartet und anschließend wieder gelöscht:
@=$100
00000000: 00000100: b4 3c move.b #$3c,m0
00000002: 00000102: 31 c9 eor.w r2,r2
00000004: 00000104: ba 01aa move.w #fname,r1
00000007: 00000107: cd 21 trap #$21 ; Datei oeffnen (___.com)
00000009: 00000109: 72 56 bcs.b _110
0000000b: 0000010b: 89 c3 move.w r0,r3
0000000d: 0000010d: fc bclr.w #10,sr
0000000e: 0000010e: be 01c5 move.w #buf2,r5
00000011: 00000111: bf 0341 move.w #buf1,r6
00000014: 00000114: ac _10: move.b (r5.w)+-,r0
00000015: 00000115: 38 06 01c0 cmp.b r0,esc0
00000019: 00000119: 75 47 bne.b _20
0000001b: 0000011b: a4 move.b (r5.w)+-,(r6.w)+-{s1}
0000001c: 0000011c: 81 fe 0341 _100: cmp.w #buf1,r5
00000020: 00000120: 72 f2 blo.b _10
00000022: 00000122: b4 40 move.b #$40,m0
00000024: 00000124: ba 0341 move.w #buf1,r1
00000027: 00000127: 89 f9 move.w r6,r2
00000029: 00000129: 29 d1 sub.w r1,r2
0000002b: 0000012b: cd 21 trap #$21
0000002d: 0000012d: b4 3e move.b #$3e,m0
0000002f: 0000012f: cd 21 trap #$21
00000031: 00000131: b8 4a00 move.w #$4a00,r0 ; Speicher nach 64k freigeben
00000034: 00000134: bb 1000 move.w #$1000,r3
00000037: 00000137: cd 21 trap #$21
00000039: 00000139: b4 09 move.b #$09,m0 ; text ausgeben
0000003b: 0000013b: ba 0196 move.w #text,r1
0000003e: 0000013e: cd 21 trap #$21
00000040: 00000140: 8c d8 move.w s0,r0
00000042: 00000142: a3 01b6 move.w r0,p_seg
00000045: 00000145: a3 01ba move.w r0,p_f1
00000048: 00000148: a3 01be move.w r0,p_f2
0000004b: 0000014b: b8 4b00 move.w #$4b00,r0
0000004e: 0000014e: bb 01b2 move.w #par,r3
00000051: 00000151: ba 01aa move.w #fname,r1
00000054: 00000154: 1e move.w s0,-(sp)
00000055: 00000155: cd 21 trap #$21 ; ___.com starten
00000057: 00000157: 1f move.w (sp)+,s0
00000058: 00000158: b4 41 _120: move.b #$41,m0 ; ___.com loeschen
0000005a: 0000015a: ba 01aa move.w #fname,r1
0000005d: 0000015d: cd 21 trap #$21
0000005f: 0000015f: 72 f7 bcs.b _120 ; funktioniert erst, wenn ___.com beendet ist
00000061: 00000161: c3 _110: rts.w
00000062: 00000162: 3a 06 01c1 _20: cmp.b esc1,r0
00000066: 00000166: 75 05 bne.b _30
00000068: 00000168: 31 c0 eor.w r0,r0
0000006a: 0000016a: ab move.w r0,(r6.w)+-{s1}
0000006b: 0000016b: eb af br.b _100
0000006d: 0000016d: 3a 06 01c2 _30: cmp.b esc2,r0
00000071: 00000171: 75 06 bne.b _40
00000073: 00000173: 31 c0 eor.w r0,r0
00000075: 00000175: ab move.w r0,(r6.w)+-{s1}
00000076: 00000176: aa _31: move.b r0,(r6.w)+-{s1}
00000077: 00000177: eb a3 br.b _100
00000079: 00000179: 3a 06 01c3 _40: cmp.b esc3,r0
0000007d: 0000017d: 75 06 bne.b _50
0000007f: 0000017f: 31 c0 eor.w r0,r0
00000081: 00000181: ab move.w r0,(r6.w)+-{s1}
00000082: 00000182: ab move.w r0,(r6.w)+-{s1}
00000083: 00000183: eb 97 br.b _100
00000085: 00000185: 3a 06 01c4 _50: cmp.b esc4,r0
00000089: 00000189: 75 eb bne.b _31
0000008b: 0000018b: ac move.b (r5.w)+-,r0
0000008c: 0000018c: 0f b6 c8 movu.bw r0,r2
0000008f: 0000018f: 41 inc.w r2
00000090: 00000190: 31 c0 eor.w r0,r0
00000092: 00000192: f3 aa rep_r2 move.b r0,(r6.w)+-{s1}
00000094: 00000194: eb 86 br.b _100
00000096: 00000196: 63 6c 69 63 6b 20
0000009c: 0000019c: 74 68 65 20 6f 4b
000000a2: 000001a2: 20 62 75 74 74 6f
000000a8: 000001a8: 6e 24 text: dc.b "click the oK button$"
000000aa: 000001aa: 5f 5f 5f 2e 63 6f
000000b0: 000001b0: 6d 00 fname: dc.b "___.com",0
000000b2: 000001b2: 0000 par: dc.w 0
000000b4: 000001b4: 0080 dc.w $80
000000b6: 000001b6: 0000 P_seg: dc.w 0
000000b8: 000001b8: 005c dc.w $5c
000000ba: 000001ba: 0000 p_f1: dc.w 0
000000bc: 000001bc: 006c dc.w $6c
000000be: 000001be: 0000 p_f2: dc.w 0
esc:
esc0: blk.b 1 ; escape for esc0-esc4
esc1: blk.b 1 ; 2 0 bytes (esc1)
esc2: blk.b 1 ; 3 0 bytes (esc2)
esc3: blk.b 1 ; 3 0 bytes (esc3)
esc4: blk.b 1 ; n 0 bytes (esc4 n)
buf2: blk.b 385-5 ; ACHTUNG: richtig Laenge einsetzen
buf1: