Forum: Compiler & IDEs RISC-V Gnu Assembler


von chris_ (Gast)


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?

von Olaf (Gast)


Lesenswert?

Mit objcopy -O binary sollte das gehen.

Olaf

von chris_ (Gast)


Lesenswert?

Leider klappt's nicht ...
Hier gibt's einen schönen RISC-V Online Interpreter:

https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/

von chris_ (Gast)


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

von Olaf (Gast)


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

von Olaf (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

Wenn ich unter Linux einen Quelltext kompiliere ohne Angabe, wo die 
Ausgabe hin soll:
  gcc irgendwas.c
dann wird die Ausgabe in eine Datei a.out geschrieben - und die ist ELF.

von Jim M. (turboj)


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.

von John Doe (Gast)


Lesenswert?


von mIstA (Gast)


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.

von Dr. MCU (Gast)


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.

von chris_ (Gast)


Lesenswert?

Im Moment suche ich nach guten RISC-V Online-Simulatoren. Es scheint 
viele zu geben, aber die Assembler-Syntax ist wohl unterschiedlich und 
es laufen nicht alle zuverlässig.

Dieser Online RISC-V Simulator scheint erst mal ganz brauchbar:
https://www.kvakil.me/venus/

von chris_ (Gast)


Lesenswert?

>Dieser Online RISC-V Simulator scheint erst mal ganz brauchbar:
>https://www.kvakil.me/venus/

Die Anleitung dazu gibt's auf GitHub:
https://github.com/kvakil/venus/wiki

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.