Показать сообщение отдельно
Старый 15.06.2002, 03:33
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 8  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
обращайтесь...


напоследок я все-таки приведу этот кусочек кода c ошибкой... мало ли кому интересно...

из выражения a = 0*++1.2345; при трансляции получается:

push 'a', 0.0, 1.2345
increment
setRegister r:0
setVariable
push r:0
multiply
setVariable


расшифруем:

push 'a', 0.0, 1.2345 // имя и два числа заносиятся в стэк
increment // операция берет верхнее в стэке значение и увеличивает его на 1 прямо в стэке (т е 1.2345+1)
setRegister r:0 // в регистр r0 помещаем верхнее в стэке значение (т е 2.2345)
setVariable // берем последнее в стэке значение и запихиваем его в переменную с именем равному предпоследнему в стэке значению (в данном случае 0.0 = 2.2345 - уже хорошо ) после присвоения операнды из стэка удаляются
push r:0 // заносим в стэк то, что до этого положили в регистр r0 (это было 2.2345)
multiply // перемножаем два оставшихся в стэке операнда (то есть 'a'*2.2345 ) и результат кладем в стэк...
setVariable // проделываем такую же операцию как см. выше... но учитывая, что в стэке у нас всего один операнд в данный момент (да и тот пустой ) - получаем полную лажу


Последний раз редактировалось Nox Noctis; 15.06.2002 в 03:42.