Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

Вопрос по стэку   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
15-1215601167
SoundB
2008-07-09 14:59
2008.08.24
SQL


2-1216369728
Сергей
2008-07-18 12:28
2008.08.24
Как в DBGrid отменить выделение ячеек?


15-1215112003
@!!ex
2008-07-03 23:06
2008.08.24
Как влезть в память приложения?


2-1216282915
Артур Пирожков
2008-07-17 12:21
2008.08.24
Проблемы с Tidftp


4-1194943868
Niki
2007-11-13 11:51
2008.08.24
ListBox