Конференция "Прочее" » Вопрос по стэку
 
  • Sick (03.07.08 16:02) [0]
    Объясните пожалуйста, от чего зависит размер данных, помещаемых/извлекаемых из стэка командами push/pop?
  • AndreyV © (03.07.08 16:12) [1]
    От размера данных?
  • Поросенок Винни-Пух © (03.07.08 16:12) [2]
    от разрядности цп
  • Sick (03.07.08 16:15) [3]

    > Поросенок Винни-Пух ©   (03.07.08 16:12) [2]

    ЦП, на котором компилировали, или на котором запущено приложение?
  • han_malign © (03.07.08 16:18) [4]
    От размера элемента стека, в случае х86 процессора - ширина машинного слова...

    4(четыре) - это количество пальцев на одной руке человека без физических недостатков исключая большой...
  • Zeqfreed © (03.07.08 16:19) [5]
    > Sick   (03.07.08 16:15) [3]

    А есть разница? :)
  • Sick (03.07.08 16:26) [6]
    Zeqfreed ©   (03.07.08 16:19) [5]
    В смысле?
  • Anatoly Podgoretsky © (03.07.08 16:28) [7]
    > Sick  (03.07.2008 16:02:00)  [0]

    От разрядности ОС и возможностями процессора, на 64 битном процессоре возможность 64 бита, но если ОС 32 бита, то и размер данных тоже 32 бита и это изменить нельзя.
  • Renegat (03.07.08 16:30) [8]
    > от разрядности цп

    ъ?! это какэто? скажем, инструкции вида
    PUSH r16 / POP r16


    выполнятся одинаково и на двестивосьмидесятнике, и на core2duo.

    что же насчёт помещения в стек одного байта - то под него резервируется аж двойное слово, и байт который нужно толкнуть в стек записывается в младший байт этого дв. слова

    конструкции типа
    PUSH/POP QWORD PTR []

    пока не встречал. может быть, ia64 это и позволяет.
  • Поросенок Винни-Пух © (03.07.08 16:35) [9]
    что же насчёт помещения в стек одного байта - то под него резервируется аж двойное слово, и байт который нужно толкнуть в стек записывается в младший байт этого дв. слова

    Ты думаешь он спрашивал какой длины сам байт если его пушнуть в стек?
  • Renegat (03.07.08 16:39) [10]
    > [9] Поросенок Винни-Пух ©   (03.07.08 16:35)

    По логике вещей, можно предположить что если запихнуть в стек 1 байт, то ESP тоже изменится всего на 1, а не на 4 сразу... может, вопрос был в этом? ©Telepator
  • Sick (03.07.08 16:39) [11]

    > Anatoly Podgoretsky ©   (03.07.08 16:28) [7]

    То есть выходит, зависит от ОС, на которой запущена программа, а от цп не зависит? Можно по-подробнее?


    > Renegat   (03.07.08 16:30) [8]
    > что же насчёт помещения в стек одного байта - то под него
    > резервируется аж двойное слово, и байт который нужно толкнуть
    > в стек записывается в младший байт этого дв. слова

    Это я понимаю, вопрос в том, от чего зависит размер слова
  • Поросенок Винни-Пух © (03.07.08 16:43) [12]
    а от цп не зависит?

    Ты спросил безотносительно компилятора и вообще чего либо.
    Поэтому и было сказано, что от разрядности цп.
    На восьмибитном синклере один размер, на i386 другой.
    Либо задавай конкретные вопросы
  • Anatoly Podgoretsky © (03.07.08 16:44) [13]
    > Поросенок Винни-Пух  (03.07.2008 16:35:09)  [9]

    А ты думаешь он расскажет, что он спрашивал?
  • clickmaker © (03.07.08 16:47) [14]
    > То есть выходит, зависит от ОС, на которой запущена программа,
    > а от цп не зависит

    зависит от целевой ОС, указанной при компиляции.
    Если компилируешь, скажем, под Win32, то на 64-битной винде программа запустится в подсистеме 32, и int там будет 32 бита
    Так же и 16-битные приложения работают в 16-битном эмуляторе (WOW) на вин32
  • Renegat (03.07.08 16:49) [15]
    Это НЕ зависит ни от модели проца, ни от типа ОСи. А только от той команды, что ты использовал для помещения в стек того или иного регистра / участка памяти.
    PUSH RAX

    заставит указатель стека сместиться на 8 байт
    PUSH EAX

    - на 4
    PUSH AX

    - на 2

    простите, байт втолкнуть непосредственно нельзя - просто это MASM брал на себя ответственность за MOVZX EAX, m8 -> PUSH EAX при компиляции макроса invoke
  • Sick (03.07.08 16:59) [16]

    > clickmaker ©   (03.07.08 16:47) [14]

    То есть если я компилирую на 32битной ос, но в настройках компилятора указываю 64битную, то на 64битной будет выделяться 4 байта, а на 32битной работать вообще не будет?
  • Sick (03.07.08 17:01) [17]
    то есть 8 байт
  • Поросенок Винни-Пух © (03.07.08 17:04) [18]
    Это НЕ зависит ни от модели проца, ни от типа ОСи. А только от той команды, что ты использовал для помещения в стек того или иного регистра / участка памяти.
    PUSH RAX заставит указатель стека сместиться на 8 байт
    PUSH EAX - на 4
    PUSH AX - на 2


    Остается найти в z80 PUSH EAX
  • atruhin1 (03.07.08 17:09) [19]
    [7] Anatoly Podgoretsky ©   (03.07.08 16:28)
    > От разрядности ОС и возможностями процессора,

    Чего то я не пойму, разве размер данных зависет от ОС?
    64 битные команды под 32 разрядной ОС, разве не выполняются?
  • Хохол (03.07.08 17:26) [20]

    > Sick   (03.07.08 16:02)
    >
    > Объясните пожалуйста, от чего зависит размер данных, помещаемых/извлекаемых
    > из стэка командами push/pop?


    Размером данные которые указываются для извлечения из стека. Например
    POP AL - извлекает один байт
    POP EAX - извлекает 4 байта
  • Renegat (03.07.08 17:26) [21]
    > [18] Поросенок Винни-Пух ©   (03.07.08 17:04)

    Вам что, хочется меня подловить на некомпетентности? Хорошо. Просто я считал что это самоочевидные вещи. Естественно имелось в виду что, например, целерон не сможет понять
    PUSH RAX

    , итп. Но
    PUSH AX

    смогут обработать все интеловские процы от 8086 до современных многоядерников. Ни на одном из этих ЦП в стеке не будет зарезервировано более 2 байт.
  • Поросенок Винни-Пух © (03.07.08 17:27) [22]
    Вам что, хочется меня подловить на некомпетентности? Хорошо.

    А вам меня?
  • Хохол (03.07.08 17:30) [23]
    А хотя вроде можно извлекать минимум одно двухбайтовое слово
    POP AX - извлечь слово из двух байт

    То я с каким-то другим процессором спутал.
  • Renegat (03.07.08 17:31) [24]
    > [22] Поросенок Винни-Пух ©   (03.07.08 17:27)

    Ну а как, по-вашему, скажется разрядность на команде помещения в стек 16-битного регистра?

    ЗЫЖ:
    > POP AL - извлекает один байт

    POP AL - не компилируется
  • Поросенок Винни-Пух © (03.07.08 17:39) [25]
    Да я ничего не имею против. Я просто настаиваю на том, что от разрядности цп тоже зависит. Просто не надо меня истолковывать так, что одна и та же инструкция на разных цп обязательно изменит стек на разное количество байт.
  • Renegat (03.07.08 17:44) [26]
    Хорошо, мир :) Надо только уточнить - от разрядности зависит размер, который потенциально можно зарезервировать/освободить за 1 push/pop соответственно.
  • Sick (03.07.08 17:46) [27]
    Кто-нибудь ответит на [16] и [19]?
  • Renegat (03.07.08 18:12) [28]
    > [27] Sick   (03.07.08 17:46)

    Под 32-разрядную систему откомпиленный в расчёте на 64-разрядную систему код просто не пойдёт, независимо от модели ЦП. Ибо модели памяти в первом и втором случае разнятся кардинально. Даже если под win32 удастся создать i64-проге процесс (что само по себе извращение =P), его срубит на вызове первой API-функции, вместе с ОСью.

    А 64-разрядные команды можно выполнять только если прога скомпилена под i64. Впрочем, наверняка возможно, пользуясь win32 под 64-разрядный проц, тупо прописать вызов каких-либо i64 команд из-под отладчика, в рантайме... Однако лично мне попробовать не довелось. Моя есть зело консервативен и пока ещё недостаточно богат для полного апгрейда %)

    ЗЫЖ: А главное - нахрена в принципе ставить win32 на i64 - вот в чём вопрос?
  • Sick (03.07.08 18:31) [29]

    > Renegat   (03.07.08 18:12) [28]

    То есть если у меня есть 64разрядный компилятор, но цп и ос 32разрядные (на компе, где стоит компилятор), я не смогу получить 64битный код?
  • Renegat (03.07.08 18:41) [30]
    > я не смогу получить 64битный код?

    если это компилятор, работающий под i32 и генерящий i64 код - то сможете. Иначе - нет.
  • Sick (03.07.08 18:46) [31]

    > Renegat  

    Теперь вроде всё понятно, спасибо.
  • tesseract © (03.07.08 21:06) [32]

    > ЗЫЖ: А главное - нахрена в принципе ставить win32 на i64
    > - вот в чём вопрос?


    на ia64 простой Win32 (который i386) и даже Win64 (который AMD64) не пойдёт. Ибо ia64 это itanium, который неслегка VLIW.


    > я не смогу получить 64битный код?


    Я и под ARM9 нормально из под win32 и Win64 компилировал. Фокус проходит. Просто для отладки стратует эмулятор.
    ЗЫ:  под Win32 из под Win64 - отладка идёт а обратно нет. Сам понимаешь почему.
 
Конференция "Прочее" » Вопрос по стэку
Есть новые Нет новых   [134439   +36][b:0][p:0.001]