2014-10-26 2 views
0

У меня возникли проблемы с пониманием цикла в функции IsPrime. У меня в основном возникают проблемы с пониманием первых двух строк в коде. x86 сборка 32 бит. Стек размер 36. Существует вероятность того, что есть ошибка в кодеУ меня возникли проблемы с пониманием sarl в сборке

.L4:  #odd number 
movl 8(%ebp), %eax    #move arg(odd number) into eax 
movl %eax, -28(%ebp)    
movl $1431655766, -32(%ebp)  #having trouble understanding this line 
movl -32(%ebp), %edx 
imull -28(%ebp)          
movl %edx, %ecx 
movl -28(%ebp), %eax 
sarl $31, %edx     #and what this does 
movl %ecx, %edx 
subl %eax, %edx 
movl %edx, -24(%ebp) 
movl -24(%ebp), %eax 
addl %eax, %eax 
addl -24(%ebp), %eax 
movl -28(%ebp), %ecx 
subl %eax, %ecx 
movl %ecx, -24(%ebp) 
cmpl $0, -24(%ebp) 
jne .L7 
cmpl $3, 8(%ebp) 
jne .L6 
+0

Если это домашнее задание, и «A. Bhattacharjee» - ваш учитель, тогда брат, вы в беде! – Vaibhav

ответ

0

Я бы посоветовал компиляции с оптимизацией. Неоптимизированный код содержит много лишних хранилищ в стеке, затеняя важные инструкции. Не добавляйте в стог сена.
Теперь давайте рассмотрим программу:

.L4:  #odd number 
movl 8(%ebp), %eax   #move arg to eax register, which is an implicit 
           #operand of multiplication operations 
movl %eax, -28(%ebp)   #store arg to a local variable 
movl $1431655766, -32(%ebp) #store an immediate value to a local variable 
           #not terribly useful but OK 
movl -32(%ebp), %edx   #move local variable into edx before imul??? 
           #completely useless. 
imull -28(%ebp)    #imull calculates 64bit result of eax*local_var 
           #which is the same as eax, so eax*eax 
           #and stores the result in edx:eax, so the 
           #previous write to edx is 
           #unconditionally overwritten 
movl %edx, %ecx    #store high 32bits of the mul to ecx, OK 
movl -28(%ebp), %eax   #reload eax from stack var, OK 
sarl $31, %edx    #shift right by 31 arithmetically 
           #(~divide by 2 to the power of 31, 
           #preserving and extending the sign bit) 
           #also useless due to the next instruction: 
movl %ecx, %edx    #move ecx to edx. 
subl %eax, %edx 
movl %edx, -24(%ebp) 
movl -24(%ebp), %eax 
addl %eax, %eax 
addl -24(%ebp), %eax 
movl -28(%ebp), %ecx 
subl %eax, %ecx 
movl %ecx, -24(%ebp) 
cmpl $0, -24(%ebp) 
jne .L7 
cmpl $3, 8(%ebp) 
jne .L6 

Как вы видите, инструкции вы задавались вопросом о совершенно бесполезны, так как их побочные эффекты сразу же перезаписаны другими инструкциями, прежде чем они используются.
На самом деле, это настолько вопиющее, что мне нужно задаться вопросом, откуда пришел этот код.
Это может быть произведено действительно зверским компилятором, или это мусор вручную.
Опять же, используйте хороший компилятор и включите оптимизацию, код будет гораздо более разумным.

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