Работа с XMS памятью в MSDOS

Тема в разделе "WASM.BEGINNERS", создана пользователем dmsdm, 4 июн 2008.

  1. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    Не работает пример xmsblock.asm из книжки О.Калашникова "hxxp://kalashnikoff.ru/Assembler/issues/030.htm"

    Запускаю на Virtual PC, ОС:MSDOS 6.22

    Подозреваю, что неправильно работает процедура пересылки в XMS память и обратно. Вот код этой процедуры:
    Код (Text):
    1. Move_toXMS proc
    2.  
    3. ;<<< Сперва из основной в РАСШИРЕННУЮ >>>
    4.  
    5.       mov ax,Bytes
    6.       mov word ptr XMS_str,ax   ;Кол-во пересылаемых байт
    7.  
    8.       mov word ptr XMS_offsrc,0 ;Смещение в основной памяти
    9.       mov ax,Buffer1
    10.       mov word ptr XMS_offsrc+2,ax  ;Сегмент в основной памяти
    11.  
    12.       mov ax,XMS_id             ;Идентификатор приемника (т.е. XMS-памяти)
    13.       mov XMS_rec,ax
    14.  
    15.       mov ah,0Bh
    16.       mov si,offset XMS_str
    17.       call dword ptr XMS_Addr
    18.  
    19.  
    20. ;<<< Теперь из расширенной в ОСНОВНУЮ >>>
    21.  
    22.       mov ax,Bytes
    23.       mov word ptr XMS_str,ax   ;Кол-во пересылаемых байт
    24.  
    25.       mov ax,XMS_id
    26.       mov XMS_src,ax
    27.  
    28.       mov dword ptr XMS_offsrc,0
    29.  
    30.       mov XMS_rec,0
    31.  
    32.       mov ax,Buffer2
    33.       mov word ptr XMS_offrec,0
    34.       mov word ptr XMS_offrec+2,ax
    35.  
    36.       mov ah,0Bh
    37.       mov si,offset XMS_str
    38.       call dword ptr XMS_Addr
    39.  
    40.  ret
    41.  
    42. XMS_str    dd 0 ;Кол-во байт для пересылки
    43. XMS_src    dw 0 ;Источник
    44. XMS_offsrc dd 0 ;Смещение в блоке-источнике или адрес в основной памяти
    45. XMS_rec    dw 0 ;Идентификатор приемника
    46. XMS_offrec dd 0 ;Смещение в блоке-приемнике или адрес в основной памяти
    47.  
    48. Move_toXMS endp
    Пробовал трассировать в afdpro. Эта процедура в нем не отрабатывает (в сегмент с адресом Buffer2 ничего не копируется). Если прогонять эту процедуру пошагово, то участок этой процедуры
    Код (Text):
    1. mov dword ptr XMS_offsrc,0
    2.       mov XMS_rec,0
    3.       mov ax,Buffer2
    выглядит так:
    Код (Text):
    1. DB 66
    2.       mov [025c],0000
    3.       mov ax,[0202]
    Куда пропадает команда mov XMS_rec,0 ? В чем здесь ошибка? Почему не работает программа в целом?

    ps Прошу сильно не пинать, я совсем еще новичок
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dmsdm
    неправильно работает процедура пересылки в XMS память и обратно
    У Калашникова не учтено, что количество перемещаемых байтов должно быть _четным_.

    Почему не работает программа в целом?
    Попробуй подсунуть программе файл с _четным_ размером - она сработает.

    Куда пропадает команда mov XMS_rec,0
    Давай свой бинарь.

    У меня в листинге
    Код (Text):
    1. ...
    2.  0231  66| C7 06 025C R           mov dword ptr XMS_offsrc,0
    3.        00000000
    4.  
    5.  023A  C7 06 0260 R 0000          mov XMS_rec,0
    6.  
    7.  0240  A1 0202 R              mov ax,Buffer2
    8. ...
     
  3. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    Спасибо большое :) работает если четное.. Вот уж и не подумал бы про такое..

    Прикрепил, но не думаю что он чем-то от твоего отличается.. А ты какой отладчик использовал?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dmsdm
    Вот уж и не подумал бы про такое..
    В шестом Tech help'е, в описании "XMS 0bH: Move Extended Memory Block", в описании XmsMoveInfoRec.lRgnLength есть замечание "must be an even number".

    не думаю что он чем-то от твоего отличается
    Почти скрин из td
    Код (Text):
    1. ...
    2. cs:0231 66C7065C020000+mov    dword ptr [025C],00000000
    3. cs:023A C70660020000   mov    word ptr [0260],0000
    4. cs:0240 A10202         mov    ax,[0202]
    5. ...
    точь-в-точь как мой. Где ты смотрел пропущенную инструкцию?

    А ты какой отладчик использовал?
    До твоего бинаря ни какого, просто смотрел листинг, а вообще Turbo Debugger Version 3.1 Copyright (c) 1988,92 Borland International.
     
  5. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    В afdpro.. Ну в общем это я ступил, не пропущена там инструкция. Afdpro команду 66C7065C0200000000 отображает как три команды:

    Код (Text):
    1. 0231 66                   DB      66
    2. 0232 С7065С020000   MOV   [025C],0000
    3. 0238 0000                ADD    [BX+SI],AL
    Но выполняет их как одну. Т.е. после выполнения инструкции по адресу 0231, переходит на следующую:

    Код (Text):
    1. 023A C70660020000   MOV    [0260],0000
    А я не обратил внимания что пересылается уже не в [025C], а в [0260], да и адрес команды изменился на 023A. Вот и ступил из-за невнимательности..

    Спасибо за помощь, тему можно закрыть..