Assembler auf *BSD

huffl

New Member
Hallo Community!


Ich habe bereits erfahrungen mit dem ia32-Assembler auf FreeBSD gesammelt. Nun muesste ich ein Programm von fbsd auf OpenBSD portieren, welches vollstaendig in Assembler geschrieben wurde. Nun würde ich gern wissen, was ich zu ändern habe. Ich benutze die Systemcalls read, write, open und exit. Und ist die Callingconvention ueberhaupt gleich (muss ich also nachwievor die syscall-nummer in eax laden und die Argumente auf dem Stack laden)?

Danke für eure Hilfe!


huffl
 
vorsichtige Frage in den Raum (habe noch nie assembler geschrieben):
Ich dachte assembler zeichnet aus, dass es von Prozessorarchitektur abhängt und nicht von OS.
Wieso sollte eine Intelprozessor unter OpenBSD anders sprechen als irgendwo anders?
 
es ging hier glaub ich nicht um die asm-syntax, sondern um syscalls, die bei jedem betriebssystem anders gehandhabt werden können... das eine holt sich die argumente aus dem stack, das andere aus anderen registern, etc...

afaik ist das bei den BSDs sehr ähnlich, so dass es funktionieren sollte.

auf bald
oenone
 
Der Befehlssatz des Prozessors bleibt zwar gleich, aber die Aufrufkonventionen und Betriebssystemroutinen können ja anders sein. Man ruft auch aus Assemblerprogrammen Routinen der Standardbibliotheken auf. Helfen kann ich allerdings mit meinem begrenzten Wissen leider nicht.

EDIT:
Zur Syntax: Auf Unixen ist allgemein AT&T-Syntax gebraeuchlich, unter DOS wars Intel-Syntax (masm/tasm), die mMn etwas angenehmer ist. Tut aber auch eigentlich nichts zur Sache, denn nasm (Intel-Syntax) gibts auch für die BSDs. gcc spuckt allerdings, wenn ich mich nicht irre, AT&T-Code aus. Wie gesagt, nur zur Ergänzung, hilft dem Threadstarter wohl nicht weiter.
 
Zuletzt bearbeitet:
@huffl: Bin mal neugierig: Performancegründe sprechen bei deinem Programm sicher nicht für Asm oder?
 
Statt die Syscalls OS-spezifisch direkt aufzurufen, könntest Du auch einfach die entsprechenden Entrypoints in der libc aufrufen. Dann wäre das ganze (abgesehen von der CPU-Architektur) sogar portabel.
 
guck dir einfach mal /usr/include/sys/syscall.h an, das duerfte dir schon die antworten geben die du brauchst.

zumindest kann ich dir schonmal sagen dass bei beiden systemen durch ein
Code:
int 80h
der kernel gerufen wird.
 
Unter BSDs werden die Parameter glaub ich immer über den Kellerspeicher(Stack) übergeben, von rechts nach links. Linux nuzt soweit ich weiß die Register zur Parameterübergabe.
 
Zurück
Oben