История изменений
Исправление shdown, (текущая версия) :
Впрочем, говорить тут что-то излишне, давайте покажу:
enum { BUF_SIZE = 1024 };
char buffer[BUF_SIZE];
volatile int buffer_ready = 0;
void buffer_init(void)
{
for (int i = 0; i < BUF_SIZE; ++i) {
buffer[i] = 0;
}
buffer_ready = 1;
}
Компилируем. gcc version 15.2.0 (Debian 15.2.0-4).
$ gcc -Wall -Wextra -O3 -c foo.c
$ objdump -S foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <buffer_init>:
0: b9 80 00 00 00 mov $0x80,%ecx
5: 31 c0 xor %eax,%eax
7: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # e <buffer_init+0xe>
e: c7 05 00 00 00 00 01 movl $0x1,0x0(%rip) # 18 <buffer_init+0x18>
15: 00 00 00
18: f3 48 ab rep stos %rax,(%rdi)
1b: c3 ret
Компилятор поместил buffer_ready = 1 (movl $0x1,…) до цикла for (rep stos …).
(За идею спасибо этой статье: https://users.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf)
Исходная версия shdown, :
Впрочем, говорить тут что-то излишне, давайте покажу:
enum { BUF_SIZE = 1024 };
char buffer[BUF_SIZE];
volatile int buffer_ready = 0;
void buffer_init(void)
{
for (int i = 0; i < BUF_SIZE; ++i) {
buffer[i] = 0;
}
buffer_ready = 1;
}
Компилируем. gcc version 15.2.0 (Debian 15.2.0-4).
$ gcc -Wall -Wextra -O3 -c foo.c
$ objdump -S foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <buffer_init>:
0: b9 80 00 00 00 mov $0x80,%ecx
5: 31 c0 xor %eax,%eax
7: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # e <buffer_init+0xe>
e: c7 05 00 00 00 00 01 movl $0x1,0x0(%rip) # 18 <buffer_init+0x18>
15: 00 00 00
18: f3 48 ab rep stos %rax,(%rdi)
1b: c3 ret
Компилятор поместил buffer_ready = 1 (movl $0x1,…) до цикла for (rep stos …).