Форум: "Прочее";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
ВнизВопрос по стэку Найти похожие ветки
← →
Sick (2008-07-03 16:02) [0]Объясните пожалуйста, от чего зависит размер данных, помещаемых/извлекаемых из стэка командами push/pop?
← →
AndreyV © (2008-07-03 16:12) [1]От размера данных?
← →
Поросенок Винни-Пух © (2008-07-03 16:12) [2]от разрядности цп
← →
Sick (2008-07-03 16:15) [3]
> Поросенок Винни-Пух © (03.07.08 16:12) [2]
ЦП, на котором компилировали, или на котором запущено приложение?
← →
han_malign © (2008-07-03 16:18) [4]От размера элемента стека, в случае х86 процессора - ширина машинного слова...
4(четыре) - это количество пальцев на одной руке человека без физических недостатков исключая большой...
← →
Zeqfreed © (2008-07-03 16:19) [5]> Sick (03.07.08 16:15) [3]
А есть разница? :)
← →
Sick (2008-07-03 16:26) [6]Zeqfreed © (03.07.08 16:19) [5]
В смысле?
← →
Anatoly Podgoretsky © (2008-07-03 16:28) [7]> Sick (03.07.2008 16:02:00) [0]
От разрядности ОС и возможностями процессора, на 64 битном процессоре возможность 64 бита, но если ОС 32 бита, то и размер данных тоже 32 бита и это изменить нельзя.
← →
Renegat (2008-07-03 16:30) [8]> от разрядности цп
ъ?! это какэто? скажем, инструкции видаPUSH r16 / POP r16
выполнятся одинаково и на двестивосьмидесятнике, и на core2duo.
что же насчёт помещения в стек одного байта - то под него резервируется аж двойное слово, и байт который нужно толкнуть в стек записывается в младший байт этого дв. слова
конструкции типаPUSH/POP QWORD PTR []
пока не встречал. может быть, ia64 это и позволяет.
← →
Поросенок Винни-Пух © (2008-07-03 16:35) [9]что же насчёт помещения в стек одного байта - то под него резервируется аж двойное слово, и байт который нужно толкнуть в стек записывается в младший байт этого дв. слова
Ты думаешь он спрашивал какой длины сам байт если его пушнуть в стек?
← →
Renegat (2008-07-03 16:39) [10]> [9] Поросенок Винни-Пух © (03.07.08 16:35)
По логике вещей, можно предположить что если запихнуть в стек 1 байт, то ESP тоже изменится всего на 1, а не на 4 сразу... может, вопрос был в этом? ©Telepator
← →
Sick (2008-07-03 16:39) [11]
> Anatoly Podgoretsky © (03.07.08 16:28) [7]
То есть выходит, зависит от ОС, на которой запущена программа, а от цп не зависит? Можно по-подробнее?
> Renegat (03.07.08 16:30) [8]
> что же насчёт помещения в стек одного байта - то под него
> резервируется аж двойное слово, и байт который нужно толкнуть
> в стек записывается в младший байт этого дв. слова
Это я понимаю, вопрос в том, от чего зависит размер слова
← →
Поросенок Винни-Пух © (2008-07-03 16:43) [12]а от цп не зависит?
Ты спросил безотносительно компилятора и вообще чего либо.
Поэтому и было сказано, что от разрядности цп.
На восьмибитном синклере один размер, на i386 другой.
Либо задавай конкретные вопросы
← →
Anatoly Podgoretsky © (2008-07-03 16:44) [13]> Поросенок Винни-Пух (03.07.2008 16:35:09) [9]
А ты думаешь он расскажет, что он спрашивал?
← →
clickmaker © (2008-07-03 16:47) [14]> То есть выходит, зависит от ОС, на которой запущена программа,
> а от цп не зависит
зависит от целевой ОС, указанной при компиляции.
Если компилируешь, скажем, под Win32, то на 64-битной винде программа запустится в подсистеме 32, и int там будет 32 бита
Так же и 16-битные приложения работают в 16-битном эмуляторе (WOW) на вин32
← →
Renegat (2008-07-03 16:49) [15]Это НЕ зависит ни от модели проца, ни от типа ОСи. А только от той команды, что ты использовал для помещения в стек того или иного регистра / участка памяти.
PUSH RAX
заставит указатель стека сместиться на 8 байтPUSH EAX
- на 4PUSH AX
- на 2
простите, байт втолкнуть непосредственно нельзя - просто это MASM брал на себя ответственность за MOVZX EAX, m8 -> PUSH EAX при компиляции макроса invoke
← →
Sick (2008-07-03 16:59) [16]
> clickmaker © (03.07.08 16:47) [14]
То есть если я компилирую на 32битной ос, но в настройках компилятора указываю 64битную, то на 64битной будет выделяться 4 байта, а на 32битной работать вообще не будет?
← →
Sick (2008-07-03 17:01) [17]то есть 8 байт
← →
Поросенок Винни-Пух © (2008-07-03 17:04) [18]Это НЕ зависит ни от модели проца, ни от типа ОСи. А только от той команды, что ты использовал для помещения в стек того или иного регистра / участка памяти.
PUSH RAX заставит указатель стека сместиться на 8 байт
PUSH EAX - на 4
PUSH AX - на 2
Остается найти в z80 PUSH EAX
← →
atruhin1 (2008-07-03 17:09) [19][7] Anatoly Podgoretsky © (03.07.08 16:28)
> От разрядности ОС и возможностями процессора,
Чего то я не пойму, разве размер данных зависет от ОС?
64 битные команды под 32 разрядной ОС, разве не выполняются?
← →
Хохол (2008-07-03 17:26) [20]
> Sick (03.07.08 16:02)
>
> Объясните пожалуйста, от чего зависит размер данных, помещаемых/извлекаемых
> из стэка командами push/pop?
Размером данные которые указываются для извлечения из стека. Например
POP AL - извлекает один байт
POP EAX - извлекает 4 байта
← →
Renegat (2008-07-03 17:26) [21]> [18] Поросенок Винни-Пух © (03.07.08 17:04)
Вам что, хочется меня подловить на некомпетентности? Хорошо. Просто я считал что это самоочевидные вещи. Естественно имелось в виду что, например, целерон не сможет понятьPUSH RAX
, итп. НоPUSH AX
смогут обработать все интеловские процы от 8086 до современных многоядерников. Ни на одном из этих ЦП в стеке не будет зарезервировано более 2 байт.
← →
Поросенок Винни-Пух © (2008-07-03 17:27) [22]Вам что, хочется меня подловить на некомпетентности? Хорошо.
А вам меня?
← →
Хохол (2008-07-03 17:30) [23]А хотя вроде можно извлекать минимум одно двухбайтовое слово
POP AX - извлечь слово из двух байт
То я с каким-то другим процессором спутал.
← →
Renegat (2008-07-03 17:31) [24]> [22] Поросенок Винни-Пух © (03.07.08 17:27)
Ну а как, по-вашему, скажется разрядность на команде помещения в стек 16-битного регистра?
ЗЫЖ:
> POP AL - извлекает один байт
POP AL - не компилируется
← →
Поросенок Винни-Пух © (2008-07-03 17:39) [25]Да я ничего не имею против. Я просто настаиваю на том, что от разрядности цп тоже зависит. Просто не надо меня истолковывать так, что одна и та же инструкция на разных цп обязательно изменит стек на разное количество байт.
← →
Renegat (2008-07-03 17:44) [26]Хорошо, мир :) Надо только уточнить - от разрядности зависит размер, который потенциально можно зарезервировать/освободить за 1 push/pop соответственно.
← →
Sick (2008-07-03 17:46) [27]Кто-нибудь ответит на [16] и [19]?
← →
Renegat (2008-07-03 18:12) [28]> [27] Sick (03.07.08 17:46)
Под 32-разрядную систему откомпиленный в расчёте на 64-разрядную систему код просто не пойдёт, независимо от модели ЦП. Ибо модели памяти в первом и втором случае разнятся кардинально. Даже если под win32 удастся создать i64-проге процесс (что само по себе извращение =P), его срубит на вызове первой API-функции, вместе с ОСью.
А 64-разрядные команды можно выполнять только если прога скомпилена под i64. Впрочем, наверняка возможно, пользуясь win32 под 64-разрядный проц, тупо прописать вызов каких-либо i64 команд из-под отладчика, в рантайме... Однако лично мне попробовать не довелось. Моя есть зело консервативен и пока ещё недостаточно богат для полного апгрейда %)
ЗЫЖ: А главное - нахрена в принципе ставить win32 на i64 - вот в чём вопрос?
← →
Sick (2008-07-03 18:31) [29]
> Renegat (03.07.08 18:12) [28]
То есть если у меня есть 64разрядный компилятор, но цп и ос 32разрядные (на компе, где стоит компилятор), я не смогу получить 64битный код?
← →
Renegat (2008-07-03 18:41) [30]> я не смогу получить 64битный код?
если это компилятор, работающий под i32 и генерящий i64 код - то сможете. Иначе - нет.
← →
Sick (2008-07-03 18:46) [31]
> Renegat
Теперь вроде всё понятно, спасибо.
← →
tesseract © (2008-07-03 21:06) [32]
> ЗЫЖ: А главное - нахрена в принципе ставить win32 на i64
> - вот в чём вопрос?
на ia64 простой Win32 (который i386) и даже Win64 (который AMD64) не пойдёт. Ибо ia64 это itanium, который неслегка VLIW.
> я не смогу получить 64битный код?
Я и под ARM9 нормально из под win32 и Win64 компилировал. Фокус проходит. Просто для отладки стратует эмулятор.
ЗЫ: под Win32 из под Win64 - отладка идёт а обратно нет. Сам понимаешь почему.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.037 c