i8080 help.
Moderator: Shaos
-
- Retired
- Posts: 587
- Joined: 27 Mar 2013 04:55
- Location: 62.192.229.16
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Я понял так: числа вводим 8ми битные (работаем с байтами). "Большие" и "меньшие" числа - это результат сравнения (на больше-меньше). Ну и организация стэка (напомню, что у i8080 он постинкрементный при изъятии через POP):
Т.е., "положить в стек с вершиной" я понимаю как SP=XXXX и в его вершине лежит требуемое число, которое изымается по POP/XTHL.
Таким образом, получаем нечно следующее:
Это мое видение и решение данной задачки. Есть куча мест, которые можно прооптимизировать. Писалось на ура без проверки, так что чего заметим - говорим.
PS XTHL очень полезная команда. Я уже писал про нее.
Code: Select all
ABCD/ABCC - вторые числа
ABCE/ABCD - результат при сложении с переносом
AABB/AABA - результат при сложении без переноса
Таким образом, получаем нечно следующее:
Code: Select all
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 очень полезная команда. Я уже писал про нее.
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Вершиной стека называют именно последний элемент в куче, организованной по принципу LIFO. Всегда рассматривайте стек как пачку бумаг на столе, с которой можно взять только самый верхний лист и положить новый лист можно только на самый верх (собственно, ЕМНИП, именно это сравнение и дало названию "stack"). А вот что хранится в регистре SP это именно указатель на вершину. Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.Lavr wrote:"Вершина - это не начало и не конец, это И НЕ последний добавленный элемент".
Вершина - это указатель, а стек - область памяти, доступ к которой организован по магазинному типу.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Это всего лишь твой ЕМНИП... существует и другое мнение...HardWareMan wrote:Вершиной стека называют именно последний элемент в куче,...
Читай - ты сам себе противоречишь:[b][url=http://www.google.ru/search?q=%D0%92%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B0+%D1%81%D1%82%D0%B5%D0%BA%D0%B0&client=opera&rls=ru&oe=utf-8&redir_esc=&oq=%D0%92%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B0+%D1%81%D1%82%D0%B5%D0%BA%D0%B0&gs_l=heirloom-serp.12..0l2.403490.410680.0.411450.7.4.0.3.3.0.440.1210.0j1j1j1j1.4.0...0.0...1ac.1.12.heirloom-serp.46nVmU1HjR4]Вершина стека[/url][/b] wrote:Регистр SP (указатель стека) содержит адрес последнего добавленного элемента.
Этот адрес также называется вершиной стека.
Действительно - значение можно забрать, а вершину ты почему-то забирать не стал,HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
хотя и убеждал в этом пачкой листов.

Действительно же "подпрограмма возвращает в вершине стека значение" означает только одно:
по адресу, указывающему на вершину стека можно забрать значение.
Вершина - это адрес, а не само значение.
Вполне согласен...vinxru wrote:"Регистр SP (указатель стека) содержит адрес последнего добавленного элемента.
Этот адрес также называется вершиной стека. Противоположный конец стека называется дном."
iLavr
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Не вижу противоречий. Если условие ставится таким, как я сказал ранее, то значит регистр стека будет проинициализирован. Для любой команды работы со стеком текущее значение регистра-указателя стека на момент исполнения этой команды и будет указателем на вершину, вне зависимости куда он указывает физически. Пытайся еще.Lavr wrote:Читай - ты сам себе противоречишь:Действительно - значение можно забрать, а вершину ты почему-то забирать не стал, хотя и убеждал в этом пачкой листов.HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.![]()
Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать. Ну и напоследок традиционная картинка:

-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
А чего пытатся-то? Типичная подмена понятий - хорошо, что ты сам это понимаешь...HardWareMan wrote:Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать.
Цитирую тебя еще раз:
Для непонятливого поясняю еще раз: из ячейки с адресом указывающему на вершину стека можно забрать значение.HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
А вершину - да, понятие материальное, - его можно пощупать, это целое цисло - ты не забрал.
Вершина стека - теперь указывет на другое значение...

Забрать вершину - это как отпилить красный полюс у магнита.

Всё материальное, вот только забрать отдельно нельзя!
Надеюсь, ты умнеешь... на твоей картинке написано то же самое!

iLavr
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Вернемся к моей цитате:Lavr wrote:Для непонятливого поясняю еще раз: из ячейки с адресом указывающему на вершину стека можно забрать значение.
А вершину - да, понятие материальное, - его можно пощупать, это целое цисло - ты не забрал. Вершина стека - теперь указывет на другое значение...![]()
Т.е., допустим тебе попалась библиотека в исполняемых кодах, о которой изветсно только то, что сказано в моей цитате. Т.е. вызываем процедуру, а когда она завершилась выполняется условие, оговоренное в моей цитате. Так зачем забирать указатель на вершину стека, если оговорено условием, что она всегда будет указывать на результат? И при этом не важно, кто инициализировал указатель.HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
Пытайся усерднее.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Ты запутался в словах... меньше вредничать и усложнять надо...
Объясняю на твоём же примере:
Но после этого на вершине лежит тот, что под ним. Что - смог забрать вершину?
У пачки теперь вершины нет?
Другой пример - залез ты на гору, злобно и усердно срыл её вершину и сложил всё в большой рюкзак...
И всё это унёс - чтобы мне стало заподлюче...
И что - гора осталась без вершины?
Да нет... этого подвига фактически и не видно...
А вот если ты заберешь всю стопку или в ненужном усердии сроешь гору - то да, вершины
не будет... Только это не значит вовсе, что ты смог её забрать.

Объясняю на твоём же примере:
Ты можешь взять с вершины пачки "только самый верхний лист".HardWareMan wrote:Всегда рассматривайте стек как пачку бумаг на столе, с которой можно взять только самый верхний лист и положить новый лист можно только на самый верх (собственно, ЕМНИП, именно это сравнение и дало названию "stack").
Но после этого на вершине лежит тот, что под ним. Что - смог забрать вершину?
У пачки теперь вершины нет?
Другой пример - залез ты на гору, злобно и усердно срыл её вершину и сложил всё в большой рюкзак...
И всё это унёс - чтобы мне стало заподлюче...

И что - гора осталась без вершины?

А вот если ты заберешь всю стопку или в ненужном усердии сроешь гору - то да, вершины
не будет... Только это не значит вовсе, что ты смог её забрать.
iLavr
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
-
- Doomed
- Posts: 481
- Joined: 25 Aug 2009 07:02
- Location: Москва
Согласен, задача дурная. Стек сущность безадресная, записать в стек по адресу - фраза странная. Задание можно рассматривать как приобретение навыка жонглирования командами, именно тренировка на специфическое применение. Польза имхо сомнительна, процессор музейный. Препод тоже музейный?
Трюкам нужно обучать полезным и современным. И лучше всего универсальным, потому что специфические трюки устаревают быстро.

-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Нетактично с твоей стороны, но других аргументов, у тебя не нашлось...HardWareMan wrote:Весна прошла, но доставляешь ты по полной. Продолжайся.
Поэтому вернёмся к твоей картинке и посмотрим, что ты там предложил общественности:
Переведём, чтобы было ясно, что говорим об одном и том - же:HardWareMan wrote:XTHL (Exchange stack top with H and L)
(L) <--> (SP) (H) <--> ((SP) + 1)
The content of the L register is exchanged with the content of the memory location whose address is specified by the content of register SP. The content of the H register is exchanged with the content of the memory location whose address is one more than the content of register SP.
Если возражений по качеству перевода нет, то я на минуту соглашаюсьtranslate.google.ru wrote:Содержимое регистра L обменивается с содержимым ячейки памяти, чей адрес определен содержанием регистра SP. Содержимое регистра H обменивается с содержимым ячейки памяти, чей адрес на единицу больше чем значение регистра SP.
с твоей точкой зрения:
выполнив операцию XTHL - я забрал в HL вершину стека - так ведь?
То есть stack top - у меня теперь находится в HL!Exchange stack top with H and L
А что тогда находится там, куда я содержимое HL положил, а?
Ну там, куда регистр SP по прежнему указывает?
Но я ведь следуя твоей логике забрал его в HL - разве нет?HardWareMan wrote:Вершиной стека называют именно последний элемент в куче,...
Теперь у нас образовалось два stack top - один лежит в HL, а другой - "именно
последний элемент в куче"?
Ну так значит подмена понятий есть, и она вот в этой фразе:
Exchange stack top with H and L
Не обмен "вершины стека" (stack top), а обмен "содержимого вершины стека" здесь.
Потому как дальше - объяснение совершенно верное: везде упоминается "content",
что, собственно, и есть "содержимое" или "значение".
iLavr
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Я не хочу угадывать за топикстартера, что там имелось в виду, но всё, что ты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
Есть соглашение о их передаче и возвращают их не через вершину стека,
а через определённые адреса.
Поэтому тут и видно, что идет манипуляция с областью стека и запись в неё,
что никак не назвать бесполезным навыком.
К580ВМ80 процессор конечно же музейный, но очень простой для понимания и обучения ассемблеру.
Если человека сразу ошарашить по башке сегментами, смещениями, различными служебными словами
ассемблера - тут и рождается легенда, что язык ассембера - непроходимый адъ!

Ну а если научиться простым вещам в рамках 64 К, а потом объяснить, что у старшего
процессора эти 64 К - один сегмент в его огромной памяти, в который указывают большинство
сегментных регистров, и собственно так и устроен com-файл, то всё гораздо проще.
Учиться-то лучше от простого к сложному, а всё написанное для К580ВМ80 почти автоматом
переносится на старшие процессоры - Intel постаралась!
Не зря говорят, что человек успешно освоивший один ассемблер и один язык высокого уровня
справится позже в своей практике с любыми другими.
Но я не защищаю задачу - нам топикстартер ни о смысле не сказал, ни спасибо Хардычу за готовый код...

iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Один из придурков придумал загружать вполне нормальный сегментный регистр [BP] (Base Pointer) значением стекового регистра [SP] (Stack Pointer) и начал передавать параметры в стеке. Остальные подхватили и теперь, спустя 40 лет, мы имеем фундаментальную уязвимость в порче стека, потому как все нынешние компиляторы используют этот прием. А использовали бы [BP] по назначению, разделив область данных и кода, и не было бы проблем и технологии DEP. Но это все лирика.
Продолжайся, Лавруша, можно доставлять и не злоупотребляя, ага.
Продолжайся, Лавруша, можно доставлять и не злоупотребляя, ага.