3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148
|
|
1 | |
Запись адреса в регистр CS28.10.2018, 00:55. Показов 3252. Ответов 3
Метки нет (Все метки)
Когда программа загружается в память операционной системой (например DOS, но это не важно), то насколько я знаю (может я ошибаюсь?) сама операционная система записывает адрес сегмента кода в регистр CS и соответственно по этим адресам и загружает соответствующую программу. Вопрос, как записать адрес в регистр CS если я загружаю программу в память собственноручно написанным загрузчиком без какой бы то ни было операционной системы?
Я так понял (может я опять ошибаюсь) инструкции вида: Код PROG segment assume cs:PROG на самом деле ничего в CS не пишут. И ещё, вот такой код: Код PROG segment assume cs:PROG, ds:PROG, ss:PROG, es:PROG говорит о том, что регистры cs, ds, ss, es будут иметь одинаковые адреса и стоит записать адрес только в один, а в остальных он появиться автоматически? Если ничего не записал в CS (я так пробовал и всё работало), то сам компилятор ассемблера - например MASM, пишет в CS ноль - хотя это бред скорее всего? Я программу загружал в начало памяти, а в CS ничего не писал и программа, повторяю без операционной системы, работала. Как быть если программа не вмещается в сегмент? Первый момент, как узнать что программа не вмещается в сегмент? Просто компильнуть код и посмотреть поместиться по размеру в 65536 байт (почему не 65535? 65535 + один первый нулевой байт) или нет? Далее, если мне в процессе работы надо прыгнуть на участок кода который находится в другом сегменте кода и он не в начале этого сегмента, при этом такие прыжки мне надо совершать неоднократно по ходу выполнения программы, причём в разные места другого сегмента кода. Как быть? Писать в какой то регистр разные числа, потом в самом начале кода программы который находится в другом сегменте, проверять эти числа и в зависимости какое число прыгать на соответствующий участок кода уже в этом сегменте, так как в регистр IP ничего записать напрямую я не могу? Если это так, то тогда не понятно как быть если программа была загружена операционной системой и выполняется вместе с ней. Откуда программа будет знать по каким адресам загрузили вторую часть её кода находящегося в другом сегменте, что бы этот адрес записать в CS? Когда я сам, гружу две части программы самописным загрузчиком, я знаю по каким адресам я её гружу, поэтому знаю, что записать в CS. Да и ещё, когда я поменял адрес в CS, в IP остаётся ведь прежний адрес, а мне надо выйти как то на начало этого сегмента (имеется ввиду вторая часть моей программы которая не влезла в первый сегмент кода), то есть записать в IP ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать? Я так думаю, что делается как то совсем по другому, но как? У форумчан может возникнуть вопрос, зачем мне это надо? Просто хочу до тонкостей разобраться. За любую помощь: ссылки на русскоязычный материал, или просто за объяснение вопроса или какой либо его части, буду благодарен! Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал).
0
|
28.10.2018, 00:55 | |
Ответы с готовыми решениями:
3
Поместить в регистр значение половины адреса переменной Запись в регистр сведений. Ошибка: Запись не верна Сегментный регистр DS, CS, данные копируются из одного и того же адреса Запись. Известны фамилии,адреса и телефоны 25-ти человек. Найти фамилии и адреса людей, чей телефон начинается с цифры 3 |
Ушел с форума
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
|
|
28.10.2018, 03:09 | 2 |
v4567,
а есть ли у процессора i8080/8085/KP580 регистры cs, ds, ss, es? Существует ли у i8080/8085/KP580 сегментная организация памяти? Или при написании загрузчика тип микропроцессора не важен? Просто настораживает фраза и при этом Обычно, так пишут за один день до пересдачи экзамена... Да и для обсуждение тонкостей работы "загрузки программы в память собственноручно написанным загрузчиком без какой бы то ни было операционной системы?" больше подходит раздел "ОС на Assembler"
1
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
29.10.2018, 03:50 | 3 |
Это вообще не инструкции, а директивы, а директивы являются описаниями, информацией для принятия ассемблером к сведению и они не исполняются и делать ничего не делают.
И это тоже никакой не код. Это описания, которые ничего не делают и делать не могут. Это всего-лишь "Ассемблер, сцуко, имей ввиду что ...". Assume это по аглицки и есть "полагай, имей ввиду".
Добавлено через 13 минут А у регистров есть адреса ? Какие мистическое представление о роли операционной системы. Когда на процессор подается питание, то аппаратно в регистр CS записывается F000, в регистр IP записывается FFF0 и понеслась. Процессор дальше работает так как должен работать процессор. Операционной системы еще нет, она еще не загружена, а значение в CS уже есть и процессор работает. Тебе просто лень учебник читать и ты решил пойти по пути наименьшего сопротивления ? Вопросы-то такие, что на них невозможно отвечать. Всюду видно, что ты слышал какой-то звон, да не знаешь где он.
2
|
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
|
||||||
29.10.2018, 16:22 | 4 | |||||
А лучше открой мануал и почитай про jmp в реальном режиме.
1
|
29.10.2018, 16:22 | |
29.10.2018, 16:22 | |
Помогаю со студенческими работами здесь
4
Запись в регистр сведений из C# Запись в регистр не работает Запись в регистр накопления Запись из обработки в регистр Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |