- Registriert
- Sep. 2025
- Beiträge
- 760
Hier noch eine Optimierung:
Optimierter C-Code:
Optimierter Assemblercode:
Was hat sich geändert?
Optimierter C-Code:
C:
#include <stdio.h>
int arr[] = {3, 5, 4, 1, 9, 7, 2, 6, 8};
int n = 9;
char str[] = "%d\n";
int iteration() {
int i = -1, j = 0, a, b;
while (i < n - 2) {
i++;
j++;
a = arr[i];
b = arr[j];
if (a > b) {
arr[i] = b;
arr[j] = a;
return 1;
}
}
return 0;
}
void sort() {
while (iteration())
;
}
void print() {
int i = 0;
while (i < n) {
printf(str, arr[i]);
i++;
}
}
int main() {
sort();
print();
return 0;
}
Optimierter Assemblercode:
Code:
.file "sort.c"
.text
.globl arr
.data
.align 32
.type arr, @object
.size arr, 36
arr:
.long 3
.long 5
.long 4
.long 1
.long 9
.long 7
.long 2
.long 6
.long 8
.globl n
.align 4
.type n, @object
.size n, 4
n:
.long 9
.globl str
.type str, @object
.size str, 4
str:
.string "%d\n"
.text
.globl iteration
.type iteration, @function
iteration:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $-1, -4(%rbp)
movl $0, -8(%rbp)
.L1:
movl n(%rip), %eax
subl $2, %eax
cmpl %eax, -4(%rbp)
jge .L2
addl $1, -4(%rbp)
addl $1, -8(%rbp)
movl -4(%rbp), %eax
cltq
leaq 0(,%rax,4), %rdx
leaq arr(%rip), %rax
movl (%rdx,%rax), %eax
movl %eax, -12(%rbp)
movl -8(%rbp), %eax
cltq
leaq 0(,%rax,4), %rdx
leaq arr(%rip), %rax
movl (%rdx,%rax), %eax
movl %eax, -16(%rbp)
movl -12(%rbp), %eax
cmpl -16(%rbp), %eax
jle .L1
movl -4(%rbp), %eax
cltq
leaq 0(,%rax,4), %rcx
leaq arr(%rip), %rdx
movl -16(%rbp), %eax
movl %eax, (%rcx,%rdx)
movl -8(%rbp), %eax
cltq
leaq 0(,%rax,4), %rcx
leaq arr(%rip), %rdx
movl -12(%rbp), %eax
movl %eax, (%rcx,%rdx)
movl $1, %eax
jmp .L3
.L2:
movl $0, %eax
.L3:
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.size iteration, .-iteration
.globl sort
.type sort, @function
sort:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
.L4:
movl $0, %eax
call iteration
testl %eax, %eax
jne .L4
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.size sort, .-sort
.globl print
.type print, @function
print:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
.L5:
movl n(%rip), %eax
cmpl %eax, -4(%rbp)
jge .L6
movl -4(%rbp), %eax
cltq
leaq 0(,%rax,4), %rdx
leaq arr(%rip), %rax
movl (%rdx,%rax), %eax
movl %eax, %esi
leaq str(%rip), %rax
movq %rax, %rdi
movl $0, %eax
call printf@PLT
addl $1, -4(%rbp)
jmp .L5
.L6:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.size print, .-print
.globl main
.type main, @function
main:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
call sort
movl $0, %eax
call print
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.size main, .-main
.ident "GCC: (Debian 14.2.0-19) 14.2.0"
.section .note.GNU-stack,"",@progbits
Was hat sich geändert?
- sort (in einer eigenen Funktion) steht jetzt näher an iteration,
- zusätzliche Variable j, um i+1 zwischenzuspeichern,
- return 1 und 0 stehen jetzt näher zusammen