2016-05-06 10 views
2

ich folgende Assembler-Programm auf Debian sid bin kompilieren, aber es wird nicht laufen mir die Fehlermeldung geben:binär läuft nicht auf Debian sid

-bash: ./power: nicht Binärdatei aus

-Code

.section data 

.section text 

.global _start 
    _start: 
     # do first calc and save the answer 
     pushl $3 
     pushl $2 
     call power 
     addl $8, %esp 
     pushl %eax 

     # do second calc 
     pushl $2 
     pushl $5 
     call power 
     addl $8, %esp 

     # add both together 
     popl %ebx 
     addl %eax, %ebx 

     # exit with answer as return status 
     movl $1, %eax 
     int $0x80 

.type power, @function 
    power: 
     # ? 
     pushl %ebp 
     movl %esp, %ebp 
     subl $4, %esp 

     # load params 
     movl 8(%ebp), %ebx 
     movl 12(%ebp), %ecx 
     movl %ebx, -4(%ebp) 

    power_loop_start: 
     # have we looped down to 1? 
     cmpl $1, %ecx 
     je end_power 

     # multiply prev result by base and store 
     movl -4(%ebp), %eax 
     imull %ebx, %eax 
     movl %eax, -4(%ebp) 

     # go again 
     decl %ecx 
     jmp power_loop_start 

    end_power: 
     movl -4(%ebp), %eax 
     movl %ebp, %esp 
     popl %ebp 
     ret 

ich laufe mit:

as power.s -o power.o 
ld power.o -o power 
./power 

Beide uname -m und arch gib mir i686, und die binären gibt diese auf objdump -x:

$ objdump -x power 

power:  file format elf32-i386 
power 
architecture: i386, flags 0x00000012: 
EXEC_P, HAS_SYMS 
start address 0x00000000 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 text   0000004a 00000000 00000000 00000034 2**0 
        CONTENTS, READONLY 
SYMBOL TABLE: 
00000000 l d text 00000000 text 
00000023 l  F text 00000000 power 
00000032 l  text 00000000 power_loop_start 
00000043 l  text 00000000 end_power 
00000000 g  text 00000000 _start 
08049034 g  *ABS* 00000000 __bss_start 
08049034 g  *ABS* 00000000 _edata 
08049034 g  *ABS* 00000000 _end 

nicht sicher, was ich falsch mache.

Weitere Anmerkung:

Dieses Beispiel stammt aus dem Buch „Programmieren von Grund auf“. Ich habe versucht, auf einem Red Hat x86_64 Maschine, mit as Flags --32 und ld Flags -m elf_i386, alles kompiliert fein wie auf der x86-Maschine, aber bei der Ausführung gibt den gleichen Fehler.

+2

Sie haben einen Tippfehler: '.section text' sollte' .section .text' sein (notieren Sie den Punkt) oder nur '.text'. – Jester

+0

@Jester wow, ich wünschte, ich könnte dich 100 mal abstimmen. Ich habe versucht, das für einen Tag herauszufinden. Sowohl der Text als auch die Daten haben keine Punkte! Ich wünschte, der Compiler hätte sich beschwert ... – sprocket12

Antwort

4

Sie haben einen Tippfehler: .section text.section .text sein sollte (man beachte den Punkt) oder nur .text

Während die Emission durch einen Tippfehler verursacht wird, halte ich es von einer Erklärung wert ist, vor allem, da man so schön, alle Angaben gemacht :)

Während Sie Ihre Abschnitte benennen können, wie Sie möchten (und deshalb haben sich die Werkzeuge nicht beschweren), hat jeder Abschnitt einige Flags. In diesem Fall sehen Sie in der objdump Ausgabe: CONTENTS, READONLY. Was das bedeutet ist, dass dieser Abschnitt nicht ausführbar ist, in der Tat ist es nicht einmal geladen. (Möglicherweise könnte die Fehlermeldung ein wenig genauer sein.)

Okay, also warum ist es nicht ausführbar? Der Assembler erkennt einige allgemeine Abschnittsnamen und richtet die Flags ordnungsgemäß ein. Für einen benutzerdefinierten Namen müssen Sie dies manuell tun, indem Sie beispielsweise .section text, "ax" eingeben, die ALLOC und CODE setzt. Siehe auch die .section directive in the manual und this answer about the various flags.