|
|
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Программа выполнена полностью по заданию. Но когда компилирую и нажимаю клавишу то происходит ее зависание. С чем связано? Условие задачи: Разработать программу, которая будет устанавливать новый обработчик прерывания от клавиатуры 09h.Для установки новых векторов прерываний использовать функции 25h и 35h прерывания 21h. Программа установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти и выводить сообщение "Обработчик уже есть в памяти" либо "Обработчик успешно установлен". В первом случае программа завершает работу без установки резидента. Во втором - заменяет вектор прерывания и завершает работу оставляя резидентную часть в памяти Новый обработчик должен выполнять следующие функции: При нажатии на любую клавишу в левом верхнем углу экрана отображать скан-код клавиши. Нажатие F6 - восстановление старого обработчика прерывания 09h тектс программы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 22:09 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
The_answerПрограмма выполнена полностью по заданию. Но когда компилирую и нажимаю клавишу то происходит ее зависание. С чем связано? Ну... попробую прокомментировать сделанное. Хотя оговорюсь, что не занимался этим лет этак десять с лишним. The_answerПрограмма установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти Этого, признаться, я так и не увидел. The_answerDATA SEGMENT Хм. В какой модели ты компилируешь? Такую программу естественно делать в com-формате. The_answerSSEG SEGMENT STACK db 200 dup(?) SSEG ENDS А стоит ли? К тому же, если уж выделено место для стека, его хорошо бы где-нибудь использовать, чего я опять же не увидел. The_answer metka: cmp counter,100 jbe metka Хм. В задании сказано "установить программу резидентом", а не "организовать цикл в ожидании завершения программы". The_answerin al,60h Хм. Допустим. Хотя что-то мне кажется, что не все так просто; была какая-то тонкость, кажется для AT-клавиатур для кода освобождения клавиши надо было читать второй байт. The_answer key_down_loop: mov si, offset buff add si, 3 call hex2str ; Выводим mov ah, 09h mov dx, offset buff int 21h jmp key_down_loop Глубоко задумался, каким образом программа собирается выйти из этого цикла, если она сюда попала. The_answer m: pushf Это имеется в виду обеспечение iret-возврата из старого обработчика? The_answer call dword ptr ds:[old_09_o] Хм. Вызвать старый обработчик - дело конечно хорошее. Вопрос в том, что он вроде как собирается читать нажатую клавишу, а ты ее уже прочитал. Не уверен, чем закончится такой эксперимент. The_answer iret INT09 ENDP Хм. Опять же по воспоминаниям, INT09 относится к NMI, а это значит, что при выходе из него надо разрешить NMI, кажется через регистр 20h. В твоем коде эту функцию выполнил бы старый обработчик, но я бы ожидал у него проблем на чтении из порта. The_answerhex2str proc Эту функцию ты легко можешь отладить отдельно, так что и не собираюсь смотреть внутрь. The_answer goBack proc Процедура не то чтобы на месте, да и не очень-то нужно ее выделять. Вообще, резиденты принято строить так: сначала резидентная часть, вместе с необходимыми ей данными, потом нерезидентная часть со своими данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 22:35 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Хех... hex2str - знакомый код. Где то это я уже видел ;) ... 2The_answer: лично мне как то неохота в такой каше разбираться. Может быть завтра гляну. А вообще неплохо было бы причесать код, камментов понаписать. Глядишь, сам бы понял что написал. И часть багов бы пофиксил. 2softwarer & The_answer: softwarer The_answerin al,60h Хм. Допустим. Хотя что-то мне кажется, что не все так просто; была какая-то тонкость, кажется для AT-клавиатур для кода освобождения клавиши надо было читать второй байт. Я же тебе еще в прошлом твоем треде писал, что если ты будешь делать обработчик прерывания, читай из порта. softwarer The_answerSSEG SEGMENT STACK db 200 dup(?) SSEG ENDS А стоит ли? К тому же, если уж выделено место для стека, его хорошо бы где-нибудь использовать, чего я опять же не увидел. push/pop - шо це таке? це работа со стеком! Более того вызывается подпрограмма hex2str. А шо в итоге? А на стек кладется адрес возврата. Содержимое IP. Це архитектурные особенности 8086. Более того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном... P.S. Будешь резидента создавать, туда не вздумай запихать. softwarer The_answer key_down_loop: mov si, offset buff add si, 3 call hex2str ; Выводим mov ah, 09h mov dx, offset buff int 21h jmp key_down_loop Глубоко задумался, каким образом программа собирается выйти из этого цикла, если она сюда попала. Наверное по CTRL + C ;) _______________________________ P.S. Увиденное может нанести психологическую травму . Самому то удобно разбираться в этаком??? Короче: RTFM, RTFM и еще раз RTFM. И неплохо было бы научиться писать удобочитаемый код (да, даже на асме). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 00:56 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
НУ я протсо новичок в asme. Посмотри, плиз, что можно исправить. А там действительно часть твоей программы. Делал очень быстро. Что ужас и сам знаю, не люблю жутко asm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 01:08 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
The_answerНУ я протсо новичок в asme. Посмотри, плиз, что можно исправить. Да тут, все заново переписывать нужно... В свободное время перепишу, но до четверга буду занят. => результат сюда скину только в четверг вечером... Не тебе, так может другим поможет. The_answerЧто ужас и сам знаю, не люблю жутко asm Вот сам себе яму и выкопал. Только зря свое время потратил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 01:20 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Ruslan.IsbarovБолее того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном... Во-первых, одно дело - управление стеком. Совсем другое - выделение под него места в файле на диске. Имхо это малость нелогично. Во-вторых, не помню как в exe-формате, может там SS в результате работы этой программы и будет инициализирован. Если делать ее нормально, в com формате, об этом таки стоит позаботиться, иначе это будет просто потраченное место. Наконец, подпрограмме hex2str на этот стек глубочайшим образом наплевать, поскольку вызывается она из обработчика прерывания, и стек у нее будет досовский (если программа, конечно, не захочет явно перейти к использованию собственного). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 01:41 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
softwarer Ruslan.IsbarovБолее того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном... Во-первых, одно дело - управление стеком. Совсем другое - выделение под него места в файле на диске. Имхо это малость нелогично. Что то не пойму тебя. Какое управление? В кои то века команды push (поместить в стек) и pop (снять со стека) относят к командам управления стеком??? Какой вообще диск??? Имеешь в виду exe-файл? Как ты сказал, "место для стека выделено, его хорошо бы где-нибудь использовать". Ну вот я и показал где он используется. softwarer Во-вторых, не помню как в exe-формате, может там SS в результате работы этой программы и будет инициализирован. Не может, а точно . RTFM перед тем как утверждать. softwarerЕсли делать ее нормально, в com формате, об этом таки стоит позаботиться, иначе это будет просто потраченное место. А про com ничего и не говорилось. Разговор идет о том что есть на текущий момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 11:39 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Ruslan.IsbarovЧто то не пойму тебя. Какое управление? В данном случае - выделение места. По коду просится еще и в обработчике прерывания переключаться на использование этого стека, хотя имхо это излишество. Ruslan.IsbarovКакой вообще диск??? Имеешь в виду exe-файл? Да. Ruslan.IsbarovКак ты сказал, "место для стека выделено, его хорошо бы где-нибудь использовать". Ну вот я и показал где он используется. Там он используется мягко говоря не на двести байт. Ruslan.Isbarov softwarer Во-вторых, не помню как в exe-формате, может там SS в результате работы этой программы и будет инициализирован. Не может, а точно . RTFM перед тем как утверждать. Руслан, перед тем как утверждать, я обычно еще и проверяю, если так не уверен. Когда я не хочу проверять, я говорю "не уверен", "не помню" итп, что видно в квоте выше. Если ты не понимаешь значения слова "утверждать" - держи свои команды при себе, или на крайняк пихай в код. Ruslan.Isbarov softwarerЕсли делать ее нормально, в com формате, об этом таки стоит позаботиться, иначе это будет просто потраченное место. А про com ничего и не говорилось. Мной - говорилось, еще до того, как ты появился в топике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 14:19 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
О, наконец то... Конкретизировал. И про управление и про использование стека... Глядя на твое сообщение softwarerА стоит ли? К тому же, если уж выделено место для стека, его хорошо бы где-нибудь использовать, чего я опять же не увидел. складывается мнение, что ты вообще недоумеваешь о том, что в программе присутствует сегмент стека. А не о том, что не все 200 байт будут использованы. Извини, телепаты в отпуске... P.S. вот видишь, сколько флейма из-за неточности. __________________________________________________________ softwarerВо-первых, одно дело - управление стеком. Совсем другое - выделение под него места в файле на диске. Имхо это малость нелогично. softwarer Ruslan.IsbarovЧто то не пойму тебя. Какое управление? В данном случае - выделение места. Твои утверждения, мягко говоря, противоречат друг другу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 18:44 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
The_answerПрограмма выполнена полностью по заданию. Но когда компилирую и нажимаю клавишу то происходит ее зависание. С чем связано? Условие задачи: Разработать программу, которая будет устанавливать новый обработчик прерывания от клавиатуры 09h.Для установки новых векторов прерываний использовать функции 25h и 35h прерывания 21h. Программа установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти и выводить сообщение "Обработчик уже есть в памяти" либо "Обработчик успешно установлен". В первом случае программа завершает работу без установки резидента. Во втором - заменяет вектор прерывания и завершает работу оставляя резидентную часть в памяти Новый обработчик должен выполнять следующие функции: При нажатии на любую клавишу в левом верхнем углу экрана отображать скан-код клавиши. Нажатие F6 - восстановление старого обработчика прерывания 09h .... азм нужно любить, если хотите писать на нём... приведённый код не рабочий - раз, и не соответствует заданию - два. возможно скомпилён из нечто, но результат плачевный. В принцепе это уже прозвучало. Так же прозвучало о том, что лучше сфокусироваться на задаче, а не на формате получаемого исполняемого модуля. Просче похоронить пока рассуждения о различных сегментах (данных и иже) и барахтаться в одном - так называемая COM модель. Об этом так же прозвучало. По поводу инициализации стэка - полная чушь. Авторов чуши отправлю к Джордену и другим учебникам по досу, азму и иже.. См. раздел окружение запускаемого процесса, инициализация регистров и т.д.. Это Вам не первые шаги биоса, и не первые шаги микроконтроллера - совсем голову человеку запудрите... По поводу выделения места под стэк на диске - это уже перебор товарисчи. Ну нельзя же так ! Не уверены - не нуна, пожалуйста. Стэк - оласть памяти, организованная по принципу FILO и адресуемая через соответствующие регистры проца. Никакого отношения к дисковой подсистемы сие НЕ имеет... теперь по сути вопроса - уже ответ дали. зацикливание в обработчике 9 прерывания. Вы отправляете в беспосадочный перелёт микропроцессор. От ся добавлю - вызывать из обработчика BIOS (9 вектор - аппаратный!), досовское прерывание (21) для отображения на дисплее - большая глупость. Если даже и будет дышать, то ходите по тонкому льду. См. потроха обработчика 21 прерывания (с его маркерами критических вхождений и иже). Более правильней - прямое отображение в видио память, либо задействование прерываний биоса 10h - помедленее чуток). Для этого (прямое отображение в видио память) нуна определить режим отображения (либо перевести в нужный) и по адрессу 0B800h либо 0B000h выводить Ваши потуги. Опять - лучше почитать класиков на данный счёт, потому как не всё так просто сделано - как сказано... теперь по задачи... не вдаваясь в азм Вам нуна решить следующие задачи... 1) детекция присутствия Вашего кода в памяти компа. Тут подходов несколько, но самый менее гиморный - обслужить некую свою функцию на определённом прерывании.. (например мультиплексном - см. 2fh).. 2) Обслуживать официальное оставление резидента в памяти (см. 27h прерывание - если не глючу). А так же освобождение сегмента. Не забывать про освобождение PSP !!! (типичная ошибка молодёжи)... Его адрес сможете найти (дай бох памяти) по 20h смещению ващего CS сегмента. 3) Скан код как тут прозвучало - из порта брать может не прокатить... Вам дорога на разборку кольцевого буфера под BIOS. Его чтение, без правки головы-хвоста... Лучше отрабатывать сие ПОСЛЕ основного тела 9h прерывания биоса... удачи Вам (круглый) ЗЫ Давно не брал в руки шашки :)) ностальжи прям.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 19:42 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
kolobok0По поводу инициализации стэка - полная чушь. Авторов чуши отправлю к Джордену и другим учебникам по досу, азму и иже.. См. раздел окружение запускаемого процесса, инициализация регистров и т.д.. Это Вам не первые шаги биоса, и не первые шаги микроконтроллера - совсем голову человеку запудрите... А вот с этого места, плиз, поподробнее. Что в моих утверждения Вам показалось чушью? kolobok0По поводу выделения места под стэк на диске - это уже перебор товарисчи. Ну нельзя же так ! Не уверены - не нуна, пожалуйста. Уважаемый, вы слышали об организации загружаемого модуля? Почитайте маны. Я г-на softwarer'а тоже не сразу понял. Оказывается он имел в виду exe-файл на диске и его структуру. kolobok0Стэк - оласть памяти, организованная по принципу FILO и адресуемая через соответствующие регистры проца. Никакого отношения к дисковой подсистемы сие НЕ имеет... "FILO" - это уже любопытно. Заставляет подумать о Вашей компетентности в данных вопросах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 19:51 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
kolobok0 Дабы развеять ваши сомнения по поводу инициализации стека, а заодно доказать свои утверждения, написал парочку тестовых программ: 1) Программа, имеющая 1 сегмент (сегмент кода): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А теперь запустим эту программулину в дебагере (см. аттач). Смотрим и видим, что сегментные регистры CS и SS имеют одно и тоже значение. Регистр SP содержит значение 0. Думаю, что не все так запущено и вы знаете что стек растет в сторону младших адресов . А команда PUSH уменьшает значение регистра SP на 2. Эту ситуацию я описал выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:20 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
2) Программа, имеющая сегмент стека: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Смотрим в дебагере. Результат: сегментный регистр SS имеет значение, отличное от SS (что и следовало ожиадать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:22 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
сорри, не приаттачил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:23 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Кстати, вы можете увидеть, что во втором случае значение SP = 100h = 256 байт. P.S. kolobok0По поводу инициализации стэка - полная чушь Похоже, единственным автором чуши являетесь вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:26 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Ruslan.IsbarovP.S. вот видишь, сколько флейма из-за неточности. Бывает. Я несовершенен. Пока еще. Ruslan.IsbarovТвои утверждения, мягко говоря, противоречат друг другу. Ничуть. Поясняю по буквам: управлять стеком, а именно выделить ему место в оперативке, настроить SS/SP и так далее - нормально. Делать в файле сегмент неиспользуемого мусора с тем, чтобы после загрузки программы он стал стеком - мягко говоря, не самый удачный подход. С точностью до моих многих лет неработы с ассемблером я предполагаю, что этот исходник приведет к появлению в файле двух сотен нафиг не нужных нулей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:36 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
softwarer[quot Ruslan.Isbarov]P.S. вот видишь, сколько флейма из-за неточности. Бывает. Я несовершенен. Пока еще. Ruslan.Isbarovэтот исходник приведет к появлению в файле двух сотен нафиг не нужных нулей. Нуууу... Много хочешь... С этим не угадаешь. Да и вообще, нецелесообразно заниматься оптимизацией подобных вещей в контексте MS-DOS. Гораздо целесообразнее сконцентрировать внимание на других вещах (уж благо в вышеприведенном мясе они есть). По крайней мере, лично я не видел реализаций, в которых бы этому уделялось большое внимание. Для программулины уровня лаб. работы в универе, достаточно. Тем более, автор, наверное, не понимает смысла этих строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:45 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Ruslan.IsbarovНуууу... Много хочешь... С этим не угадаешь. С чем? С тем, что эти байты нафиг не нужны, угадать несложно. И на месте препода я бы как раз за такие детали сильно резал оценку потому, что сделать нормально - элементарно, и наличие такого показывает просто халтурную работу. Если так написано в методичке - я бы приобрел экземпляров сто этой методички. И убедил бы автор их съесть. Ruslan.IsbarovДа и вообще, нецелесообразно заниматься оптимизацией подобных вещей в контексте MS-DOS. Удачен ли выбор контекста преподом - вопрос преподу. Но в любом случае работу стоит делать хорошо. Ruslan.IsbarovПо крайней мере, лично я не видел реализаций, в которых бы этому уделялось большое внимание. Для программулины уровня лаб. работы в универе, достаточно. На тройку с минусом - достаточно. Ruslan.IsbarovТем более, автор, наверное, не понимает смысла этих строк. И с каких пор это является смягчающим обстоятельством? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 14:22 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
Ruslan.Isbarov... "FILO" - это уже любопытно. Заставляет подумать о Вашей компетентности в данных вопросах. как говорил Казьма Прутков - "Где начало того конца, которым оканчивается начало и начинается конец.." (от ся добавлю) "того конца начала..." о чём это я ? а ну да... начнём с конца... Вас возбудило переставленные местами буковки или Вы не согласны с объяснением работы стэка на логическом уровне ? теперь по поводу чуши... Ваша цитата... Ruslan.Isbarovpush/pop - шо це таке? це работа со стеком! Более того вызывается подпрограмма hex2str. А шо в итоге? А на стек кладется адрес возврата. Содержимое IP. Це архитектурные особенности 8086. Более того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном... дык вот, если Вы не плохо работаете с отладчиком - проверьте следующее утверждение: "никакой гадости НЕ случится!" (от того, что сегмент стэка будет равен командному, смещение нулю, код программы с глубиной стэка не будет превышать сегмента и будут отсутствовать другие сегменты - ничего плохого НЕ будет) это первая ерунда сказанная Вами...(если Вы мне не верите - то уже рекомендовал обратиться к классикам) другая ерунда то, что сегмент стэка отсутствует как класс в программах формата COM (о чём уже кстати прозвучало).. Так, что по поводу объявления сегмента стэка (как понацея от гадости с ним) - так же ерунду сморозили...Более того программы формата COM именно так ся и ведут (как Вы показали под отладчиком) - CS=SS=DS=ES SP=0... хорошо, если Вас возбуждают слова "чушь" и "ерунда" - я могу принести Вам свои извенения и выразиться по другому: ВАШЕ УТВЕРЖДЕНИЕ - ЕСТЬ ЛОЖЬ... удачи Вам (круглый) ЗЫ Совет дня типа... Вы бы сосредоточились на задачи, а не пудрили начинающему человеку мозги информацией о стэке. Ему это сейчас - мягко говоря до фонаря... ЗЫ ЗЫ эх-хе-хе молодёжь, молодёжь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 14:29 |
|
||
|
Ошибка в программе на asm
|
|||
|---|---|---|---|
|
#18+
kolobok0Вас возбудило переставленные местами буковки или Вы не согласны с объяснением работы стэка на логическом уровне ? FILO? Да нет. Просто интересно где вы нашли такую формулировку. Вообще то LIFO. Зачем изобретать велосипед? kolobok0 теперь по поводу чуши... Ваша цитата... Ruslan.Isbarovpush/pop - шо це таке? це работа со стеком! Более того вызывается подпрограмма hex2str. А шо в итоге? А на стек кладется адрес возврата. Содержимое IP. Це архитектурные особенности 8086. Более того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться ( только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном... дык вот, если Вы не плохо работаете с отладчиком - проверьте следующее утверждение: "никакой гадости НЕ случится!" (от того, что сегмент стэка будет равен командному, смещение нулю, код программы с глубиной стэка не будет превышать сегмента и будут отсутствовать другие сегменты - ничего плохого НЕ будет) это первая ерунда сказанная Вами...(если Вы мне не верите - то уже рекомендовал обратиться к классикам) В этой программе ничего плохого НЕ будет. С этим я согласен. И ЭТО Я ПОДЧЕРКНУЛ В СВОЕМ УТВЕРЖДЕНИИ! Впрочем, специально для вас выделяю цветом. Вы бы сперва внимательно почитали наши цитаты. Глядишь, вопросы сами бы собой исчезли. kolobok0другая ерунда то, что сегмент стэка отсутствует как класс в программах формата COM (о чём уже кстати прозвучало).. Так, что по поводу объявления сегмента стэка (как понацея от гадости с ним) - так же ерунду сморозили...Более того программы формата COM именно так ся и ведут (как Вы показали под отладчиком) - CS=SS=DS=ES SP=0... Во первых, то что я показал под отладчиком - был EXE, а не COM. Во вторых, об этом тоже было сказано выше. Если вы еще раз внимательно почитаете тред, вы увидите, что приведенная здесь программа имеет формат EXE. И речь шла как раз таки об EXE. И это было сказано. kolobok0хорошо, если Вас возбуждают слова "чушь" и "ерунда" - я могу принести Вам свои извенения и выразиться по другому: ВАШЕ УТВЕРЖДЕНИЕ - ЕСТЬ ЛОЖЬ... Вам так показалось, видимо из-за собственной не внимательности. kolobok0 ЗЫ ЗЫ эх-хе-хе молодёжь, молодёжь... А вы, так понимаю, считаете себя ветераном? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 15:13 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=34226183&tid=1346354]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
139ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 471ms |

| 0 / 0 |
