Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в досе предел оп. памяти до 1М? у меня есть исходники но они не компилят 
:(
    Опции темы
Monty
  Дата 12.5.2003, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



вот нашел у себя исходник проги кот освобождает от ограничения в 1М памяти в досе,
вроде до 4Г, но вот беда не компилятся ни на одном компиляторе (да я и не умею)
тот что их написал шарит в процессорах, и это было доступно еще с первого пня!

вот сам архив а ниже код из 4gb.asm
Цитата
.386p

;-----------------------------------------;
;    This asm module allows programmer    ;
; to use all computer memory (up to 4GB). ;
;                                        ;
; Works in pure DOS.  Needs Real Mode of ;
; processor.  Don't try to execute under ;
; Windows. You'll get nothing. Better    ;
; load previous DOS version or boot using ;
; DOS system diskette.                    ;
;                                        ;
;    Program doesn't work under memory    ;
;  managers such as Himem.sys, Emm.exe,  ;
;            Qemm.exe etc.              ;
;                                        ;
; Written by Alexei. A. Frounze  © 1999 ;
; E-mail:    [email protected]            ;
; Homepage:  http://www.chat.ru/~alexfru ;
;-----------------------------------------;

Public  Enable_A20, Disable_A20
Public  Check_Safety, XMS_Avail, PMode
Public  MemRB, MemRW, MemRL, MemWB, MemWW, MemWL

Code    Segment Para Public Use16
        Assume  CS:Code

;--------------------------- A20 line switching ----------------------------

Enable_A20 Proc Pascal Near
        Mov    AL, 0D1h
        Out    64h, AL
        Mov    AL, 0DFh
        Out    60h, AL
        Ret
Enable_A20 EndP

Disable_A20 Proc Pascal Near
        Mov    AL, 0D1h
        Out    64h, AL
        Mov    AL, 0DDh
        Out    60h, AL
        Ret
Disable_A20 EndP

;----------- Checking processor mode and looking for Himem.sys -------------

Check_Safety Proc Pascal Near
        SMSW    CS:XXX
        Mov    AX, CS:XXX
        And    AX, 1
        JNZ    @@CSQ          ; 1 - Processor is in Protected Mode
        Mov    AX, 4300h
        Int    2Fh
        Shr    AX, 6
        And    AX, 2
        JNZ    @@CSQ          ; 2 - Himem.sys is installed
                                ; 0 - OK
@@CSQ:
        Ret
XXX    DW      ?
Check_Safety EndP

;------------------------- Getting XMS ammount -----------------------------

Read_CMOS Proc Pascal Near
        Out    70h, AL  ; CMOS address should be stored in the AL register
        Jmp    @@RCW    ; Little delay
@@RCW:
        In      AL, 71h  ; AL = value
        Ret
Read_CMOS EndP

XMS_Avail Proc Pascal Near
        Mov    AL, 31h  ; 31h = hi byte address
        Call    Read_CMOS
        Mov    AH, AL
        Mov    AL, 30h  ; 30h = low byte address
        Call    Read_CMOS
        Ret              ; AX = XMS installed above 1MB (in Kilobytes)
XMS_Avail EndP

;-------- Protected mode intialization and creation of 4GB segment ---------

PMode  Proc Pascal Near
        Xor    EAX, EAX
        Mov    AX, CS
        Shl    EAX, 4
        LEA    EDX, GDT
        Add    EAX, EDX
        Mov    DWord Ptr CS:GDTR+2, EAX; Fill in GDTR with physical address
                                        ; of Global Descriptor Table
        Push    DS
        CLI
        LGDT    FWord Ptr CS:GDTR      ; Load Global Descriptor Table
        Mov    EAX, 1
        Mov    CR0, EAX                ; Set Protected Mode
        Mov    AX, 8
        Mov    DS, AX
        Mov    ES, AX
        Mov    FS, AX
        Mov    GS, AX                  ; All segment registers are loaded
                                        ; with 4GB segment's selector
        Xor    EAX, EAX
        Mov    CR0, EAX                ; Set Real Mode
        STI
        Pop    DS

;----------------------------------------------------------;
; Now you can access all the memory by putting zero to a  ;
; segment register and 32bit physical address to an index  ;
; register.                                                ;
;                    -= Simple example =-                ;
; Xor AX, AX                                              ;
; Mov ES, AX                  ; zero the ES register      ;
; Mov EDI, 1024*1024+65536    ; 1st byte we can use freely ;
; Mov BL, Byte Ptr ES:[EDI]  ; read byte                  ;
; Mov DWord Ptr ES:[EDI], EDX ; write dword                ;
;----------------------------------------------------------;

        Ret

GDT    DQ      0, 8F92000000FFFFh      ; "0" & "4GB" Descriptors
GDTR    DW      16, 0, 0
PMode  EndP

;------------------------ Memory reading functions -------------------------

MemRB  Proc Pascal Near                ;Offs : DWord
        Push    BP
        Mov    BP, SP
        Push    DS
        Xor    AX, AX
        Mov    DS, AX
        Mov    EBX, DWord Ptr [BP+4]
        Mov    AL, [EBX]
        Pop    DS
        Pop    BP
        Ret    4
MemRB  EndP

MemRW  Proc Pascal Near                ;Offs : DWord
        Push    BP
        Mov    BP, SP
        Push    DS
        Xor    AX, AX
        Mov    DS, AX
        Mov    EBX, DWord Ptr [BP+4]
        Mov    AX, [EBX]
        Pop    DS
        Pop    BP
        Ret    4
MemRW  EndP

MemRL  Proc Pascal Near                ;Offs : DWord
        Push    BP
        Mov    BP, SP
        Push    DS
        Xor    AX, AX
        Mov    DS, AX
        Mov    EBX, DWord Ptr [BP+4]
        Mov    EAX, [EBX]
        Shld    EDX, EAX, 16
        Pop    DS
        Pop    BP
        Ret    4
MemRL  EndP

;------------------------ Memory writing functions -------------------------

MemWB  Proc Pascal Near                ;Offs : DWord, Value : Byte
        Push    BP
        Mov    BP, SP
        Push    DS
        Xor    AX, AX
        Mov    DS, AX
        Mov    EBX, DWord Ptr [BP+6]
        Mov    AL, Byte Ptr [BP+4]
        Mov    [EBX], AL
        Pop    DS
        Pop    BP
        Ret    6
MemWB  EndP

MemWW  Proc Pascal Near                ;Offs : DWord, Value : Word
        Push    BP
        Mov    BP, SP
        Push    DS
        Xor    AX, AX
        Mov    DS, AX
        Mov    EBX, DWord Ptr [BP+6]
        Mov    AX, Word Ptr [BP+4]
        Mov    [EBX], AX
        Pop    DS
        Pop    BP
        Ret    6
MemWW  EndP

MemWL  Proc Pascal Near                ;Offs : DWord, Value : DWord
        Push    BP
        Mov    BP, SP
        Push    DS
        Xor    AX, AX
        Mov    DS, AX
        Mov    EBX, DWord Ptr [BP+8]
        Mov    EAX, DWord Ptr [BP+4]
        Mov    [EBX], EAX
        Pop    DS
        Pop    BP
        Ret    8
MemWL  EndP

Code    EndS

End

это будет работать? если у кого работает скинте мне скомпилированый файл smile.gif


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Chingachguk
Дата 12.5.2003, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Эта хрень называется "нереальный режим". Достигается переходом из RealMode в Protected Mode с загрузкой во все сегментные регистры селектора на дескриптор, описывающий память от 0 до 4Гбайт. Про это можно почитать в книге Зубкова С.В.

Все, что тебе нужно - это чтобы выполнился вот этот кусок:

Цитата

;-------- Protected mode intialization and creation of 4GB segment ---------
        Xor    EAX, EAX
        Mov    AX, CS
        Shl    EAX, 4
        LEA    EDX, GDT
        Add    EAX, EDX
        Mov    DWord Ptr CS:GDTR+2, EAX; Fill in GDTR with physical address
                                        ; of Global Descriptor Table
        Push    DS
        CLI
        LGDT    FWord Ptr CS:GDTR      ; Load Global Descriptor Table
        Mov    EAX, 1
        Mov    CR0, EAX                ; Set Protected Mode
        Mov    AX, 8
        Mov    DS, AX
        Mov    ES, AX
        Mov    FS, AX
        Mov    GS, AX                  ; All segment registers are loaded
                                        ; with 4GB segment's selector
        Xor    EAX, EAX
        Mov    CR0, EAX                ; Set Real Mode
        STI
        Pop    DS
;----------------------------------------------------------;
; Now you can access all the memory by putting zero to a  ;
; segment register and 32bit physical address to an index  ;
; register.                                                ;
;                    -= Simple example =-                ;
; Xor AX, AX                                              ;
; Mov ES, AX                  ; zero the ES register      ;
; Mov EDI, 1024*1024+65536    ; 1st byte we can use freely ;
; Mov BL, Byte Ptr ES:[EDI]  ; read byte                  ;
; Mov DWord Ptr ES:[EDI], EDX ; write dword                ;
;----------------------------------------------------------;

        Ret

GDT    DQ      0, 8F92000000FFFFh      ; "0" & "4GB" Descriptors
GDTR    DW      16, 0, 0


Да пожалуй и линию A20 открыть нужно:

Цитата

;--------------------------- A20 line switching ----------------------------
        Mov    AL, 0D1h
        Out    64h, AL
        Mov    AL, 0DFh
        Out    60h, AL


Оформи его как отдельный com-файл и запусти. Только работать это будет в чистом досе (в Real Mode) - например, в загруженном в autoexec.bat-е под 98-ми Нортоне или Волкове.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Monty
  Дата 12.5.2003, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



Спасибо Chingachguk !!! буду пробовать smile.gif , этот дос навигатор так много памяти берет, надеюсь ему теперь хватит smile.gif))


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Chingachguk
Дата 29.5.2003, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Значит, так: код вынесен в файл far_addr.asm:

