Gnu Assembler Macros

Gast #6846048
Lesenswert?

Hallo.

Ich möchte gerne folgendes Macro haben:
1
.macro mymacro string
2
  .asciz \string
3
.endm

Der Aufruf mit
1
mymacro "test"

schlägt fehl. Warning: unknown escape '\s' in string; ignored

Ich habe schon alle möglichen Escapings vesucht, aber ohne Erfolg. Weiss 
hier jemand weiter?
(Firma: Golden Delicious Computers) #6846675
Lesenswert?

In der Doku steht es. Der Assembler macht genau was Du ihm sagst.

\ anything-else
Any other character when escaped by \ gives a warning, but assembles as 
if the `\' was not present. The idea is that if you used an escape 
sequence you clearly didn't want the literal interpretation of the 
following character. However as has no other interpretation, so as knows 
it is giving you the wrong code and warns you of the fact.
#6846730
Lesenswert?

Komisch. Ich habe es eben mal mit gcc für amd64 probiert, da geht es so 
wie du es schreibst (aber bei der Verwendung des Arguments Gänsefüßchen 
dazu genommen):
1
.macro  blabla string
2
.KLAUS:
3
        .string    "\string"
4
.endm
5
...
6
        blabla "test"
7
...

Zum Testen habe ich ein kleines C-Programm gemacht, das mit puts() was 
ausgibt.
Dann in den erzeugten asm-Code das obige eingefügt und stattdessen den 
String "test" ausgeben lassen über das Label .KLAUS
Das ist als a.c und a.s (mit gcc aus a.c erzeugt, dann wie beschrieben 
geändert) im Anhang.
Also sollten bei dir doch nur die Gänsefüßchen fehlen?
Angehängte Dateien:
Gast #6847057
Lesenswert?

Klaus W. schrieb:
> Komisch. Ich habe es eben mal mit gcc für amd64 probiert, da geht es so
> wie du es schreibst (aber bei der Verwendung des Arguments Gänsefüßchen
> dazu genommen):
>
1
> .macro  blabla string
2
> .KLAUS:
3
>         .string    "\string"
4
> .endm
5
> ...
6
>         blabla "test"
7
> ...
8
>
>
> Zum Testen habe ich ein kleines C-Programm gemacht, das mit puts() was
> ausgibt.
> Dann in den erzeugten asm-Code das obige eingefügt und stattdessen den
> String "test" ausgeben lassen über das Label .KLAUS
> Das ist als a.c und a.s (mit gcc aus a.c erzeugt, dann wie beschrieben
> geändert) im Anhang.
> Also sollten bei dir doch nur die Gänsefüßchen fehlen?

Hmm ich wollte grad schreiben, dass dein Makro bei mir auch wieder den 
gleichen Fehler wirft:
1
/tmp//cc2UHizX.s: Assembler messages:
2
/tmp//cc2UHizX.s: Warning: unknown escape '\s' in string; ignored

Und da fiel mir zum ersten Mal auf, dass das gar kein Fehler, sondern 
eine Warnung ist. Der hat das Teil letztendlich kompiliert. Ich habe mir 
das binfile angeschaut und da steht tatsächlich test drin und nicht 
string. Also funktioniert es so, wie es soll. Nur die Warning ist 
irgendwie völlig daneben. Kann man die einfach abschalten?

Ich weiss echt nicht, was der intern da genau macht. Im zu 
kompilierenden Code sollte nirgendwo der String "\string" stehen. Das 
wird ja vom Makro ersetzt. Es wirkt fast so, als würde erst der 
Sanity-Check kommen und danach die Makros ausgeführt werden. Das ist 
eigentlich nicht richtig so. Und irgendwie glaube ich auch nicht, dass 
das so ist.....

Ufff....

Help :(
#6847795
Lesenswert?

Erst um das AMS-Quelltext zu erzeugen:
gcc -Wall -save-temps a.c

Dann nach dem Editieren nur noch:
gcc -Wall a.s

klwa4731@eso22188:~ > gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 
9.3.0-17ubuntu1~20.04' 
--with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs 
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 
--prefix=/usr --with-gcc-major-version-only --program-suffix=-9 
--program-prefix=x86_64-linux-gnu- --enable-shared 
--enable-linker-build-id --libexecdir=/usr/lib 
--without-included-gettext --enable-threads=posix --libdir=/usr/lib 
--enable-nls --enable-clocale=gnu --enable-libstdcxx-debug 
--enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new 
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin 
--enable-default-pie --with-system-zlib --with-target-system-zlib=auto 
--enable-objc-gc=auto --enable-multiarch --disable-werror 
--with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 
--enable-multilib --with-tune=generic 
--enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debi 
an/tmp-nvptx/usr,hsa  --without-cuda-driver --enable-checking=release 
--build=x86_64-linux-gnu --host=x86_64-linux-gnu 
--target=x86_64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
#6847935
Lesenswert?

Tatsächlich macht gcc-avr (bzw. gcc-as) bei mir genau dasselbe 
(Warnung), während alle anderen gnu-as, die ich habe (und das sind 
einige) sich anders (richtig) verhalten.

Scheint mir in der Tat eine Macke im AVR Assembler zu sein.

Mein AVR-gcc stammt aus den Paketquellen von Debian 11 und scheint 
tatsächlich schon ein wenig abgehangen (alt) zu sein (GNU assembler 
version 2.26 (avr) using BFD version (GNU Binutils) 2.26.20160125).

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