2 anfaenger fragen



  • moin :>

    ich fange grad mit asm an und habe mal 2 fragen:

    1. wie kann man assembler-standalone code schreiben? bisher muss mein asm code immer von einem c programm gestartet werden, ich will aber das programm komplett ansich in asm schreiben

    d_word1 dw FFFFh

    d_word1 dw 0FFFFh

    ersteres geht nicht, da beschwert sich nasm

    prog.asm:5: error: symbol `FFFFh' undefined

    zweiteres geht und erbringt auch den gewuenschten effekt, aber warum muss ich dem hex wert eine 0 voranstellen? ich habe festgestellt das der initialisierende wert von den labels immer mit der zahl anfangen muss... wieso?

    danke das wars erstma :>



  • Hi.

    Zu 1:
    Wie das zu realisieren ist, haegt stark davon ab, fuer welches System du programmierst. Mit NASM kannst du auf jeden Fall ziemlich einfach ohne Linker binarys erstellen. Wenn die das Startoffset 100h haben (org 100h), kannst du so ganz einfach DOS .com-Dateien erstellen.
    Ansonsten musst du noch einen Eintrittspunkt festlegen ("..start") und anschliessend linken - zB. zu .exe.

    Zu 2:
    Komisch... Darueber habe ich mir noch gar keine Gedanken gemacht... 😃



  • zu 1.: ich schreib unter gnu/linux, also nix mit com/exe 😃 gibts da irgendwie ein tut oder sonstwas fuer? weil ich dann auch direkt gern wuesste was es mit den startoffset von 100h aufsich hat und wie genau ich die startroutine festlege etc 😃

    zu 2.: nagut dann nehm ich das erstma so hin 😉

    hab aber hier direkt nochma ne frage wo ich grad am asm code rumspiel :>

    d_byte1         db 0
    [...]
    mov dword [d_byte1], 8
    

    so, erstmal wieso geht das problemlose kopieren der 8 als doubleword nach d_byte1, das als byte definiert ist?

    und ich bin dasmal mit dem debugger durchgegangen, und einen breakpoint vor und nach der anweisung gesetzt. folgende ergebnisse:

    (gdb) print d_byte1
    $11 = -65536
    (gdb) print 0x80499e4
    $12 = 134519268
    (gdb) x 0x80499e4
    0x80499e4 <d_byte1>: add %al,(%eax)

    step

    (gdb) print d_byte1
    $13 = 8
    (gdb) print 0x80499e4
    $14 = 134519268
    (gdb) x d_byte1
    0x8: Cannot access memory at address 0x8
    (gdb) x 0x80499e4
    0x80499e4 <d_byte1>: or %al,(%eax)

    also das kann ich nicht nachvollziehen: print zeigt ja noch besagter addresse/label den inhalt an, waehrend x den inhalt der adresse anzeigt, sofern eine adresse drinnen ist

    1.wieso ist d_byte1 am anfang -65536? ich habe es doch mit 0 initialisiert?
    2. wieso gibt es einen unterschied zwischen

    print d_byte1
    und
    print 0x80499e4
    ? weil d_byte1 ist doch an der adresse 0x80499e4, also ist es doch egal ob ich den inhalt des labels oder der adresse einzeige, weil das label doch die adresse representiert?!

    (gdb) x d_byte1
    0x8: Cannot access memory at address 0x8

    das ist ja klar, aber was ist denn das hier?

    (gdb) x 0x80499e4
    0x80499e4 <d_byte1>: or %al,(%eax)

    erstmal ist da wieder die frage wo der unterschied ist zwischen d_byte1 und 0x80499e4, und was soll denn das

    or %al,(%eax)

    ?

    danke schonmal fuer die antwort 🙂



  • und nochwas was ich nicht verstehe

    segment .data
    d_byte1         db 254
    d_byte2         db 0
    d_word1         dw 04444h
    d_word2         dw 0CCCCh
    d_dword1        dd 99991111h
    d_dword2        dd 33333333h
    
    segment .text
            global asm_main
    asm_main:
            enter 0,0
            pusha
    
            mov ebx, $0
    
            mov al, [d_byte1]
            mov bl, [d_byte2]
    
            mov dword [d_byte1], 8
    
            mov ax, [d_word1]
            mov ax, 1234h
    
            mov ebx, [d_word2]
    
            mov eax, [d_dword1]
            mov ebx, [d_dword2]
    
            popa
            mov eax, 0
            leave
            ret
    

    was ist an d_word1 kaputt? egal ob ich es nach eax oder an ax verschieben, danach befindet sich immer nur 0 in dem register. mit (e)ax ist aber alles in ordnung, denn andere labels oder einfach so werte ( mov ax, 1234h ) nimmt er auch. aber wie kann denn nach der anweisung
    mov ax, [d_word1]
    eax leer sein?


Anmelden zum Antworten