Цитата

.586p
text segment byte public use16
assume cs:text,ds:text
org  100h
begin:
  mov  dx,offset Start
  call @@Message
;-------- Protected mode intialization and creation of 4GB segment ---------
  Xor    EAX, EAX
  Mov    AX, CS
  Shl    EAX, 4
  LEA    EDX, GDT
  Add    EAX, EDX
  Mov    DWord Ptr CS:GDTR+2, EAX; Fill in GDTR with physical address
                                        ; of Global Descriptor Table
  Push    DS
  CLI
  LGDT    FWord Ptr CS:GDTR      ; Load Global Descriptor Table
  Mov    EAX, 1
  Mov    CR0, EAX                ; Set Protected Mode
  Mov    AX, 8
  Mov    DS, AX
  Mov    ES, AX
  Mov    FS, AX
  Mov    GS, AX                  ; All segment registers are loaded
                                ; with 4GB segment's selector
  Xor    EAX, EAX
  Mov    CR0, EAX                ; Set Real Mode
  STI
  Pop    DS

; Да пожалуй и линию A20 открыть нужно:
;--------------------------- A20 line switching ----------------------------
  Mov    AL, 0D1h
  Out    64h, AL
  Mov    AL, 0DFh
  Out    60h, AL

;----------------------------------------------------------;
; Now you can access all the memory by putting zero to a  ;
; segment register and 32bit physical address to an index  ;
; register.                                                ;
;                    -= Simple example =-                ;
; Xor AX, AX                                              ;
; Mov ES, AX                  ; zero the ES register      ;
; Mov EDI, 1024*1024+65536    ; 1st byte we can use freely ;
; Mov BL, Byte Ptr ES:[EDI]  ; read byte                  ;
; Mov DWord Ptr ES:[EDI], EDX ; write dword                ;
;----------------------------------------------------------;

