|
Mit freundlicher Unterstützung von: |
On Wednesday 15 September 2004 16:03, Clifford Wolf wrote:
>
> dafuer bekomm' ich vom compiler die meldung
>
> wrapper.c:37: error: can't find a register in class `BREG' while reloading
> `asm'
>
Welche gcc Version verwendest Du? Ich habe bekomme mit gcc version 3.2.2
keinerlei Fehlermeldungen, zuerst habe ich vermutet na gut vielleicht ist
da gerade %ebx frei, darum habe ich den Code etwas geändert in:
static int wrapper_debug_out(char *txt) {
long len = 0;
long a,b;
a=5;
b=2;
asm volatile ("movl %[a], %[b]"
:[b] "=b" ((long) (b))
:[a] "a" ((long) (a))
);
while (txt[len]) len++;
asm volatile (
"int $0x80"
:
:
"a" ((long)(4)), /* write */
"b" ((long)(2)), /* stderr */
"c" ((long)(txt)), /* text */
"d" ((long)(len)) /* length */
);
return a+b;
}
was mir dann folgenden Assembler Code liefert:
wrapper_debug_out:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $12, %esp
movl $0, -8(%ebp)
movl $5, -12(%ebp)
movl $2, -16(%ebp)
movl -12(%ebp), %eax
#APP
movl %eax, %ebx
#NO_APP
movl %ebx, %eax
movl %eax, -16(%ebp)
.L2:
movl -8(%ebp), %eax
addl 8(%ebp), %eax
cmpb $0, (%eax)
jne .L4
jmp .L3
.L4:
leal -8(%ebp), %eax
incl (%eax)
jmp .L2
.L3:
movl $4, %eax
movl $2, %ebx
movl 8(%ebp), %ecx
movl -8(%ebp), %edx
#APP
int $0x80
#NO_APP
movl -16(%ebp), %eax
addl -12(%ebp), %eax
addl $12, %esp
popl %ebx
leave
ret
>
> kann ich dem register allocator irgendwie sagen dass er %ebx gefaelligst
> selbst pushen soll wenn es gerade nicht frei ist?
>
Bei mir (mit gcc 3.2.2 unter FreeBSD) tut er es, wenn ich das richtig sehe.
Liebe Grüße
Alex
|
the choice of a gnu generation linux user group austria; |
Suche
|
Letzte Änderung:
webmaster@luga.at 25. Juni |