Динамическое выделение памяти в fasm

Динамическое выделение памяти в fasm

Сообщение plan4ik » Чт апр 07, 2011 2:08 am

Динамическое выделение памяти в fasm
Код: Выделить всё
void somecode(int size, void * object)
{
   void *Temp = NULL;
   if(size > 0)
   {
      if((Temp = malloc(size)) != NULL) /// или realloc
         object = Temp;
   }
   
   free(object);
}

Способы реализации в fasm'e ... :idea:

48h -- allocate (malloc)
16 byte * FFFF == FFFF:F == 1048560 byte's (MB)
думаю use32 i EBX розширит диапазон в
FFFFFFFF:FF == FEFFFFFF01 == 1095216660225(TB) ???

49h -- free
4ah -- setblock (realloc)


Если ктото знаком с динамическим выделением памяти в dos,
скидывайте исходники в этот топик много кому пригодится :mrgreen:
хотелось бы разобратся как это делается в fasm'e ???
Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm

Re: Динамическое выделение памяти в fasm

Сообщение xrnd » Пт апр 08, 2011 6:20 pm

32-битный реальный режим - это уже экзотика :)
xrnd
автор
 
Сообщения: 133
Зарегистрирован: Вс июл 04, 2010 11:03 pm

Re: Динамическое выделение памяти в fasm

Сообщение plan4ik » Чт апр 21, 2011 2:44 am

Код: Выделить всё
format    MZ
entry   MAIN:Start
stack   40h*2   ; 64 levels

macro dosfn [ah_fn]
 {
   mov   ah, ah_fn
   int   21h
 }


segment DATA_SEG
 err1Msg      db   "(!) error allocate memory!", 0ah, 0dh, '$'
 err2Msg      db   "(!) error free memory!", 0ah, 0dh, '$'
 Object         db   "Hello, from allocated_addr ;)", 0ah, 0dh, '$'
 ObjectLenByBlocks   db   ( (($-Object) shr 4) +1)
 ObjectLenByBytes   db   (($-Object) -1)
 allocated_addr      rw   1      ; address of new memory

segment MAIN
Start:
   push   DATA_SEG
   pop   ds

   ;------------------------------
   ; alloc memory with DOS 0x21:48
   ;------------------------------   
   movzx   bx, [ObjectLenByBlocks]      
   dosfn   48h
   jc   .err1
   mov   [allocated_addr], ax   ; saving game ;)
    
    ;-------------------------------------------
    ; memmove - coping object to new memory area
    ;-------------------------------------------
    mov   di, [allocated_addr]
    mov   si, Object
    movzx   cx, [ObjectLenByBytes]
 .memmove:
   mov   al, byte [si]
   mov   byte [di], al
   inc   di
   inc   si
   loop   .memmove
   
   ;----------------------------------------------------------------
   ; Oshibok ne vidaet no po4emu ia ne mogu uvidet stroku:Object ???
   ;   vikidivaet na ekran ku4u simvolov  "bez moey stroki"
   ;----------------------------------------------------------------
   ; jmp   .free
   
   ;-------------------------------
   ; printing allocated_addr string
   ;-------------------------------
   push   ds
   push   [allocated_addr]
   pop   ds   
   xor   dx, dx   ; gde hranitca moj object ???
   dosfn   9
   pop   ds
 .free:   
   ;-------------------------------
   ; free memory with DOS 0x21:49
   ;-------------------------------
   mov   es, [allocated_addr]
   dosfn   49h
   jc   .err2
   jmp   .Exit

 .Exit:
    xor   al, al
   dosfn   8, 4ch
 .err1:
    mov   dx, err1Msg
    dosfn   9, 8
    jmp   .Exit
 .err2:
    mov   dx, err2Msg
    dosfn   9, 8
    jmp   .Exit


Я даже немогу вычеслить где именно мой новый сегмент памяти :oops: TDebugger мне говорит что это гдето по адресу [04CH] тока я вот невижу чтобы туда чтото записывалось ... Проверял в ES, CS, DS -- и нечего невижу !!! И почему когда я загружаю в DS мой свеже испеченный кусок памяти он выкидывает мусор ??? :x думаб сдесь что-то с записю в память (я имею ввиду моей строки) но я даже немогу это проверить Само больше бесит, что не могу найти (увидеть) выделеную память! и это тормозит меня для дальнейшых выводов ... пойду делать кофе и ставить иду ;) думаю она исправит слепоту TDebugger'a
Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm

Re: Динамическое выделение памяти в fasm

Сообщение plan4ik » Чт апр 21, 2011 3:48 am