; Пиши тут что-то типа того, что указано выше
; ...

@@Exit:
  mov  dx,offset Finish
  call @@Message
  retn
@@Message:
  mov  ah,09h
  int  21h
  retn
Start          db 'Start !',13,10,'$'
Finish          db 'Start !',13,10,'$'
GDT    DQ      0, 8F92000000FFFFh      ; "0" & "4GB" Descriptors
GDTR  DW      16, 0, 0
Text Ends
end begin


Компилляция:

Цитата

tasm.exe far_addr.asm
tlink.exe far_addr.obj /t /3


После компилляции создается файло FAR_ADDR.COM размером 126 байт (может меняться в зависимости от компиллятора). У меня такие:

tasm > tasm.inf,

tasm.inf:

Цитата

Turbo Assembler  Version 4.0  Copyright © 1988, 1993 Borland International
Syntax:  TASM [options] source [,object] [,listing] [,xref]
/a,/s          Alphabetic or Source-code segment ordering
...


tlink > tlink.inf,

tlink.inf:

Цитата

Turbo Link  Version 5.1 Copyright © 1992 Borland International
Syntax: TLINK objfiles, exefile, mapfile, libfiles, deffile
...


Несмотря на то, что все это будет работать (вроде), памяти для навигатора не увеличиться ;)



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Monty
  Дата 29.5.2003, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



