Forum: Mikrocontroller und Digitale Elektronik Gnu Assembler Macros


von Jan (Gast)


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?

von Rolf M. (rmagnus)


Lesenswert?

Jan schrieb:
> Ich habe schon alle möglichen Escapings vesucht, aber ohne Erfolg

Auch schon "\string"?

von Markus F. (mfro)


Lesenswert?

Rolf M. schrieb:
> Jan schrieb:
>> Ich habe schon alle möglichen Escapings vesucht, aber ohne Erfolg
>
> Auch schon "\string"?

Genau so oder mit .altmacro (geht auch)

von Jan (Gast)


Lesenswert?

Geht leider nicht:
1
.macro test string
2
.text 1
3
.asciz "\string"
4
.text
5
.endm
6
7
test "test"

/tmp//cc5bmNaV.s: Warning: unknown escape '\s' in string; ignored

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

Jan schrieb:
> Geht leider nicht:
>
> /tmp//cc5bmNaV.s: Warning: unknown escape '\s' in string; ignored

Was soll den \s für ein Escape sein?
Hier: 
https://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_3.html#SEC33 
ist es nicht dabei.

\n ist 0x0a
\r ist 0x0d

aber \s ist ??? eben: "unknown".

von Jan (Gast)


Lesenswert?

Gleicher Fehler:
1
.altmacro
2
.macro test wstring
3
.text 1
4
.asciz "\wstring"
5
.text
6
.endm
7
.noaltmacro
8
9
test "test"

/tmp//ccY1hIkh.s: Warning: unknown escape '\w' in string; ignored

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


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.

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Vielleicht "\\string"

Die Forensoftware hat Problem mit 2 Slashs....

: Bearbeitet durch User
von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

Thomas Z. schrieb:
> Vielleicht "\\string"

Wir wissen ja nicht was der TO eigentlich erreichen will.

Und die Doku beschreibt, was die Fehlermeldung bedeutet und wie er sie 
wegbekommt.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Angehängte Dateien:

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?

von Markus F. (mfro)


Lesenswert?

Jan schrieb:
> Gleicher Fehler:
> .altmacro
> .macro test wstring
> .text 1
> .asciz "\wstring"
> .text
> .endm
> .noaltmacro
> test "test"
>
> /tmp//ccY1hIkh.s: Warning: unknown escape '\w' in string; ignored

Entweder mit .altmacro oder mit den Gänsefüsschen, aber nicht beides 
auf einmal!

von Jan (Gast)


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 :(

von Klaus W. (mfgkw)


Lesenswert?

Bei mir kommt da keine Warnung.

Hast du einen halbwegs aktuellen Stand der gcc, oder eine alte Leiche?

von Jan (Gast)


Lesenswert?

avr-gcc --version
avr-gcc (GCC) 10.2.0

Mit welchen Parametern rufst du den gcc auf?

von Klaus W. (mfgkw)


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)

von Jan (Gast)


Lesenswert?

Meckert er bei dir vielleicht, wenn du es mit -Wall -Wextra aufrufst? 
Also zusätzlich noch -Wextra

von Markus F. (mfro)


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).

: Bearbeitet durch User
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.