Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Что делать, если число не помещается в регистр?  (Прочитано 13676 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
rumpelstilzchen
Тролль
*
ru
Offline Offline

« : 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 07-03-2008 13:45 » 

Сушествует флаг переполнения. Если прибавляеш к регистру единичку, то можно использовать команду ְADC ax, 0.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Тролль
*
ru
Offline Offline

« Ответ #3 : 08-03-2008 21:29 » 

RXL, спасибо, я под ДОС пишу.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 09-03-2008 17:48 » 

rumpelstilzchen, под DOS никто не запрещает использовать 32-х битную адресауцию. Просто перед каждой командой будет стоять префикс изменения размера адреса и/или данных.
Можно использовать защищенный: DPMI, DOS4G, DOS32 и т.п.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #5 : 09-03-2008 20:22 » 

RXL, я так понимаю, что под ДОС тоже можно в 32 бита работать?

>Просто перед каждой командой будет стоять префикс изменения размера адреса и/или данных.
Мне это делать в ручную? Или можно задействовать возможности проца? Я про это вообще не слышал.
Если можно, подскажи, пожалуйста, где прочитать именно про это.
Я знаю что ОС использует 32 битную адресацию, но сам принцип не понял. У меня есть литература, читать страшно.

>Можно использовать защищенный: DPMI, DOS4G, DOS32 и т.п.
То есть для задействования 32 битного режима, нужно перевести проц в защищенный режим?

>DOS4G, DOS32
Это разновидности ДОСа?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 09-03-2008 20:51 » 

Если ты используеш менеджеры памяти, когда запускаеш ֵּMSDOS в чистом виде, процессор уже находится в зашишенном режиме. Просто включается виртуальный реальный режим.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #7 : 09-03-2008 21:06 » 

Finch, менеджер памяти, по другому - планировщик?
Значит, он и защищенный режим работают всегда вместе? Это такая изначальная задумка?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 09-03-2008 21:59 » new

Это не планировшик. Как известно в 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 на тоже число.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines