Tasm ändert code



  • 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