Мне нужна помощь в интерпретации этого ассемблерного кода.
Учитывая, что он напоминает тройной вложенный блок if. Пусть num = 0x708, flag = -1;
Первое условие простое, if(num& 0x3 == 0)
. Однако следующие второе и третье условия являются длительными; операции одинаковы, но цифры разные. Что-нибудь значимое, что эти два условия делают, или они просто список случайных команд?
<+0>: push %rbp
<+1>: mov %rsp,%rbp
<+4>: movl $0x708,-0x8(%rbp)
<+11>: movl $0xffffffff,-0x4(%rbp)
<+18>: mov -0x8(%rbp),%eax
<+21>: and $0x3,%eax
<+24>: test %eax,%eax <====first condition
<+26>: jne <main+128>
<+28>: mov -0x8(%rbp),%ecx
<+31>: mov $0x51eb851f,%edx
<+36>: mov %ecx,%eax
<+38>: imul %edx
<+40>: sar $0x5,%edx
<+43>: mov %ecx,%eax
<+45>: sar $0x1f,%eax
<+48>: sub %eax,%edx
<+50>: mov %edx,%eax
<+52>: imul $0x64,%eax,%eax
<+55>: sub %eax,%ecx
<+57>: mov %ecx,%eax
<+59>: test %eax,%eax <====second condition
<+61>: jne <main+119>
<+63>: mov -0x8(%rbp),%ecx
<+66>: mov $0x51eb851f,%edx
<+71>: mov %ecx,%eax
<+73>: imul %edx
<+75>: sar $0x7,%edx
<+78>: mov %ecx,%eax
<+80>: sar $0x1f,%eax
<+83>: sub %eax,%edx
<+85>: mov %edx,%eax
<+87>: imul $0x190,%eax,%eax
<+93>: sub %eax,%ecx
<+95>: mov %ecx,%eax
<+97>: test %eax,%eax <========third condition
<+99>: jne <main+110>
…