ЕСТЬ !!!!!!!!! Зароботало :mrgreen:
дело было вот в чем, я записывал байты в (базовый) адрес без смещения ... каждый раз увеличивая (базовый) адрес а не смещение в нем :roll:
вот рабочий исходник
Код: Выделить всё
format    MZ
entry   MAIN:Start
stack   40h*2   ; 64 levels

macro dosfn [ah_fn]
 {
   mov   ah, ah_fn
   int   21h
 }


segment DATA_SEG
 err1Msg      db   "(!) error allocate memory!", 0ah, 0dh, '$'
 err2Msg      db   "(!) error free memory!", 0ah, 0dh, '$'
 Object         db   "Hello, from allocated_addr ;)", 0ah, 0dh, '$'
 ObjectLenByBlocks   db   ( (($-Object) shr 4) +1)
 ObjectLenByBytes   db   (($-Object) -1)
 allocated_addr      rw   1      ; address of new memory

segment MAIN
Start:
   push   DATA_SEG
   pop   ds

   ;------------------------------
   ; alloc memory with DOS 0x21:48
   ;------------------------------   
   movzx   bx, [ObjectLenByBlocks]      
   dosfn   48h
   jc   .err1
   mov   [allocated_addr], ax   ; saving game ;)
    
    ;-------------------------------------------
    ; memmove - coping object to new memory area
    ;-------------------------------------------
    mov   di, 0         ; smeshenie
    mov   es, [allocated_addr]   ; bazoviy adres
    mov   si, Object
    movzx   cx, [ObjectLenByBytes]
 .memmove:
   mov   al, byte [si]
   mov   byte [es:di], al
   inc   di
   inc   si
   loop   .memmove
   
   ;----------------------------------------------------------------
   ; Oshibok ne vidaet no po4emu ia ne mogu uvidet stroku:Object ???
   ;   vikidivaet na ekran ku4u simvolov  "bez moey stroki"
   ;----------------------------------------------------------------
   ; jmp   .free
   
   ;-------------------------------
   ; printing allocated_addr string
   ;-------------------------------
   push   ds
   push   [allocated_addr]
   pop   ds   
   xor   dx, dx   ; gde hranitca moj object ???
   dosfn   9
   pop   ds
 .free:   
   ;-------------------------------
   ; free memory with DOS 0x21:49
   ;-------------------------------
   mov   es, [allocated_addr]
   dosfn   49h
   jc   .err2
   jmp   .Exit

 .Exit:
    xor   al, al
   dosfn   8, 4ch
 .err1:
    mov   dx, err1Msg
    dosfn   9, 8
    jmp   .Exit
 .err2:
    mov   dx, err2Msg
    dosfn   9, 8
    jmp   .Exit

Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm

Re: Динамическое выделение памяти в fasm

Сообщение plan4ik » Чт апр 21, 2011 7:19 am

Еще одна :mrgreen: но на этот раз реализована с помощью процедур и перераспределением памяти ;) в будущем постараюсь скинуть еще и с DPMI функциями но я про это ваще (пока) ниче не знаю ... скидывайте свои версии :arrow:
Код: Выделить всё
format   MZ
entry   MAIN:Start
stack   20H shl 1
include   "%fasminc%\macro\proc16.inc"

macro dosfn [ah_fn]
 {
   mov   ah, ah_fn
   int   21h
 }

segment   DATA_SEG
 Object_1         db   "Hello, from allocated area for Object_1", 0ah, 0dh, '$'
 Object_1_LenByBlocks      db   ((($-Object_1) shr 4) +1)
 Object_1_LenByBytes      db   (($-Object_1) -1)
 Object_1_err1Msg      db   "(!) Object_1 error, allocate memory failed!", 0ah, 0dh, '$'
 Object_1_err2Msg      db   "(!) Object_1 error, free memory", 0ah, 0dh, '$'
 Object_allocated_addr   rw   1
 Object_2         db   "Hello, from reallocated area for Object_2", 0ah, 0dh, '$'
 Object_2_LenByBlocks      db   ( (($-Object_2) shr 4) +1)
 Object_2_LenByBytes      db   (($-Object_2) -1)
 Object_2_err3Msg      db   "(!) Object_2 error, realloc memory failed!", 0ah, 0dh, 24h

