diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly
index 965974d98d91be45ac1eb29b2ebb856e2b26b2f3..7da75c2c4a11cc2ee4e1c1d97e3be8f2341c9254 100644
--- a/src/kernel_internals/parsing/cparser.mly
+++ b/src/kernel_internals/parsing/cparser.mly
@@ -736,10 +736,7 @@ string_constant:
    back to a string for easy viewing. */
     string_list                         { intlist_to_string (fst $1), snd $1 }
 ;
-one_string_constant:
-/* Don't concat multiple strings.  For asm templates. */
-    CST_STRING                          { intlist_to_string (fst $1) }
-;
+
 string_list:
     one_string                          { fst $1, snd $1 }
 |   string_list one_string              { merge_string $1 $2 }
@@ -1674,8 +1671,8 @@ asmattr:
 |    CONST asmattr                      { ("const", []) :: $2 }
 ;
 asmtemplate:
-    one_string_constant                          { [$1] }
-|   one_string_constant asmtemplate              { $1 :: $2 }
+    one_string                         { [intlist_to_string (fst $1)] }
+|   one_string asmtemplate             { intlist_to_string (fst $1) :: $2 }
 ;
 asmoutputs:
   /* empty */           { None }
@@ -1711,8 +1708,8 @@ asmclobber:
 | COLON asmcloberlst_ne asmlabels       { $2,$3 }
 ;
 asmcloberlst_ne:
-   one_string_constant                  { [$1] }
-|  one_string_constant COMMA asmcloberlst_ne     { $1 :: $3 }
+   string_constant                  { [fst $1] }
+|  string_constant COMMA asmcloberlst_ne     { fst $1 :: $3 }
 ;
 asmlabels:
 | /* empty */                          { [] }
diff --git a/tests/syntax/assembly_gmp.c b/tests/syntax/assembly_gmp.c
index 91147a158763ae13d17eecc141f65177efbffdcc..0d39854c42ebfe3febd235f71c57c8f1622c99ba 100644
--- a/tests/syntax/assembly_gmp.c
+++ b/tests/syntax/assembly_gmp.c
@@ -191,4 +191,7 @@ asm("sidt %0\n" : :"m"(loc));
 
 asm ("movq $36, (%0)": : "r"(pulValue));
 
+int a = 2, b = 3;
+  __asm__("mov %1, %0" : "=r"(a) :"r"(b): "%""eax");
+
 }
diff --git a/tests/syntax/oracle/assembly_gmp.0.res.oracle b/tests/syntax/oracle/assembly_gmp.0.res.oracle
index 64d451b45f1a20cc24976fa1ca92cb13c5d54f14..eb6853729c532ff192694d011b4a8e2b0a5795db 100644
--- a/tests/syntax/oracle/assembly_gmp.0.res.oracle
+++ b/tests/syntax/oracle/assembly_gmp.0.res.oracle
@@ -140,6 +140,11 @@ void f(void)
         \from (indirect: pulValue), *(pulValue + (..));
   */
   __asm__ ("movq $36, (%0)" :  : "r" (pulValue));
+  int a = 2;
+  int b = 3;
+  /*@ assigns a;
+      assigns a \from b; */
+  __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax");
   return;
 }
 
diff --git a/tests/syntax/oracle/assembly_gmp.1.res.oracle b/tests/syntax/oracle/assembly_gmp.1.res.oracle
index 34e7312b07b692b03ba45ef8ca317bb7153bd342..63a12b1b07bab4c049fb972e2f853cc2330cf8dd 100644
--- a/tests/syntax/oracle/assembly_gmp.1.res.oracle
+++ b/tests/syntax/oracle/assembly_gmp.1.res.oracle
@@ -123,6 +123,11 @@ void f(void)
         \from (indirect: pulValue), *(pulValue + (..));
   */
   __asm__ ("movq $36, (%0)" :  : "r" (pulValue));
+  int a = 2;
+  int b = 3;
+  /*@ assigns a;
+      assigns a \from b; */
+  __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax");
   return;
 }
 
diff --git a/tests/syntax/oracle/assembly_gmp.2.res.oracle b/tests/syntax/oracle/assembly_gmp.2.res.oracle
index 914bb19ed1476f45db64f94d9d29cbdd5a6d1830..2684a9a66550dfd450d38cd9166036597ebdab3b 100644
--- a/tests/syntax/oracle/assembly_gmp.2.res.oracle
+++ b/tests/syntax/oracle/assembly_gmp.2.res.oracle
@@ -122,6 +122,11 @@ void f(void)
         \from (indirect: pulValue), *(pulValue + (..));
   */
   __asm__ ("movq $36, (%0)" :  : "r" (pulValue));
+  int a = 2;
+  int b = 3;
+  /*@ assigns a;
+      assigns a \from b; */
+  __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax");
   return;
 }