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 gibt

    lw



  • 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 100h

    START:
    push 5;x

    BTW:
    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. ]


Anmelden zum Antworten