выделение памяти средствами ОС

Тема в разделе "WASM.ASSEMBLER", создана пользователем marara, 21 май 2008.

  1. marara

    marara New Member

    Публикаций:
    0
    Регистрация:
    21 май 2008
    Сообщения:
    5
    Здравствуйте! у меня такая проблема: необходимо выделить кусок памяти под массив m*n (m и n задаются) порядка 100 кб, м.б. больше. прерывание 48h int 21h такого количества памяти не даёт. Используется .model small. Подскажите, как можно таки выделить этот кусок средствами операционной системы.... Заранее спасибо =)
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    marara
    прерывание 48h int 21h такого количества памяти не даёт
    Была ли перед ее использованием освобождена неиспользуемая память (при помощи int21 fn=4Ah)?
     
  3. marara

    marara New Member

    Публикаций:
    0
    Регистрация:
    21 май 2008
    Сообщения:
    5
    ага... значит, сначала я освобождаю необходимый размер памяти ф-ией 4ah и затем использую 48h?
    спасибо =)
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Размер адресуемого сегмента в ДОС-режиме 64 Кбайта. Потребуется манипуляция сегментыми регистрами для нормальной работы. На фига вообще ДОС-режим при таких объемах?
     
  5. marara

    marara New Member

    Публикаций:
    0
    Регистрация:
    21 май 2008
    Сообщения:
    5
    не знаю)))))) по заданию - выделить память под массив blc 100 кБ ))) я вот наваял что-то

    blc dw ?
    ..................
    push ax
    push bx

    mov ah, 4ah; узнаем сколько параграфов занимает прога
    mov bx, 0ffffh
    int 21h ; их число теперь в bx
    mov ah, 4ah
    mov bx, 1900h ; 6400 параграфов 100 кБ
    int 21h

    mov ah,48h
    mov bx, 1900h
    int 21h
    mov blc, ax
    pop bx
    pop ax

    смотрю в отладчике - просле прерывания 21h устанавливает cf в 1, но почему-то в bx не заносит макс доступное кол-во параграфов, убей не пойму почему =(
    и что за манипуляция с сегментными регистрами?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    адресовать одним регистром сегментным можно только 64кб в реальном режиме, уже сказали.
    поэтому сегментные регистры придется время от времени перезагружать чтобы адресовать всю твою память, если тебе ее в конце концов все-таки дадут =)
     
  7. marara

    marara New Member

    Публикаций:
    0
    Регистрация:
    21 май 2008
    Сообщения:
    5
    ну ладно 100кБ, но даже если пишу
    mov ah, 4ah
    mov bx, 0010h
    int 21h
    всё равно получается ошибка и память не выделяется.....
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    marara
    Функция 4Ah предназначена для изменения размера ранее выделенного блока памяти, а не для определения "сколько параграфов занимает прога #5" и не для выделения нового блока памяти #7.
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    marara
    Пример освобождения неиспользуемой памяти
    Код (Text):
    1. ;;
    2. ;; foo.asm
    3. ;;
    4. ;; ml.exe /nologo /Cp /W3 /WX foo.asm
    5. ;;
    6.  
    7. .model small
    8.  
    9. .stack
    10.  
    11. .code
    12.  
    13.     .startup
    14.  
    15. ;; если удалить комментарии, то в BX можно будет увидеть,
    16. ;; размер максимального свободного блока в параграфах
    17. ;; я смотрел под cmd + debug, получилось 0007h, т.е. 112 байт
    18. ;   mov ah,48h
    19. ;   mov bx,-1
    20. ;   int 21h
    21.  
    22.     mov ax,es
    23.     mov bx,ss
    24.     sub bx,ax
    25.     mov cl,4
    26.     shl bx,cl
    27.     add bx,sp
    28.     jc  error
    29.     add bx,0Fh
    30.     jc  error
    31.     shr bx,cl
    32.  
    33.     mov ah,4Ah
    34.     int 21h
    35.     jc  error
    36.  
    37. ;; если удалить комментарии, то в BX можно будет увидеть,
    38. ;; размер максимального свободного блока в параграфах
    39. ;; я смотрел под cmd + debug, получилось 89CAh, т.е. 564'384 байта
    40. ;   mov ah,48h
    41. ;   mov bx,-1
    42. ;   int 21h
    43.  
    44. error:
    45.     .exit   0
    46.  
    47. end
     
  10. marara

    marara New Member

    Публикаций:
    0
    Регистрация:
    21 май 2008
    Сообщения:
    5
    всем огромное спасибо!=)