Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2018, 00:57   #1
v4567
Пользователь
 
Регистрация: 06.07.2008
Сообщений: 91
По умолчанию запись адреса в регистр CS

Когда программа загружается в память операционной системой (например 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 ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать? Я так думаю, что делается как то совсем по другому, но как?

У форумчан может возникнуть вопрос, зачем мне это надо? Просто хочу до тонкостей разобраться.

За любую помощь: ссылки на русскоязычный материал, или просто за объяснение вопроса или какой либо его части, буду благодарен!

Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал).
v4567 вне форума Ответить с цитированием
Старый 28.10.2018, 03:15   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Смотрите инструкцию JMP FAR - она меняет одновременно и CS и IP.
waleri вне форума Ответить с цитированием
Старый 28.10.2018, 03:16   #3
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от v4567 Посмотреть сообщение
...как записать адрес в регистр CS...когда я поменял адрес в CS...так как в регистр IP ничего записать напрямую я не могу?
Какой ужос! И давно Вы так в ассемблер окунулись? Согласно справочному листу по архитектуре х86 от Интела, инструкций на запись регистра сегмента кода и указателя текущей инструкции не существует. Но если сильно жмёт, то можно – берём нужные значения, помещаем их в stack, а дальше чудная инструкция retf достаёт из stack'a пару и mov'ит эту пару прямиком в CS:IP.
PS: Выкладывайте свою операционку на обзор людской. Любопытно чего там народ кодит на столь низком уровне.
jillitil вне форума Ответить с цитированием
Старый 28.10.2018, 10:13   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

v4567
Цитата:
Сообщение от v4567 Посмотреть сообщение
Если ничего не записал в CS (я так пробовал и всё работало), то сам компилятор ассемблера - например MASM, пишет в CS ноль - хотя это бред скорее всего?
Вам просто повезло. Скорее всего 0 в CS вам записал биос.

Цитата:
Сообщение от v4567 Посмотреть сообщение
Как быть если программа не вмещается в сегмент?
Ваши программы ещё очень долго будут вмещаться в сегмент. Так что на это можно забить.
Я бы сказал есть 3 выхода.
1. Умещать всё в сегменты 64 кб
2. Использовать сегменты по 4 ГБ.
Код:
Code	SEGMENT	PARA PUBLIC "code" USE32
Assume ds:Data
3. Переключать сегменты на ходу.
Для кода использовать функции описываете их как far дальнии.
JMP FAR


Для данных использовать
PUSH mySegmnet
POP ES
ASSUME ES:mySegmnet

Так как компилятор немного глупый то ем нужна подсказка в виде директивы ASSUME которая говорит что сейчас загружено в сегментый регистр

Цитата:
Сообщение от v4567 Посмотреть сообщение
Откуда программа будет знать по каким адресам загрузили вторую часть её кода находящегося в другом сегменте, что бы этот адрес записать в CS?
В EXE-MZ, EXE-PE, ELF есть таблица релоков. Адреса меток и переменных, сегментов не кодируются сразу в числа. В место этого кодируется смещения, а загрузчик вычитывая таблице релоков патчит нужные места прибавляя адрес известного базового сегмента.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 28.10.2018 в 10:16.
Pavia вне форума Ответить с цитированием
Старый 28.10.2018, 16:39   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от jillitil Посмотреть сообщение
PS: Выкладывайте свою операционку на обзор людской. Любопытно чего там народ кодит на столь низком уровне.
jillitil,
судя по тому, что v4567 разместил аналогичный текст на сайбере в разделе Assembler: i8080/8085/KP580, то у ТС никакой операционки нет, он даже точно не знает какой процессор ему нужен. Так треп один...
Mikl___ вне форума Ответить с цитированием
Старый 28.10.2018, 19:24   #6
v4567
Пользователь
 
Регистрация: 06.07.2008
Сообщений: 91
По умолчанию

Цитата:
Сообщение от jillitil Посмотреть сообщение
Какой ужос! И давно Вы так в ассемблер окунулись?
Давно. Несколько раз начинал учить ассемблер, потом бросал. Дело в том что у меня образование - радиоэлектронщик и в институте проходили микропроцессорный комплекс КР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 думаю моих знаний хватит.
Выкладывать ничего не хотел, так как скажут реклама и т.д. Но так как в мой адрес говорят, что я трепло:

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
то у ТС никакой операционки нет, он даже точно не знает какой процессор ему нужен. Так треп один...
то придётся выложить, свой тетрис.
Да это не операционка, но он запускается без операционки и работает.

В архиве папки: 866, cp1252, utf8 это один и тот же код, только комментарии и некоторое пояснение в разной кодировке.

В dosbox будет работать если скомпилить для доса-виндовса. В архиве уже есть образы без ос, поэтому они в dosbox работать не будут. Для проверки надо запускать: qemu -boot c zagrtetris.img
zagrtetris.img - это уже загрузчик вместе с игрой.
Вложения
Тип файла: zip tetris.zip (114.1 Кб, 11 просмотров)
v4567 вне форума Ответить с цитированием
Старый 28.10.2018, 19:25   #7
v4567
Пользователь
 
Регистрация: 06.07.2008
Сообщений: 91
По умолчанию

PS: Пойду смотреть на JMP FAR
v4567 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись 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