KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm having difficulty understanding the role constraints play in GCC inline assembly (x86). I've read the manual , which explains exactly what each constraint does. The problem is that even though I understand what each constraint does, I have very little understanding of why you would use one constraint over another, or what the implications might be. I realize this is a very broad topic, so a small example should help narrow the focus. The following is a simple asm routine which just adds two numbers. If an integer overflow occurs, it writes a value of 1 to an output C variable. int32_t a = 10, b = 5; int32_t c = 0; // overflow flag __asm__ ( "addl %2,%3;" // Do a + b (the result goes into b) "jno 0f;" // Jump ahead if an overflow occurred "movl $1, %1;" // Copy 1 into c "0:" // We're done. :"=r"(b), "=m"(c) // Output list :"r"(a), "0"(b) // Input list ); Now this works fine, except I had to arbitrarily fiddle with the constraints until I got it to work correctly. Originally, I used the following constraints: :"=r"(b), "=m"(c) // Output list :"r"(a), "m"(b) // Input list Note that instead of a "0", I use an "m" constraint for b . This had a weird side effect where if I compiled with optimization flags and called the function twice, for some reason the result of the addition operation would also get stored in c . I eventually read about " matching constraints ", which allows you to specify that a variable is to be used as both an input and output operand. When I changed "m"(b) to "0"(b) it worked. But I don't really understand why you would use one constraint over
Tags (comma-separated)
Save Edits
Cancel