2016-11-20 9 views
1

Пока я не должен перечислять весь 4-строчный образец, который я даю, (так как это вопрос с домашним заданием), я смущен, как это следует читать и переводить в C.x86-64 Сборка «cmovge» до кода C

cmovge %edi, %eax

То, что я понимаю, до сих пор является то, что команда представляет собой условный ход, когда результат> =. Он сравнивает первый параметр функции %edi с целым регистром %eax (которому было присвоено другое значение параметра %esi в предыдущей строке кода сборки). Однако я не понимаю его результата.

Моя проблема заключается в толковании оптимизированного кода. Он не манипулирует стеком, и я не уверен, как записать это в C (или, по крайней мере, переключатель gcc, который я мог бы использовать для создания того же результата при компиляции).

Не могли бы вы дать несколько небольших примеров того, как инструкция cmovge может перевести на C-код? Если это не имеет смысла в качестве собственной строки кода, не стесняйтесь что-то делать с этим.

Это сборка x86-64 через виртуальную операционную систему Linux (CentOS 7).

+0

Читали реф руководство insn: HTML извлечь здесь: http://escrow.aliexpress.com //www.felixcloutier .com/x86/CMOVcc.html. Дополнительные ссылки в [wiki для x86] (http://stackoverflow.com/tags/x86/info). –

ответ

2

Я, вероятно, дает вам все решения здесь:

int doit(int a, int b) { return a >= b ? a : b; } С gcc -O3 -masm=intel становится:

doit: 
.LFB0: 
    .cfi_startproc 
    cmp edi, esi 
    mov eax, esi 
    cmovge eax, edi 
    ret 
    .cfi_endproc 
+0

Это намного больше смысла, спасибо! И спасибо за переключатель '-O3', это большая помощь! –

+0

'a> = b? b: a; '? –

+2

@ Miharu461 (и Björn): не забывайте, что флаги могут исходить из чего угодно. Часть cmov действительно просто 'eax = больше? edi: eax', где 'bool more' может быть установлен любым, не обязательно с участием' a' или 'b'. Поэтому 'a = x> = y: b: a' все еще может компилироваться в cmovge. –