Объявление нескольких сегментов по 64 кб

Тема в разделе "WASM.BEGINNERS", создана пользователем kot-begemotik, 5 ноя 2006.

  1. kot-begemotik

    kot-begemotik New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    4
    Здравствуйте уважаемые Гуру!

    Столкнулся с проблемой создания нескольких сегментов в программе (пишу в DOS, Turbo Assembler).
    Пишу примерно следующие:

    Код (Text):
    1. .model large,c
    2. locals
    3. .data
    4.  
    5. segment BUFFER1 para use16
    6. db 0FFFFh dup(0FFh)
    7. ends
    8.  
    9. segment BUFFER2 para use16
    10. db 0FFFFh dup(?)
    11. ends
    12.  
    13. segment Table para 'DATA'
    14. db 1024 dup(?)
    15. ends
    16.  
    17. segment SSEG para stack 'STACK'
    18. db 0FFFFh dup(?)
    19. ends
    20.  
    21. .code
    22. .386
    23.  
    24. .....
    После этого смотрю BUFFER1, он оказывается заполненным 0FFh не полностью.
    Работая с этими массивани происходит потеря данных.

    Если же беру 1 сегмент размером менее 64 кб все роботает нормально.
    Укажите пожалуйста на проблему.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    kot-begemotik
    Какая версия TASM'а? Например, tasm v3.1 не позволяет в качестве имени сегмента использовать слово Table, поэтому твой код не компилирует.

    оказывается заполненным 0FFh не полностью
    Сколько не заполнено? Программно заполнять не пробовал?

    Работая с этими массивани происходит потеря данных.
    Код весь твой?
     
  3. kot-begemotik

    kot-begemotik New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    4
    Версия tasm 3.1. Писал как помнил, в программе этой проблемы нет, т.е. там название таблицы другое.

    Заполнено 19000 - 19456 байт. Программно заполнять пробовал эффект тот же.
    Странно то, что если объем всех данных в программе < 64 кб, то все работает нормально..
     
  4. kot-begemotik

    kot-begemotik New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    4
    Тоесть даже если я объявляю один сегмент размером 64 кб, т.е. объем данных в программе становится больше 64 кб.

    Код (Text):
    1. segment BUFFER1 para use16
    2. db 0FFFFh dup(0FFh)
    3. ends
    Программа уже перестает работать корректно.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    kot-begemotik
    Писал как помнил
    Если хочешь получить помощь, давай полную и достоверную информацию.

    Заполнено 19000 - 19456 байт.
    Как ты это определяешь? Покажи как заполняешь.

    перестает работать корректно
    Если код полностью твой, то проблемы на твоей совести, трудно что-либо подсказать, если не видно кода.

    Чтобы не быть голословным, написал программу
    Код (Text):
    1. .model large,c
    2.  
    3. segment BUFFER1 para use16
    4.   db 0FFFFh dup(0FFh)
    5. ends
    6.  
    7. segment SSEG para stack 'STACK'
    8.   db 0FFFFh dup(?)
    9. ends
    10.  
    11. .code
    12. .386
    13. start:
    14.   mov ax,seg BUFFER1
    15.   mov es,ax
    16.   mov ax,4C00h
    17.   int 21h
    18. end start
    собрал exe'шник (tasm v3.1, tlink v5.1 все из bc++v3.1). Внутри вижу
    Код (Text):
    1. 0000000000: 4D 5A 0F 00 82 00 01 00 20 00 00 10 FF FF 01 10
    2. 0000000010: FF FF 00 00 00 00 00 00 3E 00 00 00 01 00 FB 50
    3. 0000000020: 6A 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    4. 0000000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
    5. ...
    6. 00000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    7. 0000000200: B8 01 00 8E C0 B8 00 4C CD 21 00 00 00 00 00 00
    8. 0000000210: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    9. ...
    10. 00000101F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    11. 0000010200: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    Открываю в td.exe, выполняю две команды и в Dump-окне вижу
    Код (Text):
    1. es:0000 FF FF FF FF FF FF FF FF
    2. es:0008 FF FF FF FF FF FF FF FF
    3. ...
    4. es:FFF0 FF FF FF FF FF FF FF FF
    5. es:FFF8 FF FF FF FF FF FF FF 00
    Имхо все 0FFh на месте.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    А почему не сделать аллокацию таких кусков памяти через AH=48h (INT 21h)?
     
  7. kot-begemotik

    kot-begemotik New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    4
    q_q

    Спасибо!

    Вот посмотри на вот эту программу, создает таблицу в которую записываются адреса двух областей данных по 64кб, одна из которых заполнена 0FFh. Все ли в ней верно?

    В частности, если я исползую объем данных >64кб, как правильно описать стек?

    Код (Text):
    1. .model large,c
    2. .data
    3.  
    4. error db 0
    5.  
    6. segment BUFFER1 para use16
    7. db 0FFFFh dup(0FFh)
    8. ends
    9.  
    10. segment BUFFER2 para use16
    11. db 0FFFFh dup(?)
    12. ends
    13.  
    14. segment PH_Addr para 'DATA'
    15. db 100h dup(?)
    16. ends
    17.  
    18. segment SSEG para stack 'STACK'
    19. db 0FFFFh dup(?)
    20. ends
    21.  
    22. .code
    23. .386
    24. start:
    25.   mov ax,PH_Addr
    26.   mov es,ax
    27.  
    28.   xor eax,eax
    29.   mov ax,BUFFER1
    30.   shl eax,4
    31.   mov [es:0],eax
    32.  
    33.   xor eax,eax
    34.   mov ax,BUFFER2
    35.   shl eax,4
    36.   mov [es:4],eax
    37.  
    38.   mov ax,4C00h
    39.   int 21h
    40. end start
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    kot-begemotik
    записываются адреса двух областей ... Все ли в ней верно?
    Afaik под dos принято хранить адрес как пару word'ов - seg:off или только seg (адрес параграфа), если off равно нулю. Ты сохраняешь 20-ти битные адреса - это не проблема, только как ты их потом используешь?

    как правильно описать стек?
    Твой вариант жизнеспособен.