Assembler Tags auf AT&T Syntax erweitern



  • Wäre es prinzipiell möglich, den ASM-Tag, bei dem ja nur Intel-Syntax "unterstützt" wird, auch auf AT&T-Syntax zu erweitern?
    Wir haben ja z.B. einen grösseren OS-Thread von Erhard im Assembler-Subforum, wo die AT&T Syntax inzwischen, ob mit Freude oder ohne, dauerhaft eingesetzt wird 🙂
    Die GCC verwendet sie ja auch standardmässig.

    Ich nutze den GNU Assembler auch ab und zu 🙂

    Das sieht alles irgendwie hässlich aus, z.B.:

    .section .data
    eax: .long 0
    
    .section .text
        movl %eax, eax
    

    Variablendeklaration .long wird nicht erkannt. Variable eax wird als gültiges Register erkannt. Register eax wird zwar erkannt, aber Prozent-Zeichen nicht. Befehl movl (move long) wird nicht erkannt, usw...
    Wäre es vielleicht möglich, gar einen neuen Tag einzuführen, ASM AT&T o.ä.?



  • Welche Schlüsselwörter müßte man denn einfärben?



  • Marc++us schrieb:

    Welche Schlüsselwörter müßte man denn einfärben?

    Man müsste mindestens alle Registerbezeichnungen einfärben, die mit % Zeichen (inklusive das Zeichen selbst, weiss nicht, wie es besser wäre) eingegeben werden (habe sie grade aus http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gnu-assembler/i386-regs.html):

    %eax, %ebx, %ecx, %edx, %edi, %esi, %ebp, %esp
    %ax, %bx, %cx, %dx, %di, %si, %bp, %sp
    %ah, %al, %bh, %bl, %ch, %cl, %dh, %dl
    %cs, %ds, %ss, %es, %fs, %gs
    %cr0, %cr2, %cr3. 
    %db0, %db1, %db2, %db3, %db6, %db7
    %tr6, %tr7
    %st(0), %st(1), %st(2), %st(3), %st(4), %st(5), %st(6), %st(7)
    %mm0, %mm1, %mm2, %mm3, %mm4, %mm5, %mm6 and %mm7
    %xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7
    %rax, %rbx, %rcx, %rdx, %rdi, %rsi, %rbp, %rsp
    %r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
    %r8d, %r9d, %r10d, %r11d, %r12d, %r13d, %r14d, %r15d
    %r8w, %r9w, %r10w, %r11w, %r12w, %r13w, %r14w, %r15w
    %r8b, %r9b, %r10b, %r11b, %r12b, %r13b, %r14b, %r15b
    %sil, %dil, %bpl, %spl
    %db8, %db9, %db10, %db11, %db12, %db13, %db14, %db15
    %xmm8, %xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, %xmm15
    

    Dann gibt es Kommentare, die mit # Zeichen beginnen:

    mov %eax, %ebx    # Das ist ein Kommentar
    

    Es gibt noch eine Reihe von Assembler-Direktiven (s. z.B. hier http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gnu-assembler/index.html). Im Prinzip, alles Schlüsselwörter, die mit einem Punkt beginnen:

    .abort
    .ABORT
    .align
    .ascii
    .asciz
    .balignw
    .balignl
    .byte
    .comm
    .cfi_startproc
    .cfi_endproc
    .cfi_def_cfa
    .cfi_def_cfa_register
    .cfi_def_cfa_offset
    .cfi_adjust_cfa_offset
    .cfi_offset
    .cfi_rel_offset
    .cfi_window_save
    .cfi_escapeexpression
    .data
    .def
    .desc
    .dim
    .double
    .eject
    .else
    .elseif
    .end
    .endef
    .endfunc
    .endif
    .equ
    .equiv
    .err
    .exitm
    .extern
    .fail
    .file
    .fill
    .float
    .func
    .global
    .hidden
    .hword
    .ident
    .if
    .incbin
    .include
    .int
    .internal
    .irp
    .irpc
    .lcomm
    .lflags
    .line
    .linkonce
    .ln
    .mri
    .list
    .long
    .macro
    .altmacro
    .noaltmacro
    .nolist
    .octa
    .org
    .p2alignw
    .p2alignl
    .previous
    .popsection
    .print
    .protected
    .psize
    .purgem
    .pushsection
    .quad
    .rept
    .sbttl
    .scl
    .section
    .set
    .short
    .single
    .size
    .sleb128
    .skip
    .space
    .stabd
    .stabn
    .stabs
    .string
    .struct
    .subsection
    .symver
    .tag
    .text
    .title
    .type
    .uleb128
    .val
    .version
    .vtable_entry
    .vtable_inherit
    .weak
    .word
    

    Die Konstanten beginnen mit einem $ Zeichen:

    movl $0xABCDEF00, %eax
        movl $SomeVariable, %ecx
    

    Dann gibt es ein Paar Präfixe für die ganzen Befehle, die u.a. Speicher lesen/schreiben, irgendwelche Operanden benutzen usw.: b (byte 8 Bit), w (word 16 Bit), l (long 32 bit) und q (quad 64 Bit). So kann z.B. der Befehl mov so aussehen (je nach Kontext):

    mov
        movb
        movw
        movl
        movq
    

    Oder analog der Befehl inc:

    inc
        incb
        incw
        incl
    

    Die Sprungmarken sind im Prinzip wie in anderen Assemblern. Man kann aber noch zusätzlich die Zahlen 0...9 allein (als nur lokale sichtbare Marken) verwenden mit dem Präfix b (für back) oder f (für forward):

    jmp CooleStelle
    CooleStelle:
        ...
    0:
        jmp 0b    # Spring zurück (0 back) auf die Marke 0
        jmp 0f    # Spring vorwärts (0 forward) auf die Marke 0
    0:
    

    Hoffe, habe das wichtigste aufgelistet... 🙂


Anmelden zum Antworten