Tasm ändert code
-
ich hab mal wieder eit langem n bischen in asm rumgespielt und als ihc mir dann das programm mal mit nem debugger angucke(w32disasm,Tdebugger) merke ich das da ganz andere mnemonics drin stehen als ich wollte.wie kann ich das verhindern das der tasm den code "optimiert"?
-
hmm es gibt ein par mnemonics die den selben opcode beschreiben.
z.B. je und jz sind das selbe
gleiches gilt für xchg ax,ax und nop
vielleicht hängt es damit zusammen
-
Von sich aus "optimiert" TASM gar nichts.
Was ich mir zu dem noch vorstellen koennte waere, dass Du vielleicht versehentlich falsch compiliert/gelinkt hast? 16Bit Code in 32Bit disassemblern sieht reichlich verwirrend aus
-
also wenn ich das richtig sehe ist aus:
push 5;x push 3;y push offset hallo;string;muss offset von ds sein!!! push 0afh;farben für zeichen call putsz; ret
folgendes geworden:
cs:010050 push ax cs:0101 55 push bp cs:0102 8BEC mov bp,sp cs:0104 C746020500 mov word ptr [bp+02],0005 cs:0109 5D pop bp cs:010A 50 push ax cs:010B 55 push bp cs:010C 8BEC mov bp,sp cs:010E C746020300 mov word ptr [bp+02],0003 cs:0113 5D pop bp cs:0114 50 push ax cs:0115 55 push bp cs:0116 8BEC mov bp,sp cs:0118 C746027001 mov word ptr [bp+02],0170 cs:011D 5D pop bp cs:011E 50 push ax cs:011F 55 push bp cs:0120 8BEC mov bp,sp cs:0122 C746022D00 mov word ptr [bp+02],002D cs:0127 5D pop bp cs:0128 E80100 call 012C cs:012B C3 ret
das finde ich etwas krass,das kommt übtigens aus dem turbo debugger der beim tasm5.0 dabei ist.
Das Programm tut allerdings trotzdem ws es soll.
-
hm... Hast Du im "model" vielleicht irgend eine Hochsprache angegeben? (TASM kann routinen fuer BASIC, C, Pascal, Fortran etc. generieren, wenn ich mich net irre)
-
hi,
ich kenn mich nicht gut in assembler aus, aber wenn du z.B. schreibst:
push 5;x
kann das ja nicht genau so im original-programm-code stehen, weil es ja so die variable x nicht gibtlw
-
Das x ist nur ein Kommentar
-
-
optimiert der tasm vielleich auf gewisse boundary grössen? Das soll ja bei einigen Prozessoren ordentlich mehr speed bringen, aber warum macht er das dann nicht mit NOPs???
-
Wie komisch assemblierst du denn?
Wenn ich deinen Code mit TASM assembliere und linke, dann disassembliere, kommt folgendes dabei heraus://******************** Program Entry Point ******** :0001.0100 6A05 push 0005 :0001.0102 6A03 push 0003 :0001.0104 680E01 push 010E :0001.0107 68AF00 push 00AF :0001.010A E81000 call 011D :0001.010D C3 ret // usw...
Genau das was ich erwartet habe.
Zeig mal deine Compilerschalter und die komplette .asm datei.
Und schieb die schuld nicht auf den TASM, der macht da nix falsch.
-
.model tiny .data hallo db "Es ist ein test.",0 .code org 100h START: push 5;x push 3;y push offset hallo;string;muss offset von ds sein!!! push 0afh;farben für zeichen call putsz; ret putsz: push bp;stack rahmen einrichten mov bp,sp push es;alles sichern push si push di mov ax,0b800h;segment zur ausgabe festlegen mov es,ax mov ax,[bp+8];y koordinate mov bx,160 mul bx;noch nicht ausgebessert weil ich dieses umrechnen auf shifts im moment nervig finde,kommt aber noch mov dx,[bp+10];x koordinate add dx,dx add ax,dx mov di,ax mov si,[bp+6];string offset mov ah, byte ptr [bp+4];farbe ;shl ax,8 output:;ausgabe schleife lodsb test al,al jz end_output stosw jmp output; end_output: pop di;reseten pop si pop es mov sp,bp pop bp ret 8 END START
ich benutze eine batch datei:
@Echo Off if not exist D:\tasm\%1.asm goto quit D:\tasm\bin\tasm D:\tasm\%1 /MU /OS /Q if errorlevel 1 goto quit D:\tasm\bin\tlink D:\tasm\%1 /x /Tdc del D:\tasm\%1.obj :quit
-
Hab nochmal etwas rumprobiert und den Grund fuer das Problem gefunden:
.model tiny
.data
hallo db "Es ist ein test.",0
.code
.286 ;<= hier gehoert der verwendete Prozessortyp hin...
org 100hSTART:
push 5;xBTW:
Syntax: TASM [options] source [,object] [,listing] [,xref]Muessten demnach die Options nicht vor dem Dateinamen stehen
-
Original erstellt von Nobuo T:
**
Syntax: TASM [options] source [,object] [,listing] [,xref]
Muessten demnach die Options nicht vor dem Dateinamen stehen**
Es funktioniert auch, wenn die die Optionen vor den Sorcecode stellt.
Aber mal ne andere Frage: Was macht TASM eigendlich, wenn man keinen Prozessortyp angibt? Wird dann irgend einer Standardmäßg verwendet?
-
Wahrscheinlich wird der 8086 als Standard verwendet. Der kann AFAIK keine Zahlen direkt auf den Stack pushen.
So hat TASM dieses Problem doch recht elegant geloest.
-
Nur das ich dsa auch verstehe,ich muss den 286 als ziel-prozessor angeben,damit das mit dem pushen von konstanteen funktioniert.
-
286 oder neuer.
-
gab's auch nen 186
-
Ja:
http://www.intel.com/design/intarch/prodbref/272222.htm[ Dieser Beitrag wurde am 02.12.2002 um 21:13 Uhr von Nobuo T editiert. ]