|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.10.2018, 00:57 | #1 |
Пользователь
Регистрация: 06.07.2008
Сообщений: 91
|
запись адреса в регистр CS
Когда программа загружается в память операционной системой (например DOS, но это не важно), то насколько я знаю (может я ошибаюсь?) сама операционная система записывает адрес сегмента кода в регистр CS и соответственно по этим адресам и загружает соответствующую программу. Вопрос, как записать адрес в регистр CS если я загружаю программу в память собственноручно написанным загрузчиком без какой бы то ни было операционной системы?
Я так понял (может я опять ошибаюсь) инструкции вида: Код:
И ещё, вот такой код: Код:
Если ничего не записал в CS (я так пробовал и всё работало), то сам компилятор ассемблера - например MASM, пишет в CS ноль - хотя это бред скорее всего? Я программу загружал в начало памяти, а в CS ничего не писал и программа, повторяю без операционной системы, работала. Как быть если программа не вмещается в сегмент? Первый момент, как узнать что программа не вмещается в сегмент? Просто компильнуть код и посмотреть поместиться по размеру в 65536 байт (почему не 65535? 65535 + один первый нулевой байт) или нет? Далее, если мне в процессе работы надо прыгнуть на участок кода который находится в другом сегменте кода и он не в начале этого сегмента, при этом такие прыжки мне надо совершать неоднократно по ходу выполнения программы, причём в разные места другого сегмента кода. Как быть? Писать в какой то регистр разные числа, потом в самом начале кода программы который находится в другом сегменте, проверять эти числа и в зависимости какое число прыгать на соответствующий участок кода уже в этом сегменте, так как в регистр IP ничего записать напрямую я не могу? Если это так, то тогда не понятно как быть если программа была загружена операционной системой и выполняется вместе с ней. Откуда программа будет знать по каким адресам загрузили вторую часть её кода находящегося в другом сегменте, что бы этот адрес записать в CS? Когда я сам, гружу две части программы самописным загрузчиком, я знаю по каким адресам я её гружу, поэтому знаю, что записать в CS. Да и ещё, когда я поменял адрес в CS, в IP остаётся ведь прежний адрес, а мне надо выйти как то на начало этого сегмента (имеется ввиду вторая часть моей программы которая не влезла в первый сегмент кода), то есть записать в IP ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать? Я так думаю, что делается как то совсем по другому, но как? У форумчан может возникнуть вопрос, зачем мне это надо? Просто хочу до тонкостей разобраться. За любую помощь: ссылки на русскоязычный материал, или просто за объяснение вопроса или какой либо его части, буду благодарен! Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал). |
28.10.2018, 03:15 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Смотрите инструкцию JMP FAR - она меняет одновременно и CS и IP.
|
28.10.2018, 03:16 | #3 | |
Форумчанин
Регистрация: 17.10.2018
Сообщений: 184
|
Цитата:
PS: Выкладывайте свою операционку на обзор людской. Любопытно чего там народ кодит на столь низком уровне. |
|
28.10.2018, 10:13 | #4 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
v4567
Цитата:
Ваши программы ещё очень долго будут вмещаться в сегмент. Так что на это можно забить. Я бы сказал есть 3 выхода. 1. Умещать всё в сегменты 64 кб 2. Использовать сегменты по 4 ГБ. Код:
Для кода использовать функции описываете их как far дальнии. JMP FAR Для данных использовать PUSH mySegmnet POP ES ASSUME ES:mySegmnet Так как компилятор немного глупый то ем нужна подсказка в виде директивы ASSUME которая говорит что сейчас загружено в сегментый регистр В EXE-MZ, EXE-PE, ELF есть таблица релоков. Адреса меток и переменных, сегментов не кодируются сразу в числа. В место этого кодируется смещения, а загрузчик вычитывая таблице релоков патчит нужные места прибавляя адрес известного базового сегмента.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 28.10.2018 в 10:16. |
|
28.10.2018, 16:39 | #5 | |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
Цитата:
судя по тому, что v4567 разместил аналогичный текст на сайбере в разделе Assembler: i8080/8085/KP580, то у ТС никакой операционки нет, он даже точно не знает какой процессор ему нужен. Так треп один... |
|
28.10.2018, 19:24 | #6 | |
Пользователь
Регистрация: 06.07.2008
Сообщений: 91
|
Давно. Несколько раз начинал учить ассемблер, потом бросал. Дело в том что у меня образование - радиоэлектронщик и в институте проходили микропроцессорный комплекс КР580 соответственно к нему учили ассемблер. После института не найдя работы по радиоэлектронике, практически бросил ей заниматься и начал заниматься компьютерами в частности системным администрированием. Потом появилось желание написать свою простенькую операционку. Вот тогда первый раз, не считая института, взялся за ассемблер. Написал самый простенький загрузчик и попытки, что то вывести на экран и кое какой ввод. Всё писалось для дискетки. Бросал и возвращался к этому много раз.
Предпоследний раз вернулся к ассемблеру в 2012 году (за изучение взял книгу Пильщикова - Программирование на языке ассемблера), взял старый загрузчик, как оказалось при помощи старого кода написанного для загрузки с дискетки, (информацию брал с этого сайта http://www.codenet.ru/progr/dos/int_0012.php) можно грузиться и с флешки. Теперь не сектора, (хотя указывается как сектора, дорожка и головка), но для флешки это будут просто блоки по 512 байт иидти они будут друг за другом по порядку. Есть способ более правильный (на каком то форуме был код), там именно для накопителей: флешка, жёсткий диск, но у меня он не работал. Связавшись с автором поста, он мне написал, что у него всё работает. Потом на такой код натыкался ив других местах интернета, но у меня он так и не заработал, причину не работы я так и не понял. Поэтому гружусь типа с дискетки, но на самом деле с флешки. Потом к этому загрузчику написал тетрис. То есть загрузчиком загружаю тетерис и всё, можно играть. Никакого доса или виндовса. Тетрис писал три месяца. Всё написал, всё работает. После этого сразу бросил и сейчас опять вернулся к ассемблеру. Правда сейчас ВСЁ ЗАБЫЛ! Кстати тогда с CS я так ничего и не понял и те вопросы которые я задавал в этой теме, тогда я ответы на них не знал. Не знаю и сейчас. Зачем мне это нужно сейчас? Как и раньше так и сейчас, мне всё таки хочется разобраться в деталях и тонкостях работы операционной системы *nix благо для этого, специально для учебных целей есть написана операционная система xv6 https://ru.wikipedia.org/wiki/Xv6 Там совсем немного кода, совсем чуть, чуть на ассемблере, остальное на Си, разобраться реально. На ютубе есть по ней есть лекции Кринкина. Всего 6 уроков. Всё очень сжато и мало. Разве можно за 6 уроков в полной мере изучить ассемблер - реальный режим, защищённый режим и саму xv6? Думаю нет. Поэтому для того, что бы разобраться, надо разобраться с ассемблером, потом защищённый режим, потом саму xv6. Си я знаю не очень хорошо, но для того что бы разобраться в исходниках xv6 думаю моих знаний хватит. Выкладывать ничего не хотел, так как скажут реклама и т.д. Но так как в мой адрес говорят, что я трепло: Цитата:
Да это не операционка, но он запускается без операционки и работает. В архиве папки: 866, cp1252, utf8 это один и тот же код, только комментарии и некоторое пояснение в разной кодировке. В dosbox будет работать если скомпилить для доса-виндовса. В архиве уже есть образы без ос, поэтому они в dosbox работать не будут. Для проверки надо запускать: qemu -boot c zagrtetris.img zagrtetris.img - это уже загрузчик вместе с игрой. |
|
28.10.2018, 19:25 | #7 |
Пользователь
Регистрация: 06.07.2008
Сообщений: 91
|
PS: Пойду смотреть на JMP FAR
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
запись IPv4 адреса в лог | confind | Windows | 2 | 13.10.2014 10:12 |
Чтения адреса из файла и запись в указательную переменную | Anthoni | Общие вопросы C/C++ | 2 | 04.12.2012 00:32 |
Запись данных в регистр в обратном порядке | EvgeniyaK | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 08.11.2012 08:19 |
ассемблер, извлечение полного адреса и запись его в файл | frm user | Помощь студентам | 0 | 20.02.2012 20:28 |
Запись в регистр | Vitek-pm | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 10 | 17.02.2010 04:00 |