• HeapTest Programs


    The following example (Heaptest1.asm) uses dynamic memory allocation to create and fill a
    1000-byte array:

    Title Heap Test #1 (Heaptest1.asm)
    INCLUDE Irvine32.inc
    ; This program uses dynamic memory allocation to allocate and
    ; fill an array of bytes.
    .data
    ARRAY_SIZE = 1000
    FILL_VAL EQU 0FFh
    hHeap HANDLE ? ; handle to the process heap
    pArray DWORD ? ; pointer to block of memory
    newHeap DWORD ? ; handle to new heap
    str1 BYTE "Heap size is: ",0
    .code
    main PROC
    INVOKE GetProcessHeap ; get handle prog's heap
    .IF eax == NULL ; if failed, display message
    call WriteWindowsMsg
    jmp quit
    .ELSE
    mov hHeap,eax ; success
    .ENDIF
    call allocate_array
    jnc arrayOk ; failed (CF = 1)?
    call WriteWindowsMsg
    call Crlf
    jmp quit
    arrayOk: ; ok to fill the array
    call fill_array
    call display_array
    call Crlf
    ; free the array
    INVOKE HeapFree, hHeap, 0, pArray
    quit:
    exit
    main ENDP
    ;--------------------------------------------------------
    allocate_array PROC USES eax
    ;
    ; Dynamically allocates space for the array.
    ; Receives: EAX = handle to the program heap
    ; Returns: CF = 0 if the memory allocation succeeds.
    ;--------------------------------------------------------
    INVOKE HeapAlloc, hHeap, HEAP_ZERO_MEMORY, ARRAY_SIZE
    .IF eax == NULL
    stc ; return with CF = 1
    .ELSE
    mov pArray,eax ; save the pointer
    clc ; return with CF = 0
    .ENDIF
    ret
    allocate_array ENDP
    ;--------------------------------------------------------
    fill_array PROC USES ecx edx esi
    ;
    ; Fills all array positions with a single character.
    ; Receives: nothing
    ; Returns: nothing
    ;--------------------------------------------------------
    mov ecx,ARRAY_SIZE ; loop counter
    mov esi,pArray ; point to the array
    L1: mov BYTE PTR [esi],FILL_VAL ; fill each byte
    inc esi ; next location
    loop L1
    ret
    fill_array ENDP
    ;--------------------------------------------------------
    display_array PROC USES eax ebx ecx esi
    ;
    ; Displays the array
    ; Receives: nothing
    ; Returns: nothing
    ;--------------------------------------------------------
    mov ecx,ARRAY_SIZE ; loop counter
    mov esi,pArray ; point to the array
    L1: mov al,[esi] ; get a byte
    mov ebx,TYPE BYTE
    call WriteHexB ; display it
    inc esi ; next location
    loop L1
    ret
    display_array ENDP
    END main

    The following example (Heaptest2.asm) uses dynamic memory allocation to repeatedly allocate
    large blocks of memory until the heap size is exceeded.

    Title Heap Test #2 (Heaptest2.asm)
    INCLUDE Irvine32.inc
    .data
    HEAP_START = 2000000 ; 2 MB
    HEAP_MAX = 400000000 ; 400 MB
    BLOCK_SIZE = 500000 ; .5 MB
    hHeap HANDLE ? ; handle to the heap
    pData DWORD ? ; pointer to block
    str1 BYTE 0dh,0ah,"Memory allocation failed",0dh,0ah,0
    .code
    main PROC
    INVOKE HeapCreate, 0,HEAP_START, HEAP_MAX
    .IF eax == NULL ; failed?
    call WriteWindowsMsg
    call Crlf
    jmp quit
    .ELSE
    mov hHeap,eax ; success
    .ENDIF
    mov ecx,2000 ; loop counter
    L1: call allocate_block ; allocate a block
    .IF Carry? ; failed?
    mov edx,OFFSET str1 ; display message
    call WriteString
    jmp quit
    .ELSE ; no: print a dot to
    mov al,'.' ; show progress
    call WriteChar
    .ENDIF
    ;call free_block ; enable/disable this line
    loop L1
    quit:
    INVOKE HeapDestroy, hHeap ; destroy the heap
    .IF eax == NULL ; failed?
    call WriteWindowsMsg ; yes: error message
    call Crlf
    .ENDIF
    exit
    main ENDP
    allocate_block PROC USES ecx
    ; allocate a block and fill with all zeros.
    INVOKE HeapAlloc, hHeap, HEAP_ZERO_MEMORY, BLOCK_SIZE
    .IF eax == NULL
    stc ; return with CF = 1
    .ELSE
    mov pData,eax ; save the pointer
    clc ; return with CF = 0
    .ENDIF
    ret
    allocate_block ENDP
    free_block PROC USES ecx
    INVOKE HeapFree, hHeap, 0, pData
    ret
    free_block ENDP
    END main
  • 相关阅读:
    90.子类调用父类同名方法总结
    89.子类调用父类同名属性和方法
    88.子类调用父类同名属性和方法
    87.子类重写父类的同名属性和方法
    86.多继承
    85.单继承
    84.继承的概念
    day09
    83.魔法方法__del__()
    82.魔法方法__str__()
  • 原文地址:https://www.cnblogs.com/dreamafar/p/6023145.html
Copyright © 2020-2023  润新知