[sisyphus] Сборка FORTRAN-программ
Sergei Epiphanov
serpiph на nikiet.ru
Пн Июн 27 10:00:16 UTC 2011
В сообщении от 27 июня 2011 13:27:46 автор Andrey Liakhovets написал:
> Предположительно, компилятор молча игнорирует некорректный "DO I=400",
> после чего "END DO" он действительно не ожидает :)
Странный игнор, не так ли? Бага в компиляторе? А с '-ffree-form' ругань есть.
Кстати, я сейчас вывел в ассемблер ('gfortran -S -o test.S -ffixed-form
test.for') оба варианта:
1)
PROGRAM test
INTEGER(4) I
DO 1 I=400
1 WRITE(*,*)I
END PROGRAM
2)
PROGRAM test
INTEGER(4) I
DO I=1,400
WRITE(*,*)I
END DO
END PROGRAM
Разница огромная. Очень интересно взглянуть на diff полученных текстов. Во-
первых, нет обработчика цикла после WRITE (как Вы правльно заметили). Но вот
эти команды меня поставили в ступор:
movl $0x43c80000, %eax
movl %eax, -356(%ebp)
movl $.LC1, -344(%ebp)
где:
.LC1 - указатель на строку 'test.for'
Для сравнения у второй программы это звучит так:
movl $1, -356(%ebp)
movl -356(%ebp), %eax
cmpl $400, %eax
jg .L1
jmp .L3
где:
.L1 - пропуск цикла
.L3 - точка начала цикла
"Шок - это по-нашему".
--
С уважением, Епифанов Сергей
Подробная информация о списке рассылки Sisyphus