Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет olegmi ([info]olegmi)
@ 2007-12-30 18:36:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:techno

филологи могут дальше не читать...

У меня возник вопрос.
Среда:
DOS(реальный или виртуальный)
BC++ v3.1.
Зову: farmalloc()
Он возвращает 4 байта, которые следует интерпретировать как двухбайтовый сегмент и двухбайтовое смещение. Т.е. тип (void far*).
Посмотрел как это компилируется. И возник у меня вопрос: что если смещение 0xFFFF или близко к тому? Нужно ли об этом заботиться или всегда можно положиться на вменяемость farmalloc()?

Как он компилирует - повесться можно...
Например:

2559:2673 EB06     JMP     267B
2559:2675 FF4EF2   DEC     WORD PTR [BP-0E]
2559:2678 FF4EFC   DEC     WORD PTR [BP-04]
2559:267B 8E46F6   MOV     ES,[BP-0A]
2559:267E 8B5EF2   MOV     BX,[BP-0E]
2559:2681 26       ES:
2559:2682 8A07     MOV     AL,[BX]
2559:2684 B400     MOV     AH,00
2559:2686 0BC0     OR      AX,AX
2559:2688 74EB     JZ      2675


(Добавить комментарий)


[info]ramendik@lj
2007-12-31 13:03 (ссылка)
На вменяемость борландовских компиляторов тех времён я бы не полагался.

(Ох, было ж времечко...)

(Ответить) (Ветвь дискуссии)


[info]ex_olegmi@lj
2008-01-01 18:14 (ссылка)
Вставил заплатку:
dst->d_orig=(UINT4 far*)farmalloc(len*4);

UINT4 lTmp;

lTmp=(UINT4)dst->d_orig;
lTmp=(lTmp+(((lTmp>>4)&0xfff)<<16))&0xffff000fL;
dst->d=(UINT4 far*)lTmp;
Проверил. Компилируется адекватно.

Нормальное было время. Мне не лень было програмировать...
Я понимаю, что до прихода Путина вода была не мокрая... ;)

(Ответить) (Уровень выше)