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 zwischenprint 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 0x8das 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?