Четверг, 21 Ноября 2024, 13:39

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[DOS][TASM]Рандом в диапазоне
SaiteiДата: Воскресенье, 11 Мая 2014, 20:32 | Сообщение # 1
старожил
Сейчас нет на сайте
Помогите пожалуйста. Уже второй день мозг мучаю, ничего не выходит. Хотелось бы получить db
last2424Дата: Воскресенье, 11 Мая 2014, 21:05 | Сообщение # 2
30 мл. блоков
Сейчас нет на сайте
Цитата
[DOS]

Штаааа? Кому досить комп собрался? surprised


Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)

Сообщение отредактировал 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++, то он уже будет намного чище код писать, и производительнее, ну и проще будет все smile
насчет радома: 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
Архитектор
Сейчас нет на сайте
Мне тоже интересно, как рандом работает smile

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, как жаль, что я не видел эту запись ранее! Всё равно спасибо большое, такое решение меня вдохновляет smile
wcptДата: Понедельник, 21 Июля 2014, 21:27 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
но можно проще, кстати. Также через таймер, но проще, проще некуда, наверно.

Сообщение отредактировал wcpt - Понедельник, 21 Июля 2014, 21:29
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг