Ich habe doch mal hier im Thema irgendwo gelesen dass ein C compiler den C code in Assembler verwandelt, wenn ich es richtig verstanden habe.
C -> Assembler -> 101 ist es so richtig?
Der gcc macht das. Eine menschenlesbare Form des Maschinencodes(Assembler) zwischen zu schalten ist aber nicht zwingend notwendig, da im normal Fall ja kein Mensch mehr drüber schaut. Andere Compiler machen das also gegebenenfalls anders.
wenn ja könnte man dann dazwischen den Assembler teil abzapfen? sozusagen dass man C in Asm umwandeln kann. Dass würde doch theoretisch gehen, und wäre praktisch Oder gibt es sowas schon als richtiges Programm?
Bei gcc ist das Abzapfen kein Problem. "gcc -S" und je nach dem wie sehr du deinen C-Code wieder erkennen willst noch die passenden Optimierungsflags. (siehe unten).
Aber da Assembler ja wie gesagt nur eine menschenlesbare Form von Maschinencode ist, kann man sich den generierten Code immer auch wieder von einem Disassembler zurück dolmetschen lassen. Mit ein paar Abstrichen bei der Lesbarkeit, da z. B. ein
jz und ein
je das selbe sind, und Lebles zum Großteil fehlen.
Beispielsweise generiert dir "gcc -S -O3" für ein
int div10(int a) { return a / 10; }
.file "test.c"
.text
.p2align 4,,15
.globl div10
.type div10, @function
div10:
.LFB0:
.cfi_startproc ; [EDIT] nach Intel-Syntax übersetzt
movl %edi, %eax ; mov eax, edi
movl $1717986919, %edx ; mov edx, 1717986919
sarl $31, %edi ; sar edi, 31
imull %edx ; imul edx
sarl $2, %edx ; sar edx, 2
subl %edi, %edx ; sub edx, edi
movl %edx, %eax ; mov eax, edx
ret
.cfi_endproc
.LFE0:
.size div10, .-div10
.ident "GCC: (GNU) 4.7.2 20120921 (Red Hat 4.7.2-2)"
.section .note.GNU-stack,"",@progbits
Ab und zu guck ich mir mal den generierten Code an, aber sinnvoll damit arbeiten kann man IMO nicht wirklich.
Und wegen der Performance C vs. ASM: der Generierte Code ist mit Sicherheit besser als ein "div". Wärst du darauf gekommen?