RISC-V Gnu Assembler

Gast #6661428
Lesenswert?

Ich experimentiere gerade ein wenig mit dem RISC-V GNU Assembler.

Dazu folgendes, einfaches Programm:
1
.file  "test.S"
2
.section .text
3
.balign 4
4
.global test_asm
5

6
loop:
7
  andi x1,x1,0   
8
  addi x2,x2,1   
9
  jal x3,loop

Assemblieren kann ich mit
1
riscv32-unknown-elf-as test.S

und das Ergegnis lässt sich mit
1
riscv32-unknown-elf-objdump -D a.out

anschauen.

Wie kann ich ein *.bin File erzeugen?
Gast #6661901
Lesenswert?

>Mit objcopy -O binary sollte das gehen.

Danke. Objcopy hilft, man braucht aber noch eine ganze Latte anderer 
Kommandos:
1
#!/bin/sh
2

3
# Ein File kann man folgendermaßen assemblieren
4
riscv32-unknown-elf-as blink.S
5

6
# Es wird a.out erzeugt. Es ist ein "ELF" file und beinhaltet alle labels
7

8
# Dissassemblieren des mit "make" erzeugten C-Codes mit objdump:
9
riscv32-unknown-elf-objdump -d a.out
10

11
# Die Binärdaten kann man folgendermaßen extrahieren:
12
riscv32-unknown-elf-objcopy -O binary a.out a.bin
13

14
# a.out beinhaltet nur die Bytes des HEX-Code ohne sonst irgendwas
15
# darstellen der Bytes mit
16

17
xxd -g 4 a.bin
Gast #6661908
Lesenswert?

Man kann mit den ganzen Tools viele schoene Dinge machen wenn man
die man-pages lange liesst. :-)

$(PROJ_NAME).elf: $(SRCS)
        $(CC) $(CFLAGS) $^ -o $@ -L$(STD_PERIPH_LIB) -lstm32f0 
-L$(LDSCRIPT_INC) -Tstm32f0.ld
        $(OBJCOPY) -O ihex $(PROJ_NAME).elf $(PROJ_NAME).hex
        $(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
        $(OBJDUMP) -St $(PROJ_NAME).elf >$(PROJ_NAME).lst
        $(SIZE) $(PROJ_NAME).elf
        @arm-none-eabi-nm -Crtd --size-sort $(PROJ_NAME).elf | grep -i ' 
[dbv] '|\
        awk '{sum+=$$1} END{sump=sum/( $(RAMSIZE) / 100);\
        printf "\nRam   used: %5i of %5iBytes = 
%4.1f%%\n",sum,$(RAMSIZE), sump  }'
        @arm-none-eabi-nm -Crtd --size-sort $(PROJ_NAME).elf | grep -i ' 
[WTdD] '|\
        awk '{sum+=$$1} END{sump=sum/( $(FLASHSIZE) / 100);\
        printf "Flash used: %5i of %5iBytes = 
%4.1f%%\n",sum,$(FLASHSIZE), sump  }'
        @arm-none-eabi-nm -n -S main.elf |grep '^2' |grep ' 0000' |grep 
-v '__' >UsedVariable.txt
        @arm-none-eabi-nm -n -S main.elf |grep '^0' |grep ' 0000' |grep 
-v '__' >UsedFlash.txt


Olaf
Gast #6661909
Lesenswert?

Oh..und es kommt mir komisch vor das bei dir das a.out ein ELF ist und 
du
es sogar extra erwaehnen musst. aout war/ist eigentlich mal ein eigenes 
Linkerformat das unter Linux irgendwann in den 90er seine Bedeutung 
verloren hat.

Olaf
#6662554
Lesenswert?

Olaf schrieb:
> Oh..und es kommt mir komisch vor das bei dir das a.out ein ELF ist [...]


Ist es nicht. Die meisten Beispiele für den Gnu Linker nehmen a.out als 
Dateinamen um die Datei als Ausgabedatei zu kennzeichen.

Das a.out Executable Format vom historischen Linux ist eher zufällig 
namensgleich, weil offenbar jemend wenig Phantasie hatte.

Der Binutils Linker gibt schon ewig ELF als default Ausgabeformat aus.
Gast #6664310
Lesenswert?

Klaus W. schrieb:
> gcc irgendwas.c
> dann wird die Ausgabe in eine Datei a.out geschrieben -
> und die ist ELF.

a.out war wohl mehr oder weniger von Anfang an der Default-Name für die 
Ausgabedatei des Assemblers als Kürzel für Assembler-Output; und der 
Assembler war gleichzeitig der letzte Schritt bei der Umwandlung des 
Quellcodes in einen Binär- oder Maschinencode. Damit war das 
Ausgabeformat des Assemblers automatisch das ursprüngliche Binärformat 
im ganzen weiten Unix-Universum. Speziellen Namen brauchte es damals 
noch lange nicht, da es das einzige seiner Art war; der würde erst nötig 
als Unix mit dem System V - so in den frühen 990er Jahren des vorigen 
Jahrtausends - ein neues weitaus leistungsfähigeres, flexibleres Format 
einführte. Bloß versuchte zu dem Zeitpunkt natürlich keiner mehr einen 
richtigen Namen zu etablieren, für ein Format das nur noch für eine 
Übergangszeit als Auslaufmodell genutzt werden würde.

Und den Default-Namen der Assembler-Ausgabedatei wollte wohl niemand 
ändern, denn diesen waren sämtliche Programmierer im Unix Umfeld von 
Anbeginn an gewöhnt.
Gast #6664403
Lesenswert?

mIstA schrieb:
> a.out war wohl mehr oder weniger von Anfang an der Default-Name für die
> Ausgabedatei des Assemblers als Kürzel für Assembler-Output;

Wie ja schön nachzulesen ist in Wikipedia (Link wurde ja gepostet):
https://www.bell-labs.com/usr/dmr/www/man51.pdf

> und der
> Assembler war gleichzeitig der letzte Schritt bei der Umwandlung des
> Quellcodes in einen Binär- oder Maschinencode.

Stimmt so nicht, da das nur auf Einzeldateien zutrifft. In den meisten 
Fällen war der Linker der letzte Schritt.

> Damit war das
> Ausgabeformat des Assemblers automatisch das ursprüngliche Binärformat
> im ganzen weiten Unix-Universum.

Hier gilt das Gleiche. Kann man übrigens auch in obigem Manual von 
Ritchie nachlesen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren