Re: Assembler

From: J Wunsch <j(at)uriah.heep.sax.de>
Date: Sat, 24 Jun 2000 13:18:13 +0200

As Fischer Oliver wrote:

> Das Demo aus dem Artikel erzeugt bei mir nur Fehler (4.0).

Was hast Du denn damit gemacht? Die im Artikel angegebene Reihenfolge

nasm -f elf hello.asm
ld -o hello hello.o (weiß nicht, warum manche Leute es sich zur
                        Gewohnheit machen, ld immer mit -s aufzurufen)

...ergibt bei mir ein sauberes "Hello, world!", FreeBSD nicht ganz
-current, aktueller nasm-Port.

Allerdings verstehe ich nicht, warum jemand so erpicht auf diese blöde
iNtel-Mnemonik sein kann. Ich fand sie früher schon immer unlogisch
und war von der Klarheit der AT&T-Mnemonik, wie sie unter Unix
allgemein üblich ist, dann viel mehr angetan. Warum bitte sollte ich
"move a b" schreiben, wenn ich eigentlich meine "lade a mit b" bzw.
"move b nach a". Auch haben solche Konzepte wie ein "dword ptr" immer
irgendwie den Hauch von segment:offset Adressierung für mich an
sich... In einer richtigen Assemblersprache muß man einen Pointer
nich angeben, sondern einen Direktwert. Das hat zur Folge, daß man
einen Speicherplatz für eine Variable mit einem Symbol vereinbaren
kann und diesen Namen dann wie eine Variable benutzt. Alle außer
iNtel machen das so... (und Z80, der war noch i8080-lastig, obwohl er
zumindest den Unfug mit "mov a, b" korrigiert hat und "ld a, b"
benutzt). Mal bekommen labels einen Doppelpunkt, mal haben sie
keinen... Naja, man muß das glaub' ich nicht mögen, was iNtel da
verbrochen hat. ;-)

Hier nochmal das Testprogramm aus dem Beispiel in as-Syntax. Zu
bauen mit

as -o hello.o hello.s # die Endung .asm ist auch so'n DOSismus...
ld -o hello hello.o

        .text
        .globl _start /* must be declared for linker (ld) */

msg: .ascii "Hello, world!\n" /* our dear string */
.equ len, . - msg /* length of our dear string */

_syscall:
        int $0x80 /* system call */
        ret

_start: /* tell linker entry point */

        push $len /* message length */
        push $msg /* message to write */
        push $1 /* file descriptor (stdout) */
        mov $0x4,%eax /* system call number (sys_write) */
        call _syscall /* call kernel */

                                /* the alternate way to call kernel: */
                                /* push eax */
                                /* call 7:0 */

        add $12,%esp /* clean stack (3 arguments * 4) */

        push $0 /* exit code */
        mov $1,%eax /* system call number (sys_exit) */
        call _syscall /* call kernel */

                                /* we do not return from sys_exit, */
                                /* there's no need to clean stack */

-- 
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL
http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 24 Jun 2000 - 13:20:41 CEST

search this site