i8080 help.

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

Moderator: Shaos

vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

В том, что ты написал, нет слова "вершина", к которому я неравнодушен.

"Регистр SP (указатель стека) содержит адрес последнего добавленного элемента. Этот адрес также называется вершиной стека. Противоположный конец стека называется дном."

Хотя бы.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Я понял так: числа вводим 8ми битные (работаем с байтами). "Большие" и "меньшие" числа - это результат сравнения (на больше-меньше). Ну и организация стэка (напомню, что у i8080 он постинкрементный при изъятии через POP):

Code: Select all

ABCD/ABCC - вторые числа
ABCE/ABCD - результат при сложении с переносом
AABB/AABA - результат при сложении без переноса
Т.е., "положить в стек с вершиной" я понимаю как SP=XXXX и в его вершине лежит требуемое число, которое изымается по POP/XTHL.
Таким образом, получаем нечно следующее:

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 очень полезная команда. Я уже писал про нее.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:"Вершина - это не начало и не конец, это И НЕ последний добавленный элемент".
Вершина - это указатель, а стек - область памяти, доступ к которой организован по магазинному типу.
Вершиной стека называют именно последний элемент в куче, организованной по принципу LIFO. Всегда рассматривайте стек как пачку бумаг на столе, с которой можно взять только самый верхний лист и положить новый лист можно только на самый верх (собственно, ЕМНИП, именно это сравнение и дало названию "stack"). А вот что хранится в регистре SP это именно указатель на вершину. Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Вершиной стека называют именно последний элемент в куче,...
Это всего лишь твой ЕМНИП... существует и другое мнение...
Читай - ты сам себе противоречишь:
HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
Действительно - значение можно забрать, а вершину ты почему-то забирать не стал,
хотя и убеждал в этом пачкой листов. :wink:

Действительно же "подпрограмма возвращает в вершине стека значение" означает только одно:
по адресу, указывающему на вершину стека можно забрать значение.
Вершина - это адрес, а не само значение.
vinxru wrote:"Регистр SP (указатель стека) содержит адрес последнего добавленного элемента.
Этот адрес также называется вершиной стека. Противоположный конец стека называется дном."
Вполне согласен...
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:Читай - ты сам себе противоречишь:
HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
Действительно - значение можно забрать, а вершину ты почему-то забирать не стал, хотя и убеждал в этом пачкой листов. :wink:
Не вижу противоречий. Если условие ставится таким, как я сказал ранее, то значит регистр стека будет проинициализирован. Для любой команды работы со стеком текущее значение регистра-указателя стека на момент исполнения этой команды и будет указателем на вершину, вне зависимости куда он указывает физически. Пытайся еще.

Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать. Ну и напоследок традиционная картинка:
Image
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать.
А чего пытатся-то? Типичная подмена понятий - хорошо, что ты сам это понимаешь...
Цитирую тебя еще раз:
HardWareMan wrote:Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.
Для непонятливого поясняю еще раз: из ячейки с адресом указывающему на вершину стека можно забрать значение.
А вершину - да, понятие материальное, - его можно пощупать, это целое цисло - ты не забрал.
Вершина стека - теперь указывет на другое значение... :lol:

Забрать вершину - это как отпилить красный полюс у магнита. :D
Всё материальное, вот только забрать отдельно нельзя!

Надеюсь, ты умнеешь... на твоей картинке написано то же самое! :roll:
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

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

Post by Lavr »

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

Другой пример - залез ты на гору, злобно и усердно срыл её вершину и сложил всё в большой рюкзак...
И всё это унёс - чтобы мне стало заподлюче... :lol:

И что - гора осталась без вершины? :wink: Да нет... этого подвига фактически и не видно...

А вот если ты заберешь всю стопку или в ненужном усердии сроешь гору - то да, вершины
не будет... Только это не значит вовсе, что ты смог её забрать.
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Весна прошла, но доставляешь ты по полной. Продолжайся.
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Согласен, задача дурная. Стек сущность безадресная, записать в стек по адресу - фраза странная. Задание можно рассматривать как приобретение навыка жонглирования командами, именно тренировка на специфическое применение. Польза имхо сомнительна, процессор музейный. Препод тоже музейный? ;) Трюкам нужно обучать полезным и современным. И лучше всего универсальным, потому что специфические трюки устаревают быстро.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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 вершину стека - так ведь?
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",
что, собственно, и есть "содержимое" или "значение".
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Слушай, поделись травой, а? Находками надо делиться, иначе Бархун обидится и отберет все у тебя!

PS Вершина стека у каждой команды своя, подумай над этим.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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 процессор конечно же музейный, но очень простой для понимания и обучения ассемблеру.

Если человека сразу ошарашить по башке сегментами, смещениями, различными служебными словами
ассемблера - тут и рождается легенда, что язык ассембера - непроходимый адъ! :o

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

Учиться-то лучше от простого к сложному, а всё написанное для К580ВМ80 почти автоматом
переносится на старшие процессоры - Intel постаралась!

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

Но я не защищаю задачу - нам топикстартер ни о смысле не сказал, ни спасибо Хардычу за готовый код... :wink:
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Вершина стека у каждой команды своя, подумай над этим.
Слушай, поделись травой, а? С этим своим Бархун-ом, а? А то я не злоупотребляю - мне без надобности...
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

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

Продолжайся, Лавруша, можно доставлять и не злоупотребляя, ага.