i8080 help.

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Один из придурков придумал загружать вполне нормальный сегментный регистр [BP] (Base Pointer) значением стекового регистра [SP] (Stack Pointer) и начал передавать параметры в стеке. Остальные подхватили и теперь, спустя 40 лет, мы имеем фундаментальную уязвимость в порче стека, потому как все нынешние компиляторы используют этот прием. А использовали бы [BP] по назначению, разделив область данных и кода, и не было бы проблем и технологии DEP.
Ну да - ты Дон Кихот, весь в белом... а все остальные... хм... - гомосексуалисты (мягко скажем).
И чего они тебя, "придурки", не спросили 40 лет назад? Да сейчас как-то в твоих советах не нуждаются...

Скажу больше - они и не переживают, что нынешними компиляторами, обеспечивающими
"фундаментальную уязвимость в порче стека" ты, вероятно, не пользуешься...

Ты ведь пользуешься своими самодельными компиляторами, Хардушечка, которые
ну никак не "доставляют", да?
Last edited by Lavr on 20 May 2013 10:06, edited 1 time in total.
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Ну вот теперь можно определенно сказать, что у тебя есть свой говнокомпилятор с говнометодом и теперь тебя жаба душит, что ты не смог сделать правильно и пошел по стопам ушлепков из 70х. Я ничего не пропустил, да Лаврушка? Давай, подсыпь еще.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote: Давай, подсыпь еще.
А зачем? Из тебя добро и так хлещет... я с улыбкой молча за тобой понаблюдаю... :wink:

Я давно обратил внимание на твою приверженность к экскрементам и их источнику.
Но это не мои аргументы в дискуссии... может они админу кажутся достойными
технического форума терминами... :-?
iLavr
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

HardWareMan wrote:Один из придурков придумал загружать вполне нормальный сегментный регистр [BP] (Base Pointer) значением стекового регистра [SP] (Stack Pointer) и начал передавать параметры в стеке.
Я думаю, что этот же "придурок" придумал и регистр BP.

BP по умолчанию адресуется в сегменте стека (SS), а адресации по SP просто не было. К тому же было две команды enter, leave, которые изменяли SP, BP.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

vinxru wrote:
HardWareMan wrote:Один из придурков придумал загружать вполне нормальный сегментный регистр [BP] (Base Pointer) значением стекового регистра [SP] (Stack Pointer) и начал передавать параметры в стеке.
Я думаю, что этот же "придурок" придумал и регистр BP.

BP по умолчанию адресуется в сегменте стека (SS), а адресации по SP просто не было. К тому же было две команды enter, leave, которые изменяли SP, BP.
Не поленился и расчехлил Зубкова.
Команда: ENTER размер, уровень
Назначение: Вход в процедуру
Процессор: 80186

Команда ENTER создает стековый кадр заданного размера и уровня вложенности (оба операнда — числа; уровень вложенности может принимать значения только от 0 до 31) для вызова процедуры, использующей динамическое распределение памяти в стеке для своих локальных переменных.

Команда: LEAVE
Назначение: Выход из процедуры
Процессор: 80186

Команда LEAVE выполняет действия, обратные команде ENTER. Фактически эта команда только копирует содержимое ЕВР в ESP, тем самым выбрасывая из стека весь кадр, созданный последней выполненной командой ENTER, и считывает из стека ЕВР для предыдущей процедуры, что одновременно восстанавливает и значение, которое имел ESP до вызова последней команды ENTER.
А [BP] был еще в 8086. Т.е., это аппаратчики пошли на поводу у нердов-ушлепков, именовавших себя программистами, и сделали для их удобства 2 новые команды. Что мешало распиливать кучу для локальных переменных? Ведь тогда данные были бы далеко от кода и в случае порчи программа бы не передавала управление на данные, чем сейчас так пользуются вирусы, вызывая "переполнение буфера", которое заложено фундаментально в архитектуру.
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Кстати этими командами почти никто не пользовался. Я точных причин не знаю.
Maks
Junior
Posts: 3
Joined: 19 May 2013 13:05
Location: 85.234.168.94

Post by Maks »

Спасибо всем огромнейшее. Буду теперь сидеть и разбираться. :D
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

куясе вы тут настрочили :o
Если возражений по качеству перевода нет, то я на минуту соглашаюсь
с твоей точкой зрения:
выполнив операцию XTHL - я забрал в HL вершину стека - так ведь?

Quote:
Exchange stack top with H and L

То есть stack top - у меня теперь находится в HL!

А что тогда находится там, куда я содержимое HL положил, а?
Ну там, куда регистр SP по прежнему указывает?

HardWareMan wrote:
Вершиной стека называют именно последний элемент в куче,...

Но я ведь следуя твоей логике забрал его в HL - разве нет?
Теперь у нас образовалось два stack top - один лежит в HL, а другой - "именно
последний элемент в куче"?


Ну так значит подмена понятий есть, и она вот в этой фразе:
Exchange stack top with H and L

Не обмен "вершины стека" (stack top), а обмен "содержимого вершины стека" здесь.
Потому как дальше - объяснение совершенно верное: везде упоминается "content",
что, собственно, и есть "содержимое" или "значение".
даже не знаю, смеяться или плакать :-?

2Maks, nedopc.org весело и вкусно.
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Lavr wrote:
Mixa64 wrote:Согласен, задача дурная. Стек сущность безадресная, записать в стек по адресу - фраза странная.
Я не хочу угадывать за топикстартера, что там имелось в виду, но всё, что ты
пишешь дальше - спорно.
Мож быть, мож быть, я скорее про отсутствие смысла за адресами стека в задании.
Приведу пример - обращение к подпрограмме на ассемблере из Паскаля:

Code: Select all

CODE		SEGMENT byte public
ASSUME cs:CODE
PUBLIC AbsFunc
AbsFunc	PROC near	; вызов при помощи ближнего CALL
     push bp
     mov  bp,sp
     mov  ax,[bp+4]	; AX = значение параметра
     cwd
     xor  ax,dx
     sub  ax,dx		; AX содержит результат
     mov  [bp+4],ax
     pop  bp
     ret  2		; ближний возврат
AbsFunc	ENDP
CODE		ENDS
Параметры передаются через область стека и возвращаются через неё же.
Есть соглашение о их передаче и возвращают их не через вершину стека,
а через определённые адреса.
Ну, здесь как бы другой коленкор, адреса определенные, но не те определенные, какие в задании. В задании хаотические, в правиле вызова на определенном месте в стеке, для чего BP и введен в архитектуру, так и вспоминается где-то читанная фраза "для поддержки конструкций ЯВУ" или что-то вроде того. В принципе, можно и через смещение от SP адресовать, компилятор способен следить за значением SP, но с сохранением BP на стеке и последующим копированием SP в BP создается связанный список, по нему можно отмотать назад и посмотреть все локальные переменные всех предыдущих вложенных вызовов.
Поэтому тут и видно, что идет манипуляция с областью стека и запись в неё,
что никак не назвать бесполезным навыком.
Манипуляция не бестолковая, значит полезная ;)
К580ВМ80 процессор конечно же музейный, но очень простой для понимания и обучения ассемблеру.
Более того, на нем можно и так разговаривать: Эф-е-ноль-один-це-два-ноль-ноль-пятьдесят :) На 86-м уже так не поговоришь
Но я не защищаю задачу - нам топикстартер ни о смысле не сказал, ни спасибо Хардычу за готовый код... :wink:
А чой-то я тоже возбудился решить эту задачку. Специально не подглядываю, выложу на досуге. Вот интересно, откуда берется азарт решить? И задачка-то бессмысленная, дурацкая и простая... Наверное, потому что исход известен, а смысл - поразмяться и сравнить подход...
Maks
Junior
Posts: 3
Joined: 19 May 2013 13:05
Location: 85.234.168.94

Post by Maks »

Не пинайте меня сильно, у меня просто небольшой дефицит времени свободного. :(
Разумеется, в первую очередь, я хочу сказать огромнейшее спасибо HardWareMan'у ,за предоставленный вариант решения, и всем остальным, кто хоть как-то попытался направить меня на путь истинный.

Теперь о самой задаче и откуда она взялась. Дело в том, что специальность, на которую я учусь, больше связана с электротехникой и энергетикой, чем с электроникой. Но у нас был краткий курс цифровой электроники. Последняя тема, которую мы рассмотрели, это команды ветвления. Про стек нам вообще ничего не говорили. А эта задача что бы автомат получить. :) Она может и лишена здравого смысла, но преподавателю главное не 100% работоспособность, он всего лишь хочет увидеть более менее правильное использование команд.