Я написал две программы
#include<stdio.h>
int main()
{
int i = 5;
return 0;
}
Его ассемблерный код, сгенерированный для PowerPC архитектуры код 1
.file "hello.c"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-32(1)
stw 31,28(1)
mr 31,1
li 0,5
stw 0,8(31)
li 0,0
mr 3,0
lwz 11,0(1)
lwz 31,-4(11)
mr 1,11
blr
.size main, .-main
.ident "GCC: (GNU) 4.2.2"
.section .note.GNU-stack,"",@progbits
Второй код
#include<stdio.h>
int main()
{
int i = 5;
i = i<<1;
return 0;
}
Моя сборка код, сгенерированный для PowerPC архитектуры кода 2 -
.file "hello.c"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-32(1)
stw 31,28(1)
mr 31,1
li 0,5
stw 0,8(31)
lwz 0,8(31) // extra
slwi 0,0,1 // extra
stw 0,8(31) // extra
li 0,0
mr 3,0
lwz 11,0(1)
lwz 31,-4(11)
mr 1,11
blr
.size main, .-main
.ident "GCC: (GNU) 4.2.2"
.section .note.GNU-stack,"",@progbits
Вы видите, есть три дополнительные Instruction, поэтому операция не является атомарной
Я также скомпилирован это на i7 ПК Intel. Вот результаты:
ассемблерный код генерируется для первого кода: код
.file "hello.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $5, -4(%rbp)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
Сборка Генерация кода 2:
.file "hello.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $5, -4(%rbp)
sall -4(%rbp) // only one extra instruction
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section .note.GNU-stack,"",@progbits
Итак, я понимаю, что, ответ зависит от архитектуры мы используются.
Если процессор не имеет инструкции с несколькими бит-сдвигами, то он не может. –
Как вы могли бы рассказать? –
Скомпилируйте файл для нужной арки, разоберите и найдите инструкцию, с которой она собрана. И есть ваш ответ, для этого комбо-компилятора. – Shark