nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 04:42



Reply to topic  [ 40 posts ]  Go to page Previous  1, 2, 3  Next
i8080 help. 
Author Message
Retired

Joined: 27 Mar 2013 04:55
Posts: 587
Location: 62.192.229.16
Reply with quote
Post 
В том, что ты написал, нет слова "вершина", к которому я неравнодушен.

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

Хотя бы.


20 May 2013 03:21
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Я понял так: числа вводим 8ми битные (работаем с байтами). "Большие" и "меньшие" числа - это результат сравнения (на больше-меньше). Ну и организация стэка (напомню, что у i8080 он постинкрементный при изъятии через POP):
Code:
ABCD/ABCC - вторые числа
ABCE/ABCD - результат при сложении с переносом
AABB/AABA - результат при сложении без переноса

Т.е., "положить в стек с вершиной" я понимаю как 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
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Lavr wrote:
"Вершина - это не начало и не конец, это И НЕ последний добавленный элемент".
Вершина - это указатель, а стек - область памяти, доступ к которой организован по магазинному типу.

Вершиной стека называют именно последний элемент в куче, организованной по принципу LIFO. Всегда рассматривайте стек как пачку бумаг на столе, с которой можно взять только самый верхний лист и положить новый лист можно только на самый верх (собственно, ЕМНИП, именно это сравнение и дало названию "stack"). А вот что хранится в регистре SP это именно указатель на вершину. Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.


20 May 2013 04:29
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
Вершиной стека называют именно последний элемент в куче,...

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

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

Действительно - значение можно забрать, а вершину ты почему-то забирать не стал,
хотя и убеждал в этом пачкой листов. :wink:

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

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

Вполне согласен...

_________________
iLavr


20 May 2013 06:43
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Lavr wrote:
Читай - ты сам себе противоречишь:
HardWareMan wrote:
Поэтому, когда говорят "подпрограмма возвращает в вершине стека значение" означает
только одно: значение можно забрать через POP/XTHL сразу после возврата из подпрограммы.

Действительно - значение можно забрать, а вершину ты почему-то забирать не стал, хотя и убеждал в этом пачкой листов. :wink:

Не вижу противоречий. Если условие ставится таким, как я сказал ранее, то значит регистр стека будет проинициализирован. Для любой команды работы со стеком текущее значение регистра-указателя стека на момент исполнения этой команды и будет указателем на вершину, вне зависимости куда он указывает физически. Пытайся еще.

Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать. Ну и напоследок традиционная картинка:
Image


20 May 2013 07:18
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
Подмена понятий она такая, да. Вершина - вещь материальная, ее можно пощупать. А указатель на нее всего-лишь стрелка, куда копать.

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

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

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

Надеюсь, ты умнеешь... на твоей картинке написано то же самое! :roll:

_________________
iLavr


20 May 2013 07:30
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Lavr wrote:
Для непонятливого поясняю еще раз: из ячейки с адресом указывающему на вершину стека можно забрать значение.
А вершину - да, понятие материальное, - его можно пощупать, это целое цисло - ты не забрал. Вершина стека - теперь указывет на другое значение... :lol:

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

Т.е., допустим тебе попалась библиотека в исполняемых кодах, о которой изветсно только то, что сказано в моей цитате. Т.е. вызываем процедуру, а когда она завершилась выполняется условие, оговоренное в моей цитате. Так зачем забирать указатель на вершину стека, если оговорено условием, что она всегда будет указывать на результат? И при этом не важно, кто инициализировал указатель.
Пытайся усерднее.


20 May 2013 07:40
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Ты запутался в словах... меньше вредничать и усложнять надо... :wink:
Объясняю на твоём же примере:
HardWareMan wrote:
Всегда рассматривайте стек как пачку бумаг на столе, с которой можно взять только самый верхний лист и положить новый лист можно только на самый верх (собственно, ЕМНИП, именно это сравнение и дало названию "stack").

Ты можешь взять с вершины пачки "только самый верхний лист".
Но после этого на вершине лежит тот, что под ним. Что - смог забрать вершину?
У пачки теперь вершины нет?

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

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

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

_________________
iLavr


20 May 2013 07:51
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Весна прошла, но доставляешь ты по полной. Продолжайся.


20 May 2013 08:31
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Post 
Согласен, задача дурная. Стек сущность безадресная, записать в стек по адресу - фраза странная. Задание можно рассматривать как приобретение навыка жонглирования командами, именно тренировка на специфическое применение. Польза имхо сомнительна, процессор музейный. Препод тоже музейный? ;) Трюкам нужно обучать полезным и современным. И лучше всего универсальным, потому что специфические трюки устаревают быстро.


20 May 2013 09:01
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
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 вершину стека - так ведь?
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",
что, собственно, и есть "содержимое" или "значение".

_________________
iLavr


20 May 2013 09:04
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Слушай, поделись травой, а? Находками надо делиться, иначе Бархун обидится и отберет все у тебя!

PS Вершина стека у каждой команды своя, подумай над этим.


20 May 2013 09:18
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Mixa64 wrote:
Согласен, задача дурная. Стек сущность безадресная, записать в стек по адресу - фраза странная.

Я не хочу угадывать за топикстартера, что там имелось в виду, но всё, что ты
пишешь дальше - спорно.

Приведу пример - обращение к подпрограмме на ассемблере из Паскаля:
Code:
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


20 May 2013 09:31
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
HardWareMan wrote:
Вершина стека у каждой команды своя, подумай над этим.

Слушай, поделись травой, а? С этим своим Бархун-ом, а? А то я не злоупотребляю - мне без надобности...

_________________
iLavr


20 May 2013 09:33
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Один из придурков придумал загружать вполне нормальный сегментный регистр [BP] (Base Pointer) значением стекового регистра [SP] (Stack Pointer) и начал передавать параметры в стеке. Остальные подхватили и теперь, спустя 40 лет, мы имеем фундаментальную уязвимость в порче стека, потому как все нынешние компиляторы используют этот прием. А использовали бы [BP] по назначению, разделив область данных и кода, и не было бы проблем и технологии DEP. Но это все лирика.

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


20 May 2013 09:52
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 40 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 14 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.