Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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 - на 4
PUSH 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
3-1204262172
Kehnzo
2008-02-29 08:16
2008.08.24
Вопросы по DBGrid


2-1216723921
Нов_и_чок
2008-07-22 14:52
2008.08.24
Программное выкл. компа


15-1213103548
auslogics
2008-06-10 17:12
2008.08.24
требуется программист Delphi


6-1192402936
Hero
2007-10-15 03:02
2008.08.24
передача видео


15-1215396749
Slider007
2008-07-07 06:12
2008.08.24
С днем рождения ! 7 июля 2008 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский