Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 422
от 11.04.2006, 10:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 302, Экспертов: 23
В номере:Вопросов: 1, Ответов: 4


Вопрос № 39520: Здравствуйте! Я новичок в программировании на Ассемблере. У меня такой вопрос. Как процессор знает, что после кода в программе (.com, например) следуют данные, объявленные как DB, DW и т.п., и он их не выполняет, как код? Ведь CS и DS указыва...

Вопрос № 39.520
Здравствуйте! Я новичок в программировании на Ассемблере.
У меня такой вопрос.
Как процессор знает, что после кода в программе (.com, например) следуют данные, объявленные как DB, DW и т.п., и он их не выполняет, как код? Ведь CS и DS указывают на один и тот же сегмент.
Отправлен: 06.04.2006, 10:02
Вопрос задал: Ромыч (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Евгений Иванов
Здравствуйте, Ромыч!
Процессор не знает. Но программист знает. И пишет программу так, чтобы ничего никуда не вылазило.
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +79087645721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214;88;90;76
----
Ответ отправлен: 06.04.2006, 10:05

Отвечает: Boriss
Здравствуйте, Ромыч!
Никак. С помощью отладчика легко убедиться, что любой набор бит процессор понимает как команду. Это задача программиста - не допустить, чтобы данные выполнялись как команды
Почитать можно у Зубкова в разделе о способах передачи параметров подпрограмме
---------
Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: факультет Электронной техники, Мордовский госуниверситет
Адрес: г. Саранск
WWW: Программирование на Паскале
----
Ответ отправлен: 06.04.2006, 11:00

Отвечает: mix_mix
Здравствуйте, Ромыч!
Процессору ярко фиолетово, что у Вас написано код или "данные". Для него есть только байты :).
И если Вы ассемблируете такой код:
mov ax, 13
db "fѓА2"
push ax
ret
То в результате в стеке число будет не 13, а 63 (!). Так получится потому, что db "fѓА2" - это не что иное как машинный код 66 83 С0 32, замененный соответствующими ASCII кодами, который представляет собой инструкцию add ax, 50. Так, что вот какая может выйти вещь. Поэтому такие задачи решать должен сам программист/ассемблер, а не процессор.
Ответ отправил: mix_mix (статус: 1-ый класс)
Ответ отправлен: 06.04.2006, 19:30

Отвечает: Пан Павел Константинович
Здравствуйте, Ромыч!

И так, давайте по порядку.

Вот пример *.com программы для наших с вами эксперементов:

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
Lb db 0CDh,20h ;Данные

ret ;Exit
CSEG ends
end Begin

И так что мы видим? А видим мы вот что, мы с вами зарезервировали область памяти и дали этой области имя Lb, при этом наша область имеет размер в два байта, 1-й байт содержит 0СDh, второй байт 20h. ВЫ спросите почему именно эти значения, а вот почему 0СD20h, это машинное представление инструкции INT 20H, которая используется для выхода из программы. И если теперь вы запустите эту программу под отладчиком то вы увидите, вот что:
;------------------------------------------
CS:0100 CD20 int 20h
CS:0102 C3 ret
;------------------------------------------

Увидели это? Если да, то выполните эту программу по шагова без захода.
Интересно... скажете вы, вроде мы должны были выйти из программы после выполнения команды ret, а мы вышли сразу после первого шага. Это и правильно потому-что INT 20H или его машинный аналог 0CD20H это инструкция для выхода из программы.
Вывод:
Компьютеру без разницы, код это программы или данные её он выполняет всё, как будто это код команд. Другое дело если не довать Компьютеру дайти до данных, путём выхода из программы до того как Компьютер начнёт интерпретировать данные как код команд. Например:

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:

ret ;Exit

Lb db 0CDh,20h ;Данные
CSEG ends
end Begin

Хоть здесь и есть 0CD20H(INT 20H), выход из программы будет после команды ret.
Это и логично потому-что Компьютер просто не дайдет до этих данных, его оборвёт ret.
Или вот:

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
jmp short L1
Lb db 0CDh,20h ;Данные

L1:
;Здесь код программы

ret ;Exit

CSEG ends
end Begin

С, Уважением MnEm0n!C.

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 5-ый класс)
Ответ отправлен: 06.04.2006, 23:09


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.30 (beta) от 09.04.2006
Яндекс Rambler's Top100

В избранное