rumpelstilzchen
|
|
« : 07-03-2008 13:24 » |
|
Вот такой код: Loop1: xor cx, cx ;x=0 Loop2: mov AL, DS:[DI] mov ES:[SI], AL inc DI inc SI inc CX cmp CX, 768 jne Loop2 sub SI, 1024 dec BX test BX, BX jnz Loop1 SI может переполнятся, не влезать в 2 байта, для этого нужно увеличивать ES: inc ESКак это сделать, вместе с проверкой по условию переполнения?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 07-03-2008 13:45 » |
|
Сушествует флаг переполнения. Если прибавляеш к регистру единичку, то можно использовать команду ְADC ax, 0.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #2 : 07-03-2008 23:58 » |
|
rumpelstilzchen, воспользуйся 32 битными регистрами - меньше сейчас найти трудно. Взможности по адресации несравненно более гибкие, чем для 16 битной адресации.
Регистры: EAX, EBX, ECX, EDX, EDI, ESI, ESP, EBP Общая формула адресации: [base + index * scale + disp] Все параметры опциональны. base - любой регистр из 8. index - любой регистр, кроме ESP и EBP scale - множитель: 1, 2, 4 или 8. disp - знаковое смещение - 8 или 32 бита.
Подробнее - см. даташиты на сайте intel.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rumpelstilzchen
|
|
« Ответ #3 : 08-03-2008 21:29 » |
|
RXL, спасибо, я под ДОС пишу.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 09-03-2008 17:48 » |
|
rumpelstilzchen, под DOS никто не запрещает использовать 32-х битную адресауцию. Просто перед каждой командой будет стоять префикс изменения размера адреса и/или данных. Можно использовать защищенный: DPMI, DOS4G, DOS32 и т.п.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
rumpelstilzchen
|
|
« Ответ #5 : 09-03-2008 20:22 » |
|
RXL, я так понимаю, что под ДОС тоже можно в 32 бита работать?
>Просто перед каждой командой будет стоять префикс изменения размера адреса и/или данных. Мне это делать в ручную? Или можно задействовать возможности проца? Я про это вообще не слышал. Если можно, подскажи, пожалуйста, где прочитать именно про это. Я знаю что ОС использует 32 битную адресацию, но сам принцип не понял. У меня есть литература, читать страшно.
>Можно использовать защищенный: DPMI, DOS4G, DOS32 и т.п. То есть для задействования 32 битного режима, нужно перевести проц в защищенный режим?
>DOS4G, DOS32 Это разновидности ДОСа?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #6 : 09-03-2008 20:51 » |
|
Если ты используеш менеджеры памяти, когда запускаеш ֵּMSDOS в чистом виде, процессор уже находится в зашишенном режиме. Просто включается виртуальный реальный режим.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
rumpelstilzchen
|
|
« Ответ #7 : 09-03-2008 21:06 » |
|
Finch, менеджер памяти, по другому - планировщик? Значит, он и защищенный режим работают всегда вместе? Это такая изначальная задумка?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 09-03-2008 21:59 » |
|
Это не планировшик. Как известно в 16 разрядном режиме можно адресовать только 1 мегабайт памяти. Этот менеджер позволяет как бы расширить данный диапазон. Создается дамп памяти, который является образом памяти свыше 1 мегабайта. Через ְAPI менеджера можно сдвигать окно дампа. Из реального режима нельзя получить доступ к памяти свыше 1 мегабайта. Поэтому работа производится через зашишенный режим. Лет 10 назад последний раз им пользовался, сейчас даже не могу вспомнить названия. Помню, что было как минимум 2 такие программы. Одна шла от ֵMicrosoft, вторая стороней фирмы.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Leman
Гость
|
|
« Ответ #9 : 07-05-2008 14:42 » |
|
32-хразрядные регистры можно использовать даже в реальном режиме и нет ограничений.
|
|
|
Записан
|
|
|
|
Leman
Гость
|
|
« Ответ #10 : 07-05-2008 14:53 » |
|
Префикс изменения размера адреса и/или данных подставлется компилятором автоматически.
Также можно упростить код: mov AL, DS:[DI] mov ES:[SI], AL inc DI inc SI заменив его разновидностью команды movs: mov SI, offset Str1 ;откуда (DS:SI) mov DI, offset Str2 ;куда (ES:DI) movsb ;пересылаем один байт Str1 db '0123456789' Str2 db '1111111111' В этом примере в регистр SI заносится смещение строки Str1, в регистр DI - смещение строки Str2, после чего командой movsb переносится один байт из DS:SI в ES:DI и в регистрам SI и DI прибавляется единица (автоматически командой movsb). Кроме movsb есть команды movsw и movsd переносящие соответственно два и четыре байта и увеличивающие DI и SI на тоже число.
|
|
|
Записан
|
|
|
|
|