2016-11-02 2 views
1

У меня с трудом понимается условный код в сборке. Справа для funA() слева, но у меня возникают проблемы с строками 3-4 в сборке.Условные флаги сборки - cmp, test

Вот мой мыслительный процесс:

cmp rax, rcx // a[idx] <= *b 

Однако фактическое если оператор в коде прямо противоположное. Я знаю, что это имеет какое-то отношение к тому, как в сборке, условное исполнение обратное ... поэтому оно делает вместо [idx]> * b. Связано ли это с «jle»? Кто-нибудь подумал бы об этом?

enter image description hereenter image description here

+0

Как это связано с C#? – fuz

+0

Он просто хотел привлечь внимание Джона Скита: D – Jester

ответ

2

Если посмотреть на .L1 и .L2, ЛТ-компилятор просто решил изменить порядок - это положить else код первым, и обратное условие. jle является «переход, если меньше или равно», так что это стало эквивалентом C#:

if (a[idx] <= *b) 
{ 
    *b = *b + *b; 
} 
else 
{ 
    *b = a[idx]; 
} 
+0

спасибо! что делает намного больше смысла, когда это выписано так. Я обязательно сделаю это в следующий раз, чтобы не смутить себя. – helloworld

Смежные вопросы