[DOS][TASM]Рандом в диапазоне
| |
Saitei | Дата: Воскресенье, 11 Мая 2014, 20:32 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Помогите пожалуйста. Уже второй день мозг мучаю, ничего не выходит. Хотелось бы получить db
|
|
| |
last2424 | Дата: Воскресенье, 11 Мая 2014, 21:05 | Сообщение # 2 |
30 мл. блоков
Сейчас нет на сайте
| Штаааа? Кому досить комп собрался?
Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Сообщение отредактировал last2424 - Воскресенье, 11 Мая 2014, 21:07 |
|
| |
Saitei | Дата: Воскресенье, 11 Мая 2014, 21:29 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| last2424, Цитата DOS является однозадачной операционной системой. После запуска управление передаётся прикладной программе, которая получает в своё распоряжение все ресурсы компьютера и может осуществлять ввод-вывод посредством как функций, предоставляемых операционной системой, так и функций базовой системы ввода-вывода (BIOS), а также работать с устройствами напрямую.
DOS имеет консольную систему ввода-вывода и поддерживает три стандартных потока: stdin, stdout и stderr.
DOS — 16-битная операционная система, работающая в реальном режиме, поэтому для расширения возможностей и преодоления ограничений реального режима были созданы так называемые расширители DOS. Они запускают программы в защищённом 32-битном режиме и эмулируют исходные сервисы операционной системы. Обычно они поддерживают стандарт DOS Protected Mode Interface (DPMI). Самый известный и широко используемый (в компьютерных играх) расширитель — DOS/4GW. Современные windows не дают доступ к прерываниям BIOS, только дают доступ к своему API. По задаче, которую поставили мне и я её должен решить, я должен всё писать "с нуля", используя лишь "своё". Следовательно у меня должен быть доступ к прерываниям BIOS.
Вопрос ещё актуален. Как же рандом написать?
|
|
| |
Xakep | Дата: Понедельник, 12 Мая 2014, 08:24 | Сообщение # 4 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата last2424 ( ) Штаааа? Кому досить комп собрался? Все правильно делает, программирование под дос, тем более под ASM, дает глубокие понимание как работает программа изнутри, в будущем, когда он начнет что-то делать на C/C++, то он уже будет намного чище код писать, и производительнее, ну и проще будет все насчет радома: link ну а если хочется самому написать с нуля рандом, то тут придется использовать рандомизированные алгоритмы, это нужно лезть в книжку по алгоритмам ) ну или самому попробовать написать, используя системное время.Добавлено (12.05.2014, 08:24) --------------------------------------------- а вот кстати нашел через таймер: Код seedrand push di les di, [timer] mov eax, [es:di] ; get timer tick count mov [seed], eax ; and use to seed our random gen push cs pop es pop di ret
Сообщение отредактировал Xakep - Понедельник, 12 Мая 2014, 08:22 |
|
| |
Folleah | Дата: Понедельник, 12 Мая 2014, 08:24 | Сообщение # 5 |
Архитектор
Сейчас нет на сайте
| Мне тоже интересно, как рандом работает
|
|
| |
wcpt | Дата: Вторник, 13 Мая 2014, 13:38 | Сообщение # 6 |
постоянный участник
Сейчас нет на сайте
| Цитата Xakep ( ) mov eax вот это же не прокатит на дос, разве нет?
Сообщение отредактировал wcpt - Вторник, 13 Мая 2014, 13:47 |
|
| |
Saitei | Дата: Вторник, 13 Мая 2014, 18:51 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Цитата wcpt ( ) вот это же не прокатит на дос, разве нет? да, не прокатит... Таких регистров в нём "как бы" нет
|
|
| |
wcpt | Дата: Среда, 14 Мая 2014, 15:50 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| просто dos работает в реальном режиме, в котором все регистры, кроме 16-битных(и их половин), не задействованы.
Сообщение отредактировал wcpt - Среда, 14 Мая 2014, 15:51 |
|
| |
Saitei | Дата: Среда, 14 Мая 2014, 16:50 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| wcpt, я что-то слышал о возможностях расширения DOS. Всё равно нельзя открыть регистры "покрупнее"?
|
|
| |
wcpt | Дата: Среда, 14 Мая 2014, 21:08 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Насчет расширителей не в курсе, слышал лишь, что они есть. Я точно не знаю, но ты мог бы попробовать писать префиксы для генерации 32-х битных команд непосредственно машинным кодом. Ассемблер ты "обманешь", только будет ли работать - не знаю, не пробовал.
Сообщение отредактировал wcpt - Среда, 14 Мая 2014, 21:11 |
|
| |
-l33t-h4xx- | Дата: Четверг, 15 Мая 2014, 07:30 | Сообщение # 11 |
участник
Сейчас нет на сайте
| Гугли линейный конгруэнтный метод. Большинство софтверных генераторов базируются на нём. Только вот беда: для хорошей работы этого метода потребуются большие числа, гораздо больше 65535, поэтому придётся: а) Вручную переходить в защищённый режим (для маленькой программы это слишком). б) Использовать расширители, например, DOS/4GW. Никогда не пользовался, но штука, говорят, гадкая. в) Совершать крутые хацкерские махинации с регистрами: умножение с переносом и прочие вещи. Почитать об этом можно, скажем, в книге Скэнлона "Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера" в главе 4, книжка легко гуглится.
Мне больше нравится вариант В.
Как правильно задавать вопросы
Сообщение отредактировал -l33t-h4xx- - Четверг, 15 Мая 2014, 07:40 |
|
| |
Akyltist | Дата: Понедельник, 09 Июня 2014, 07:56 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Код random db 0
rdtsc mov bx, 6 div bx inc dx mov [random],dl получаешь число от 1 до 6, дальше докручиваешь до диапозонной функции. Можешь складывать несколько случайных величин, можешь ксорить, умножать - в общем полет фантазии.
Вместо rdtsc можешь использовать досовскую функцию. Код mov ah, 2ch int 21h
xor ax, ax ; чистим ah, точнее весь ax - но надо очистить ah mov al,dl
Можешь не ограничивать диапозон от 1 до 6, а сам урезать до твоего максимума, пока он не станет меньше. Можешь даже еще усложнить генерацию: Код mov ah, 2ch int 21h mov ax, dx and ax, 0fh и после этого срезать до нужного диапозона.
Если залезете в защищенный режим, то вот вам готовый генератор: Fasm Random for KolibriOS
Вот так можно эту функцию надстроить (код можете использовать по лицензии BSD), код на fasm т.к. пишу на нём, если надо перенесете: Код ;-----------------------------------------------------------------------------+ ; Функция генерации случайного числа в диапозоне [min...max] | ;-----------------------------------------------------------------------------+ ; На входе : edi - указатель на [max] значение | ; На входе : edi - указатель на [min] значение | ; На выходе : eax - случайное число | ;-----------------------------------------------------------------------------+ _randomrange: push esi edi edx ecx mov ecx,edi sub ecx,esi inc ecx call _random xor edx,edx div ecx mov eax,edx add eax,esi pop ecx edx edi esi ret ;->
На закуску! Код __RLRandom: rdtsc mov cx,ax mov bx,dx mul CS:0x8405 shl cx,3 add ch,cl add dx,cx add dx,bx shl bx,2 add dx,bx add dh,bl shl bx,5 add dh,bl inc ax adc dx,0 xchg ax,bx mov ax,0x80 mov cx,32 _loop: test dh,0x80 jne @f shl bx,1 rcl dx,1 dec al loop _loop xor al,al @@: and dh,0x7F retf
|
|
| |
Saitei | Дата: Воскресенье, 20 Июля 2014, 12:01 | Сообщение # 13 |
старожил
Сейчас нет на сайте
| Akyltist, как жаль, что я не видел эту запись ранее! Всё равно спасибо большое, такое решение меня вдохновляет
|
|
| |
wcpt | Дата: Понедельник, 21 Июля 2014, 21:27 | Сообщение # 14 |
постоянный участник
Сейчас нет на сайте
| но можно проще, кстати. Также через таймер, но проще, проще некуда, наверно.
Сообщение отредактировал wcpt - Понедельник, 21 Июля 2014, 21:29 |
|
| |
|