Спасибо Chingachguk smile.gif
Цитата
Несмотря на то, что все это будет работать (вроде), памяти для навигатора не увеличиться ;)
Жаль =( ..., а толк какой ни будь будет?


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Chingachguk
Дата 30.5.2003, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Толк будет только для специального кода: смотри, парень же пишет:

Цитата

;----------------------------------------------------------;
; Now you can access all the memory by putting zero to a  ;
; segment register and 32bit physical address to an index  ;
; register.                                                ;
;                    -= Simple example =-                ;
; Xor AX, AX                                              ;
; Mov ES, AX                  ; zero the ES register      ;
; Mov EDI, 1024*1024+65536    ; 1st byte we can use freely ;
; Mov BL, Byte Ptr ES:[EDI]  ; read byte                  ;
; Mov DWord Ptr ES:[EDI], EDX ; write dword                ;


В обычном Real-режиме или же в V86 в настоящем PE-моде (EMM под дос или же дос-окно в win) команды адресуют данные/код в пределах сегмента, те допускается:

mov al,DS:[0]
mov al,DS:[1]
...
mov al,DS:[0FFFFh]

но не допускается более чем 0FFFFh:

mov al,DS:[10000h] - нельзя.

Также нельзя адресовать данные за пределом 1-го мегабайта, те:

Mov EDI, 1024*1024+65536 ; 1st byte we can use freely ;
Mov BL, Byte Ptr ES:[EDI] ; read byte

Адрес, задаваемый ES:EDI лежит за пределами 1-го Мегабайта (чего в Real Mode невозможно делать) и команда не выполниться. Однако после такого переключения (собственно, код выше) такие команды начнут работать и можно будет, например, читать регион 4-го, 8-го... мегабайта.

Однако практически все, если не все приложения типа vc, nc, dos, dn...
не расчитывают на то, что процессор кто-то "передернет" таким вот образом и станет возможным доступ к верхней (>=1МБайт) памяти. Более того, нельзя будет выделить память в верхней памяти ни через дос, ни другим способом, поскольку дос ориентируется на 1Мегабайт или даже меньше (смотри UMB-блоки). Win также эмулирует выполнение дос-программ в V86-задаче таким же способом.

Таким образом, единственным практическим использованием этой особенности процессора (называется "Unreal mode") может быть самопальный доступ к верхней памяти - на свой страх и риск, со своей стратегией размещения данных и проч. Скажем, в чистом досе (без HIMEM и тем более EMM) можно безболезненно юзать себе 10-20 мегабайт - например, для программ бортовых компьютеров, которым нафиг не нужны все эти обкладки типа win или dos-extender'ов. Или же вирус может смело разместить свой код в 3-м мегабайте и никто его там не найдет.

Обычно же для использования верхней памяти используются так называемые дос-расширители (dos-extender) типа XMS, EMM, DPMI и проч. Многие игры типа duke, doom, descent... именно так и были сделаны и они прекрасно работают как под дос, самостоятельно используя верхнюю память, так и под windows, поскольку win поддерживает интерфейс DPMI и ничего не конфликует.



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.