|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
vinxru
Retired
Joined: 27 Mar 2013 04:55 Posts: 587 Location: 62.192.229.16
|
В том, что ты написал, нет слова "вершина", к которому я неравнодушен.
"Регистр SP (указатель стека) содержит адрес последнего добавленного элемента. Этот адрес также называется вершиной стека. Противоположный конец стека называется дном."
Хотя бы.
|
20 May 2013 03:21 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Я понял так: числа вводим 8ми битные (работаем с байтами). "Большие" и "меньшие" числа - это результат сравнения (на больше-меньше). Ну и организация стэка (напомню, что у i8080 он постинкрементный при изъятии через POP):
Т.е., "положить в стек с вершиной" я понимаю как SP=XXXX и в его вершине лежит требуемое число, которое изымается по POP/XTHL. Таким образом, получаем нечно следующее: | | | | Code: LXI SP,0ABCDh ; Вершина стэка исходных чисел POP B ; Эти числа в [BC] IN (47) ; Считываем первое число CMP B ; Сравниваем первое число с исходным JNС BIG1 ; Считанное число больше - идем ; Здесь первое считанное число меньше первого хранимого MOV D,A ; Сохраним первое меньшее в [D] MOV H,B ; Первое большое в [H] JMP CNT1 ; Продолжаем ; Здесь первое считанное число больше (либо равно) первого хранимого BIG1: MOV D,B ; Сохраним первое меньшее в [D] MOV H,A ; Первое большое в [L] ; Здесь сходится первое ветвление CNT1: IN (39) ; Считываем второе число CMP C ; сравниваем со вторым исходным числом JNС BIG2 ; Считанное число больше - идем ; Здесь второе считанное число меньше второго хранимого MOV E,A ; Сохраним второе меньшее в [E] MOV L,C ; Сохраним второе большее в [L] JMP CNT2 ; Продолжаем ; Здесь второе считанное число больше (либо равно) второго хранимого BIG2: MOV E,C ; Сохраним второе меньшее в [E] MOV L,A ; Сохраним второе большее в [L] ; Здесь сходится второе ветвление CNT2: ; Итог программы: [H] - первое большое, [L] - второе большое, [D] - первое меньшее и [E] - второе меньшее ; Сохраним результаты LXI B,0A1B2h ; адрес хранения результата MOV A,H ; Выберем первое большое STAX B ; И запишем в память INX B ; Следующий адрес MOV A,L ; Выберем второе большое STAX B ; И запишем в память INX B ; Следующий адрес MOV A,D ; Выберем первое маленькое STAX B ; И запишем в память INX B ; Следующий адрес MOV A,E ; Выберем первое маленькое STAX B ; И запишем в память ; Суммируем большие MOV A,H ; Берем первое большое ADD L ; Складываем со вторым большим JC CARY ; Был перенос - идем ; Здесь сумма больших числен не вызвала переноса LXI SP,0AAB9h ; Требуемая вершина стека AABB-2 JMP CNT3 ; Продолжаем ; Сумма больших чисел вызвала перенос CARY: LXI SP,0ABCCh ; Требуемая вершина стека ABCE-2 ; Здесь сходится третье ветвление CNT3: MOV L,A ; Сумму больших числе в [L] MVI H,00h ; А [H] обнулим PUSH H ; Теперь число в вершине стека, а стек имеет требуемое значение ; XORим маленькие MOV A,D ; Берем первое маленькое XRA E ; XORим его со вторым OUT (47) ; И выбросим результат в порт
| | | | |
Это мое видение и решение данной задачки. Есть куча мест, которые можно прооптимизировать. Писалось на ура без проверки, так что чего заметим - говорим.
PS XTHL очень полезная команда. Я уже писал про нее.
|
20 May 2013 03:35 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Вершиной стека называют именно последний элемент в куче, организованной по принципу LIFO. Всегда рассматривайте стек как пачку бумаг на столе, с которой можно взять только самый верхний лист и положить новый лист можно только на самый верх (собственно, ЕМНИП, именно это сравнение и дало названию "stack"). А вот что хранится в регистре SP это именно указатель на вершину. Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
|
20 May 2013 04:29 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это всего лишь твой ЕМНИП... существует и другое мнение... Читай - ты сам себе противоречишь: Действительно - значение можно забрать, а вершину ты почему-то забирать не стал, хотя и убеждал в этом пачкой листов. Действительно же " подпрограмма возвращает в вершине стека значение" означает только одно: по адресу, указывающему на вершину стека можно забрать значение. Вершина - это адрес, а не само значение.
Вполне согласен...
_________________ iLavr
|
20 May 2013 06:43 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Не вижу противоречий. Если условие ставится таким, как я сказал ранее, то значит регистр стека будет проинициализирован. Для любой команды работы со стеком текущее значение регистра-указателя стека на момент исполнения этой команды и будет указателем на вершину, вне зависимости куда он указывает физически. Пытайся еще.
Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать. Ну и напоследок традиционная картинка:
|
20 May 2013 07:18 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А чего пытатся-то? Типичная подмена понятий - хорошо, что ты сам это понимаешь... Цитирую тебя еще раз:
Для непонятливого поясняю еще раз: из ячейки с адресом указывающему на вершину стека можно забрать значение.
А вершину - да, понятие материальное, - его можно пощупать, это целое цисло - ты не забрал.
Вершина стека - теперь указывет на другое значение...
Забрать вершину - это как отпилить красный полюс у магнита.
Всё материальное, вот только забрать отдельно нельзя!
Надеюсь, ты умнеешь... на твоей картинке написано то же самое!
_________________ iLavr
|
20 May 2013 07:30 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Вернемся к моей цитате:
Т.е., допустим тебе попалась библиотека в исполняемых кодах, о которой изветсно только то, что сказано в моей цитате. Т.е. вызываем процедуру, а когда она завершилась выполняется условие, оговоренное в моей цитате. Так зачем забирать указатель на вершину стека, если оговорено условием, что она всегда будет указывать на результат? И при этом не важно, кто инициализировал указатель.
Пытайся усерднее.
|
20 May 2013 07:40 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ты запутался в словах... меньше вредничать и усложнять надо...
Объясняю на твоём же примере:
Ты можешь взять с вершины пачки " только самый верхний лист".
Но после этого на вершине лежит тот, что под ним. Что - смог забрать вершину?
У пачки теперь вершины нет?
Другой пример - залез ты на гору, злобно и усердно срыл её вершину и сложил всё в большой рюкзак...
И всё это унёс - чтобы мне стало заподлюче...
И что - гора осталась без вершины? Да нет... этого подвига фактически и не видно...
А вот если ты заберешь всю стопку или в ненужном усердии сроешь гору - то да, вершины
не будет... Только это не значит вовсе, что ты смог её забрать.
_________________ iLavr
|
20 May 2013 07:51 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Весна прошла, но доставляешь ты по полной. Продолжайся.
|
20 May 2013 08:31 |
|
|
Mixa64
Doomed
Joined: 25 Aug 2009 07:02 Posts: 459 Location: Москва
|
Согласен, задача дурная. Стек сущность безадресная, записать в стек по адресу - фраза странная. Задание можно рассматривать как приобретение навыка жонглирования командами, именно тренировка на специфическое применение. Польза имхо сомнительна, процессор музейный. Препод тоже музейный? Трюкам нужно обучать полезным и современным. И лучше всего универсальным, потому что специфические трюки устаревают быстро.
|
20 May 2013 09:01 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Нетактично с твоей стороны, но других аргументов, у тебя не нашлось... Поэтому вернёмся к твоей картинке и посмотрим, что ты там предложил общественности: Переведём, чтобы было ясно, что говорим об одном и том - же: Если возражений по качеству перевода нет, то я на минуту соглашаюсь с твоей точкой зрения: выполнив операцию XTHL - я забрал в HL вершину стека - так ведь? То есть stack top - у меня теперь находится в HL! А что тогда находится там, куда я содержимое HL положил, а? Ну там, куда регистр SP по прежнему указывает?
Но я ведь следуя твоей логике забрал его в HL - разве нет?
Теперь у нас образовалось два stack top - один лежит в HL, а другой - " именно последний элемент в куче"?
Ну так значит подмена понятий есть, и она вот в этой фразе:
Exchange stack top with H and L
Не обмен " вершины стека" ( stack top), а обмен " содержимого вершины стека" здесь.
Потому как дальше - объяснение совершенно верное: везде упоминается " content",
что, собственно, и есть " содержимое" или " значение".
_________________ iLavr
|
20 May 2013 09:04 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Слушай, поделись травой, а? Находками надо делиться, иначе Бархун обидится и отберет все у тебя!
PS Вершина стека у каждой команды своя, подумай над этим.
|
20 May 2013 09:18 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я не хочу угадывать за топикстартера, что там имелось в виду, но всё, что ты
пишешь дальше - спорно.
Приведу пример - обращение к подпрограмме на ассемблере из Паскаля:
Параметры передаются через область стека и возвращаются через неё же.
Есть соглашение о их передаче и возвращают их не через вершину стека,
а через определённые адреса.
Поэтому тут и видно, что идет манипуляция с областью стека и запись в неё,
что никак не назвать бесполезным навыком.
К580ВМ80 процессор конечно же музейный, но очень простой для понимания и обучения ассемблеру.
Если человека сразу ошарашить по башке сегментами, смещениями, различными служебными словами
ассемблера - тут и рождается легенда, что язык ассембера - непроходимый адъ!
Ну а если научиться простым вещам в рамках 64 К, а потом объяснить, что у старшего
процессора эти 64 К - один сегмент в его огромной памяти, в который указывают большинство
сегментных регистров, и собственно так и устроен com-файл, то всё гораздо проще.
Учиться-то лучше от простого к сложному, а всё написанное для К580ВМ80 почти автоматом
переносится на старшие процессоры - Intel постаралась!
Не зря говорят, что человек успешно освоивший один ассемблер и один язык высокого уровня
справится позже в своей практике с любыми другими.
Но я не защищаю задачу - нам топикстартер ни о смысле не сказал, ни спасибо Хардычу за готовый код...
_________________ iLavr
|
20 May 2013 09:31 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Слушай, поделись травой, а? С этим своим Бархун-ом, а? А то я не злоупотребляю - мне без надобности...
_________________ iLavr
|
20 May 2013 09:33 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Один из придурков придумал загружать вполне нормальный сегментный регистр [BP] (Base Pointer) значением стекового регистра [SP] (Stack Pointer) и начал передавать параметры в стеке. Остальные подхватили и теперь, спустя 40 лет, мы имеем фундаментальную уязвимость в порче стека, потому как все нынешние компиляторы используют этот прием. А использовали бы [BP] по назначению, разделив область данных и кода, и не было бы проблем и технологии DEP. Но это все лирика.
Продолжайся, Лавруша, можно доставлять и не злоупотребляя, ага.
|
20 May 2013 09:52 |
|
|
Who is online |
Users browsing this forum: No registered users and 12 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|