segment MAIN
 Start:
    push   DATA_SEG
    pop   ds
    
    ;----------------v
    ; alloc by blocks
    ;----------------v
    movzx   bx, [Object_1_LenByBlocks]
    dosfn   48h
    jc   .Object_1_err1
    mov   [Object_allocated_addr], ax
    
    stdcall   memnmove, Object_1, [Object_allocated_addr], word [Object_1_LenByBytes]
    stdcall   TestAfterMemmove, [Object_allocated_addr]
    
    ;------------------v
    ; realloc by blocks
    ;------------------v
    push   [Object_allocated_addr]
    pop   es
    movzx   bx, [Object_2_LenByBlocks]
    dosfn   4ah
    jc   .Object_2_err3
    
    stdcall   memnmove, Object_2, [Object_allocated_addr], word [Object_2_LenByBytes]
    stdcall   TestAfterMemmove, [Object_allocated_addr]
    
    ;------------v
    ; free memory
    ;------------v
    push   [Object_allocated_addr]
    pop   es
    dosfn   49h
    jc   .Object_1_err2
    
    xor   al, al   ; SUCCESS
 .exit:
    dosfn   8, 4ch


 .Object_1_err1:
   mov   dx, Object_1_err1Msg
   dosfn   9, 8
   jmp   Start.exit

 .Object_1_err2:
    mov   dx, Object_1_err2Msg
    dosfn   9, 8
    jmp   Start.exit
 
 .Object_2_err3:
    mov   dx, Object_2_err3Msg
    dosfn   9, 8
    jmp   Start.exit


;-------------------------v
; test memory after coping
;-------------------------v
proc TestAfterMemmove uses ds, output_addr:word
    push   [output_addr]
    pop   ds
    xor   dx, dx
    dosfn   9
    ret
endp

;---------------------------v
; memmove to new memory area
;---------------------------v
proc memnmove, from_addr:word, to_addr:word, nBytes:word
   mov   es, [to_addr]
   xor   di, di
   mov   si, [from_addr]
   movzx   cx, byte [nBytes]
 .memnmove:
    mov   al, byte [si]
    mov   byte [es:di], al
    inc   si
    inc   di
    loop   .memnmove
    ret
endp


Да еще одно он ограничен немножко так как (DB == 255) но это можно легко переделать :!:
Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm

Re: Динамическое выделение памяти в fasm

Сообщение plan4ik » Чт апр 21, 2011 5:13 pm

Для на чала скину не мои примеры ))
Справка по DPMI 0.9 + 1.0: http://www.delorie.com/djgpp/doc/dpmi/ch5.g.html \ http://ru.wikipedia.org/wiki/DPMI

Код usedpmi.asm с досовского пакета fasm
Код: Выделить всё

; fasm example of writing 32-bit program using DPMI

; requires DPMI host installed in system

format MZ
heap 0               ; no additional memory

segment loader use16

   push   cs
   pop   ds

   mov   ax,1687h
   int   2Fh
   or   ax,ax         ; DPMI installed?
   jnz   error
   test   bl,1         ; 32-bit programs supported?
   jz   error
   mov   word [mode_switch],di
   mov   word [mode_switch+2],es
   mov   bx,si         ; allocate memory for DPMI data
   mov   ah,48h
   int   21h
   jc   error
   mov   es,ax
   mov   ax,1
   call   far [mode_switch]   ; switch to protected mode
   jc   error

   mov   cx,1
   xor   ax,ax
   int   31h         ; allocate descriptor for code
   mov   si,ax
   xor   ax,ax
   int   31h         ; allocate descriptor for data
   mov   di,ax
   mov   dx,cs
   lar   cx,dx
   shr   cx,8
   or   cx,0C000h
   mov   bx,si
   mov   ax,9
   int   31h         ; set code descriptor access rights
   mov   dx,ds
   lar   cx,dx
   shr   cx,8
   or   cx,0C000h
   mov   bx,di
   int   31h         ; set data descriptor access rights
   mov   ecx,main
   shl   ecx,4
   mov   dx,cx
   shr   ecx,16
   mov   ax,7         ; set descriptor base address
   int   31h
   mov   bx,si
   int   31h
   mov   cx,0FFFFh
   mov   dx,0FFFFh
   mov   ax,8         ; set segment limit to 4 GB
   int   31h
   mov   bx,di
   int   31h

   mov   ds,di
   mov   es,di
   mov   fs,di
   mov   gs,di
   push   0
   push   si
   push   dword start
   retfd

    error:
   mov   ax,4CFFh
   int   21h

  mode_switch dd ?

segment main use32

  start:
   mov   esi,hello
    .loop:
   lodsb
   or   al,al
   jz   .done
   mov   dl,al
   mov   ah,2
   int   21h
   jmp   .loop
    .done:

   mov   ax,4C00h
   int   21h

  hello db 'Hello from protected mode!',0Dh,0Ah,0

Чем больше я узнаю, тем больше я узнаю на сколько мало я знаю - Сократ.
Аватара пользователя
plan4ik
участник
 
Сообщения: 31
Зарегистрирован: Ср мар 30, 2011 12:17 pm


Вернуться в Ассемблер в DOS

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron