Re[5]: длинный переход (глобальные метки)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 31.03.02 11:42
Оценка:
Здравствуйте whiteForest, Вы писали:

F>Здравствуйте adontz, Вы писали:


VC++ очень правильно делает. Это в народе называется защита от дурака

объясняю подробно

есть некая функкция
void a(int x,float y) // возвращаемый тип значения не имеет
 {
  // some local variables here
  char z;
  // code

  __asm
   {

   label1:

   }

 }


её стековый кадр для stdcall напрмер

1 byte  // char  z
4 bytes // int   x
6 bytes // float y
4 bytes // адресс откуда вызвали a()


есть другая процедура
void b(char p)
 {
  // some local variables here
  long q;
  // code
  __asm
   {
    
    label2:
   
   }
 }


её стековый кадр

4 bytes // long q
1 byte  // char p
4 bytes // адрес откуда вызвали b()


Если перепрыгнуть с адреса label1 на label2, то поле работы процедуры будет очищено из стека 5 байт и процедура возвратит управления по адресу не тому откуда её вызывали а старшие 4 байта локальной переменной y типа float

Такие пререходы нарушают принцыпы структурного программирования на которых базируются C и C++ и не разрешены ни стандартом, ни компилятором, ни элементарной логикой
Такое позволяют только автономные ассемблеры tasm masm wasm
F>Если ответ Вам не известен, просьба не отвечать.

На вашем месте я бы
1) Ознакомлся с азами архитектуры Intel x86 процессоров прежде чем писать на ассемблере
2) Прочёл пару книг по структурному программированию и его преимуществам
3) защёл на сюда так как вы пока новичок на этом форуме и вам наверное не понятно что здесь люди привыкли уважать друг друга и писать сообщения в вежливой форме !!!
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.