ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
14787 Топик полностью
Алексей Мусин (21.09.2004 12:04, просмотров: 1) ответил bialix на пожалуйста
Предлагаю ничью :) действительно, ругается (мои прежние неудачные попытки обусловлены несоблюдением всех условий) на
mys.next = (MyStruct*)0;
в моделях памяти, где указатель на данные 24 бита (LARGE и COMPACT). Вместе с тем расследование показало, что если не применять type-cast, то компилер генерит верные инструкции для присвоения и сравнения (viva ReAl :):
volatile int * ptr, *ptr2;

void main(void)
{
   ptr = 0;
     
    if (ptr == ptr2)
    {
 

CO 000002 4200                      R      69              MOV     A, #bnksym _ptr
CO 000004 6F11                             70              MOV     ADB, A
CO 000006 D0                               71              MOVN    A, #0
CO 000007 1C                               72              EXTW
CO 000008 0671BF0000                R      73              MOVL    ADB:_ptr, A
                                           74              ._LINE  0, 18
                                           75      ;;;;         if (ptr == ptr2)
CO 00000D 06719F0000                R      76              MOVL    A, ADB:_ptr
CO 000012 06707F0000                R      77              CMPL    A, ADB:_ptr2
CO 000017 F107                             78              BNE     L_23
Еще есть что сказать. У нас есть несколько проектов, где используется больше 64К ОЗУ. В этих случаях модель памяти все равно SMALL или MEDIUM (т.е. указатели в ОЗУ 16 бит), но большие буферы (например, для self-programming) объявлены в far области с соответствующим приведением 0 к типу __far void *. Все-таки работа с 24бит указателями заметно замедляет систему по сравнению с 16бит указателями.