Не работает пример xmsblock.asm из книжки О.Калашникова "hxxp://kalashnikoff.ru/Assembler/issues/030.htm" Запускаю на Virtual PC, ОС:MSDOS 6.22 Подозреваю, что неправильно работает процедура пересылки в XMS память и обратно. Вот код этой процедуры: Код (Text): Move_toXMS proc ;<<< Сперва из основной в РАСШИРЕННУЮ >>> mov ax,Bytes mov word ptr XMS_str,ax ;Кол-во пересылаемых байт mov word ptr XMS_offsrc,0 ;Смещение в основной памяти mov ax,Buffer1 mov word ptr XMS_offsrc+2,ax ;Сегмент в основной памяти mov ax,XMS_id ;Идентификатор приемника (т.е. XMS-памяти) mov XMS_rec,ax mov ah,0Bh mov si,offset XMS_str call dword ptr XMS_Addr ;<<< Теперь из расширенной в ОСНОВНУЮ >>> mov ax,Bytes mov word ptr XMS_str,ax ;Кол-во пересылаемых байт mov ax,XMS_id mov XMS_src,ax mov dword ptr XMS_offsrc,0 mov XMS_rec,0 mov ax,Buffer2 mov word ptr XMS_offrec,0 mov word ptr XMS_offrec+2,ax mov ah,0Bh mov si,offset XMS_str call dword ptr XMS_Addr ret XMS_str dd 0 ;Кол-во байт для пересылки XMS_src dw 0 ;Источник XMS_offsrc dd 0 ;Смещение в блоке-источнике или адрес в основной памяти XMS_rec dw 0 ;Идентификатор приемника XMS_offrec dd 0 ;Смещение в блоке-приемнике или адрес в основной памяти Move_toXMS endp Пробовал трассировать в afdpro. Эта процедура в нем не отрабатывает (в сегмент с адресом Buffer2 ничего не копируется). Если прогонять эту процедуру пошагово, то участок этой процедуры Код (Text): mov dword ptr XMS_offsrc,0 mov XMS_rec,0 mov ax,Buffer2 выглядит так: Код (Text): DB 66 mov [025c],0000 mov ax,[0202] Куда пропадает команда mov XMS_rec,0 ? В чем здесь ошибка? Почему не работает программа в целом? ps Прошу сильно не пинать, я совсем еще новичок
dmsdm неправильно работает процедура пересылки в XMS память и обратно У Калашникова не учтено, что количество перемещаемых байтов должно быть _четным_. Почему не работает программа в целом? Попробуй подсунуть программе файл с _четным_ размером - она сработает. Куда пропадает команда mov XMS_rec,0 Давай свой бинарь. У меня в листинге Код (Text): ... 0231 66| C7 06 025C R mov dword ptr XMS_offsrc,0 00000000 023A C7 06 0260 R 0000 mov XMS_rec,0 0240 A1 0202 R mov ax,Buffer2 ...
Спасибо большое работает если четное.. Вот уж и не подумал бы про такое.. Прикрепил, но не думаю что он чем-то от твоего отличается.. А ты какой отладчик использовал?
dmsdm Вот уж и не подумал бы про такое.. В шестом Tech help'е, в описании "XMS 0bH: Move Extended Memory Block", в описании XmsMoveInfoRec.lRgnLength есть замечание "must be an even number". не думаю что он чем-то от твоего отличается Почти скрин из td Код (Text): ... cs:0231 66C7065C020000+mov dword ptr [025C],00000000 cs:023A C70660020000 mov word ptr [0260],0000 cs:0240 A10202 mov ax,[0202] ... точь-в-точь как мой. Где ты смотрел пропущенную инструкцию? А ты какой отладчик использовал? До твоего бинаря ни какого, просто смотрел листинг, а вообще Turbo Debugger Version 3.1 Copyright (c) 1988,92 Borland International.
В afdpro.. Ну в общем это я ступил, не пропущена там инструкция. Afdpro команду 66C7065C0200000000 отображает как три команды: Код (Text): 0231 66 DB 66 0232 С7065С020000 MOV [025C],0000 0238 0000 ADD [BX+SI],AL Но выполняет их как одну. Т.е. после выполнения инструкции по адресу 0231, переходит на следующую: Код (Text): 023A C70660020000 MOV [0260],0000 А я не обратил внимания что пересылается уже не в [025C], а в [0260], да и адрес команды изменился на 023A. Вот и ступил из-за невнимательности.. Спасибо за помощь, тему можно закрыть..