-
Объясните пожалуйста, от чего зависит размер данных, помещаемых/извлекаемых из стэка командами push/pop?
-
От размера данных?
-
от разрядности цп
-
> Поросенок Винни-Пух © (03.07.08 16:12) [2]
ЦП, на котором компилировали, или на котором запущено приложение?
-
От размера элемента стека, в случае х86 процессора - ширина машинного слова...
4(четыре) - это количество пальцев на одной руке человека без физических недостатков исключая большой...
-
> Sick (03.07.08 16:15) [3]
А есть разница? :)
-
Zeqfreed © (03.07.08 16:19) [5]
В смысле?
-
> Sick (03.07.2008 16:02:00) [0]
От разрядности ОС и возможностями процессора, на 64 битном процессоре возможность 64 бита, но если ОС 32 бита, то и размер данных тоже 32 бита и это изменить нельзя.
-
> от разрядности цп
ъ?! это какэто? скажем, инструкции вида
PUSH r16 / POP r16
выполнятся одинаково и на двестивосьмидесятнике, и на core2duo.
что же насчёт помещения в стек одного байта - то под него резервируется аж двойное слово, и байт который нужно толкнуть в стек записывается в младший байт этого дв. слова
конструкции типа
PUSH/POP QWORD PTR []
пока не встречал. может быть, ia64 это и позволяет.
-
что же насчёт помещения в стек одного байта - то под него резервируется аж двойное слово, и байт который нужно толкнуть в стек записывается в младший байт этого дв. слова
Ты думаешь он спрашивал какой длины сам байт если его пушнуть в стек?
-
> [9] Поросенок Винни-Пух © (03.07.08 16:35)
По логике вещей, можно предположить что если запихнуть в стек 1 байт, то ESP тоже изменится всего на 1, а не на 4 сразу... может, вопрос был в этом? ©Telepator
-
> Anatoly Podgoretsky © (03.07.08 16:28) [7]
То есть выходит, зависит от ОС, на которой запущена программа, а от цп не зависит? Можно по-подробнее?
> Renegat (03.07.08 16:30) [8]
> что же насчёт помещения в стек одного байта - то под него
> резервируется аж двойное слово, и байт который нужно толкнуть
> в стек записывается в младший байт этого дв. слова
Это я понимаю, вопрос в том, от чего зависит размер слова
-
а от цп не зависит?
Ты спросил безотносительно компилятора и вообще чего либо.
Поэтому и было сказано, что от разрядности цп.
На восьмибитном синклере один размер, на i386 другой.
Либо задавай конкретные вопросы
-
> Поросенок Винни-Пух (03.07.2008 16:35:09) [9]
А ты думаешь он расскажет, что он спрашивал?
-
> То есть выходит, зависит от ОС, на которой запущена программа,
> а от цп не зависит
зависит от целевой ОС, указанной при компиляции.
Если компилируешь, скажем, под Win32, то на 64-битной винде программа запустится в подсистеме 32, и int там будет 32 бита
Так же и 16-битные приложения работают в 16-битном эмуляторе (WOW) на вин32
-
Это НЕ зависит ни от модели проца, ни от типа ОСи. А только от той команды, что ты использовал для помещения в стек того или иного регистра / участка памяти.
PUSH RAX
заставит указатель стека сместиться на 8 байт
PUSH EAX
- на 4
PUSH AX
- на 2
простите, байт втолкнуть непосредственно нельзя - просто это MASM брал на себя ответственность за MOVZX EAX, m8 -> PUSH EAX при компиляции макроса invoke
-
> clickmaker © (03.07.08 16:47) [14]
То есть если я компилирую на 32битной ос, но в настройках компилятора указываю 64битную, то на 64битной будет выделяться 4 байта, а на 32битной работать вообще не будет?
-
то есть 8 байт
-
Это НЕ зависит ни от модели проца, ни от типа ОСи. А только от той команды, что ты использовал для помещения в стек того или иного регистра / участка памяти.
PUSH RAX заставит указатель стека сместиться на 8 байт
PUSH EAX - на 4
PUSH AX - на 2
Остается найти в z80 PUSH EAX
-
[7] Anatoly Podgoretsky © (03.07.08 16:28)
> От разрядности ОС и возможностями процессора,
Чего то я не пойму, разве размер данных зависет от ОС?
64 битные команды под 32 разрядной ОС, разве не выполняются?
-
> Sick (03.07.08 16:02)
>
> Объясните пожалуйста, от чего зависит размер данных, помещаемых/извлекаемых
> из стэка командами push/pop?
Размером данные которые указываются для извлечения из стека. Например
POP AL - извлекает один байт
POP EAX - извлекает 4 байта
-
> [18] Поросенок Винни-Пух © (03.07.08 17:04)
Вам что, хочется меня подловить на некомпетентности? Хорошо. Просто я считал что это самоочевидные вещи. Естественно имелось в виду что, например, целерон не сможет понять
PUSH RAX
, итп. Но
PUSH AX
смогут обработать все интеловские процы от 8086 до современных многоядерников. Ни на одном из этих ЦП в стеке не будет зарезервировано более 2 байт.
-
Вам что, хочется меня подловить на некомпетентности? Хорошо.
А вам меня?
-
А хотя вроде можно извлекать минимум одно двухбайтовое слово
POP AX - извлечь слово из двух байт
То я с каким-то другим процессором спутал.
-
> [22] Поросенок Винни-Пух © (03.07.08 17:27)
Ну а как, по-вашему, скажется разрядность на команде помещения в стек 16-битного регистра?
ЗЫЖ:
> POP AL - извлекает один байт
POP AL - не компилируется
-
Да я ничего не имею против. Я просто настаиваю на том, что от разрядности цп тоже зависит. Просто не надо меня истолковывать так, что одна и та же инструкция на разных цп обязательно изменит стек на разное количество байт.
-
Хорошо, мир :) Надо только уточнить - от разрядности зависит размер, который потенциально можно зарезервировать/освободить за 1 push/pop соответственно.
-
Кто-нибудь ответит на [16] и [19]?
-
> [27] Sick (03.07.08 17:46)
Под 32-разрядную систему откомпиленный в расчёте на 64-разрядную систему код просто не пойдёт, независимо от модели ЦП. Ибо модели памяти в первом и втором случае разнятся кардинально. Даже если под win32 удастся создать i64-проге процесс (что само по себе извращение =P), его срубит на вызове первой API-функции, вместе с ОСью.
А 64-разрядные команды можно выполнять только если прога скомпилена под i64. Впрочем, наверняка возможно, пользуясь win32 под 64-разрядный проц, тупо прописать вызов каких-либо i64 команд из-под отладчика, в рантайме... Однако лично мне попробовать не довелось. Моя есть зело консервативен и пока ещё недостаточно богат для полного апгрейда %)
ЗЫЖ: А главное - нахрена в принципе ставить win32 на i64 - вот в чём вопрос?
-
> Renegat (03.07.08 18:12) [28]
То есть если у меня есть 64разрядный компилятор, но цп и ос 32разрядные (на компе, где стоит компилятор), я не смогу получить 64битный код?
-
> я не смогу получить 64битный код?
если это компилятор, работающий под i32 и генерящий i64 код - то сможете. Иначе - нет.
-
> Renegat
Теперь вроде всё понятно, спасибо.
-
> ЗЫЖ: А главное - нахрена в принципе ставить win32 на i64
> - вот в чём вопрос?
на ia64 простой Win32 (который i386) и даже Win64 (который AMD64) не пойдёт. Ибо ia64 это itanium, который неслегка VLIW.
> я не смогу получить 64битный код?
Я и под ARM9 нормально из под win32 и Win64 компилировал. Фокус проходит. Просто для отладки стратует эмулятор.
ЗЫ: под Win32 из под Win64 - отладка идёт а обратно нет. Сам понимаешь почему.