Какие-то глюки нереального режима.

Тема в разделе "WASM.ASSEMBLER", создана пользователем NoName, 4 апр 2009.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Есть код перехода в нереальный режим который работает в случае 15-ти дескрипторов по полю gdt.limit.
    Если ставить два или три то происходит перезагрузка. В чем причина?

    Код (Text):
    1. Txt16 segment para public use16 'CODE-16'
    2. assume cs:Txt16, ds:Txt16, ss:Txt16
    3. tmp_gdt_size dw 0
    4. tmp_gdt_base dd 0
    Код (Text):
    1. ; void AsmUnrealMode( void );
    2.  
    3. DosGs dw 0
    4. DosFs dw 0
    5.  
    6. ALIGN 8
    7.  
    8. BootGDT dq 0 ;first descriptor
    9. dw 0ffffh ; Seg. Limit 0-15 bits
    10. dw 0 ; Base Addr. 0-15 bits
    11. db 0 ; Base Addr 16-23 bits
    12. db 10010010b ; P, DPL, Type
    13. db 11001111b ; G, B, Seg. Limit 16-19 bits
    14. db 0 ; Base Addr. 24-31 bits
    15.  
    16. _AsmUnrealMode proc far
    17.         push es
    18.         pushf
    19.         push eax
    20.         push ebx
    21.  
    22.         cli
    23.         mov bx,seg Txt16
    24.         mov es,bx
    25.  
    26.         mov ax,gs
    27.         mov es:DosGs,ax
    28.         mov ax,fs
    29.         mov es:DosFs,ax
    30.  
    31.         mov ebx,seg Txt16
    32.         shl ebx,4 ; BaseAddr32
    33.         mov eax,offset es:BootGDT ;gdt table
    34.         add eax,ebx
    35.         mov dword ptr es:tmp_gdt_base,eax
    36.         mov word ptr es:tmp_gdt_size,3
    37.         lgdt fword ptr es:tmp_gdt_size
    38.  
    39.         mov eax,cr0
    40.         or al,1
    41.         mov cr0,eax
    42.         jmp short here2 ; clear prefetch queue
    43. here2:
    44.         mov ax,8h
    45.         mov gs,ax
    46.  
    47. ; switch back to real mode
    48.  
    49.         mov eax,cr0
    50.         btr ax,0
    51.         mov cr0,eax
    52.         jmp short here3
    53. here3:
    54.         xor ax,ax
    55.         mov gs,ax ; big segment
    56.         ;sti
    57.  
    58.         pop ebx
    59.         pop eax
    60.         popf
    61.         pop es
    62.         ret
    63.         endp
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    актуально
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а если установить размер GDT как "количество байт-1", то ничего вылетать не будет соответственно в GDT может располагаться не 65535 дескрипторов, а только 8191
    http://www.wasm.ru/article.php?article=pipm03
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    точно, я уже и забыл про это, ищу тут одну ошибку.
    Есть цикл записи двух двордов в память. Адрес записи корректный (выводится на экран).
    На очередной итерации по адресу 209098 происходит искажение памяти по адресу 309098 на нули. Прерывания запрещены командой cli.

    Код (Text):
    1. ; void AsmWriteDW( DWORD Address, DWORD Value );
    2. _AsmWriteDW proc far
    3.     push bp
    4.     mov bp,sp
    5.     pushad
    6.     mov esi, dword ptr [bp + 6]
    7.     mov eax, dword ptr [bp + 10]
    8.     mov dword ptr gs:[esi], eax
    9.     popad
    10.     pop bp
    11.     ret
    12. endp
    Код (Text):
    1. ; DWORD AsmReadDW( DWORD Address );
    2. _AsmReadDW proc far
    3.     push bp
    4.     mov bp,sp
    5.     push esi
    6.     mov esi, dword ptr [bp + 6]
    7.     mov ax, word ptr gs:[esi]
    8.     mov dx, word ptr gs:[esi + 2]
    9.     pop esi
    10.     pop bp
    11.     ret
    12. endp
    Прототипы функций правильные.
    Что то непонятное.

    Код (Text):
    1.     {
    2.         DWORD TmpAddr = AddrCurDesc, Cnt1;
    3.         const DWORD Type = (DWORD)SYSPMODE_TYPE_DATA_RO_NP;
    4.         const DWORD OutType = ((Type & 0x0F00) << 12) + ((Type & 0xFF) << 8);
    5.  
    6.         asm cli
    7.         for(Cnt1 = GDTCnt; Cnt1 < (GDT_SIZE - 1); Cnt1++) { /* set last GDT descriptors to #NP */
    8.            printf("\nCnt1: 0x%08lX, TmpAddr = 0x%08lX", Cnt1, TmpAddr);
    9.            printf(", [Addr]: 0x%08lX", AsmReadDW(0x309099));
    10.  
    11.            AsmWriteDW(TmpAddr, 0);
    12.            AsmWriteDW(TmpAddr + sizeof(DWORD), OutType);
    13.  
    14.            TmpAddr += AVRTOSPE_SIZE_DESC;
    15.            if(AsmReadDW(0x309099) == 0L) {
    16.               exit(0);
    17.            }
    18.         }
    19.     }
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    актуально. Реально не могу понять в чем дело.
     
  6. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Не очень разбиралсо (не компелировал а стало быть не трассировал), но у тебя счетчег цикла проходит GDT_SIZE - GDTcnt итерац, а ты пишешь по 8 байт и инкремент такой же, это норм?
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Это нормально:
    Код (Text):
    1. #define GDT_SIZE 8192L
    За адреса мы не заезжаем, т.к. их видно на экране (printf).
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    PSR1257
    нет. тут инкремент будет равен 1 из-за
    Код (Text):
    1. DWORD Cnt1;
    AVRTOSPE_SIZE_DESC это надо полагать равно 8
    вроде бы все должно работать, но проверяй что с математикой. какие-то глюки. уверен, что СИ для адресов изменил модель расчета с сегментной 64К на FLAT. такое впечатление, что он адрес побил на 2 части и к старшему слову прибавляет по 16.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а вообще-то пришли бинарник
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    max7C4 Верно, DWORD, но я имел в ввиду что число итерций (возможно) не соответствует заполняемой области.

    Как объявлены переменные (GDT, etc?) может они в стеке?

    Также пройти "с карандашом" первые несколько итераций и убедиццо что все работает как задумывалось.
     
  11. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Компилятор BC 4.5. Проц - Geode.
    По адресам 0x309084 - 0x309094 лежит (насколько я помню) загруженный моим загрузчиком код.

    Код (Text):
    1. typedef  unsigned char  BYTE;
    2. typedef  unsigned short WORD;
    3. typedef  unsigned long  DWORD;
    4.  
    5. WORD GDTCnt;
    У меня есть карта памяти где что должно лежать. Я сверяюсь по ней и смотрю вывод на экране.

    Сделал постепенно приращение адреса и более детальный вывод содержимого памяти.

    Код (Text):
    1.     {
    2.         DWORD TmpAddr = AddrCurDesc, Cnt1;
    3.         const DWORD Type = (DWORD)SYSPMODE_TYPE_DATA_RO_NP;
    4.         const DWORD OutType = ((Type & 0x0F00) << 12) + ((Type & 0xFF) << 8);
    5.  
    6.         asm cli
    7.         for(Cnt1 = GDTCnt; Cnt1 < (GDT_SIZE - 1); Cnt1++) { /* set last GDT descriptors to #NP */
    8.            printf("\n%08lX, %08lX %08lX %08lX %08lX %08lX",
    9.                 TmpAddr, AsmReadDW(0x309084), AsmReadDW(0x309088), AsmReadDW(0x30908C), AsmReadDW(0x309090), AsmReadDW(0x309094));
    10.            printf(" %08lX %08lX", AsmReadDW(0x309098), AsmReadDW(0x30909C));
    11.  
    12.            AsmWriteDW(TmpAddr, 0); TmpAddr += sizeof(DWORD);
    13.            AsmWriteDW(TmpAddr + sizeof(DWORD), OutType); TmpAddr += sizeof(DWORD);
    14.  
    15.            //TmpAddr += AVRTOSPE_SIZE_DESC;
    16.            if(AsmReadDW(0x309099) == 0L) {
    17.               printf("\nerror");
    18.               exit(0);
    19.            }
    20.         }
    21.     }
    Вывод:
    Код (Text):
    1. все нормально...
    2. потом срабатывает проверка на равенство нулю. Видно что искажения начинаются раньше.
    3.  
    4. 00209080, 0E08E003 03E8C166 00072D66 03E0C166 8966E88E 5750060D 15896600
    5. 00209088, 0E08E003 00C07000 00072D66 03E0C166 8966E88E 5750060D 15896600
    6. 00209090, 0E08E003 00000000 00072D66 00C07000 8966E88E 5750060D 15896600
    7. 00209098, 0E08E003 00000000 00072D66 00000000 8966E88E 00C07000 15896600
    Листинг кода с ключем S:
    Код (Text):
    1.    ;        {
    2.    ;            DWORD TmpAddr = AddrCurDesc, Cnt1;
    3.    ;   
    4.     mov dx,word ptr [bp-18]
    5.     mov ax,word ptr [bp-20]
    6.     mov word ptr [bp-34],dx
    7.     mov word ptr [bp-36],ax
    8.    ;   
    9.    ;            const DWORD Type = (DWORD)SYSPMODE_TYPE_DATA_RO_NP;
    10.    ;   
    11.     mov word ptr [bp-42],0
    12.     mov word ptr [bp-44],3184
    13.    ;   
    14.    ;            const DWORD OutType = ((Type & 0x0F00) << 12) + ((Type & 0xFF) << 8);
    15.    ;   
    16.     mov dx,word ptr [bp-42]
    17.     mov ax,word ptr [bp-44]
    18.     and ax,3840
    19.     and dx,0
    20.     mov cl,12
    21.     call    far ptr F_LXLSH@
    22.     push    ax
    23.     push    dx
    24.     mov dx,word ptr [bp-42]
    25.     mov ax,word ptr [bp-44]
    26.     and ax,255
    27.     and dx,0
    28.     mov cl,8
    29.     call    far ptr F_LXLSH@
    30.     pop bx
    31.     pop cx
    32.     add cx,ax
    33.     adc bx,dx
    34.     mov word ptr [bp-46],bx
    35.     mov word ptr [bp-48],cx
    36.    ;   
    37.    ;   
    38.    ;            asm cli
    39.    ;   
    40.     cli
    41.    ;   
    42.    ;            for(Cnt1 = GDTCnt; Cnt1 < (GDT_SIZE - 1); Cnt1++) { /* set last GDT descriptors to #NP */
    43.    ;   
    44.     mov ax,word ptr [bp-30]
    45.     mov word ptr [bp-38],0
    46.     mov word ptr [bp-40],ax
    47.     jmp @2@1234
    48. @2@1150:
    49.    ;   
    50.    ;               printf("\n%08lX, %08lX %08lX %08lX %08lX %08lX",
    51.    ;   
    52.    ;   
    53.    ;                    TmpAddr, AsmReadDW(0x309084), AsmReadDW(0x309088), AsmReadDW(0x30908C), AsmReadDW(0x309090), AsmReadDW(0x309094)
    54.    ;   
    55.     push    48
    56.     push    -28524
    57.     call    far ptr _AsmReadDW
    58.     add sp,4
    59.     push    dx
    60.     push    ax
    61.     push    48
    62.     push    -28528
    63.     call    far ptr _AsmReadDW
    64.     add sp,4
    65.     push    dx
    66.     push    ax
    67.     push    48
    68.     push    -28532
    69.     call    far ptr _AsmReadDW
    70.     add sp,4
    71.     push    dx
    72.     push    ax
    73.     push    48
    74.     push    -28536
    75.     call    far ptr _AsmReadDW
    76.     add sp,4
    77.     push    dx
    78.     push    ax
    79.     push    48
    80.     push    -28540
    81.     call    far ptr _AsmReadDW
    82.     add sp,4
    83.     push    dx
    84.     push    ax
    85.     push    word ptr [bp-34]
    86.     push    word ptr [bp-36]
    87.     push    ds
    88.     push    offset s@+558
    89.     call    far ptr _printf
    90.     add sp,28
    91.    ;   
    92.    ;               printf(" %08lX %08lX", AsmReadDW(0x309098), AsmReadDW(0x30909C));
    93.    ;   
    94.     push    48
    95.     push    -28516
    96.     call    far ptr _AsmReadDW
    97.     add sp,4
    98.     push    dx
    99.     push    ax
    100.     push    48
    101.     push    -28520
    102.     call    far ptr _AsmReadDW
    103.     add sp,4
    104.     push    dx
    105.     push    ax
    106.     push    ds
    107.     push    offset s@+596
    108.     call    far ptr _printf
    109.     add sp,12
    110.    ;   
    111.    ;   
    112.    ;               AsmWriteDW(TmpAddr, 0); TmpAddr += sizeof(DWORD);
    113.    ;   
    114.     push    0
    115.     push    0
    116.     push    word ptr [bp-34]
    117.     push    word ptr [bp-36]
    118.     call    far ptr _AsmWriteDW
    119.     add sp,8
    120.     add word ptr [bp-36],4
    121.     adc word ptr [bp-34],0
    122.    ;   
    123.    ;               AsmWriteDW(TmpAddr + sizeof(DWORD), OutType); TmpAddr += sizeof(DWORD);
    124.    ;   
    125.     push    word ptr [bp-46]
    126.     push    word ptr [bp-48]
    127.     mov dx,word ptr [bp-34]
    128.     mov ax,word ptr [bp-36]
    129.     add ax,4
    130.     adc dx,0
    131.     push    dx
    132.     push    ax
    133.     call    far ptr _AsmWriteDW
    134.     add sp,8
    135.     add word ptr [bp-36],4
    136.     adc word ptr [bp-34],0
    137.    ;   
    138.    ;   
    139.    ;               //TmpAddr += AVRTOSPE_SIZE_DESC;
    140.    ;               if(AsmReadDW(0x309099) == 0L) {
    141.    ;   
    142.     push    48
    143.     push    -28519
    144.     call    far ptr _AsmReadDW
    145.     add sp,4
    146.     or  ax,dx
    147.     jne short @2@1206
    148.    ;   
    149.    ;                  printf("\nerror");
    150.    ;   
    151.     push    ds
    152.     push    offset s@+609
    153.     call    far ptr _printf
    154.     add sp,4
    155.    ;   
    156.    ;                  exit(0);
    157.    ;   
    158.     push    0
    159.     call    far ptr _exit
    160.     pop cx
    161. @2@1206:
    162.     add word ptr [bp-40],1
    163.     adc word ptr [bp-38],0
    164. @2@1234:
    165.     cmp word ptr [bp-38],0
    166.     jae @@0
    167.     jmp @2@1150
    168. @@0:
    169.     jne short @2@1318
    170.     cmp word ptr [bp-40],8191
    171.     jae @@1
    172.     jmp @2@1150
    173. @@1:
    174. @2@1318:
     
  12. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Первичный вариант, где приращение сделано макросом.

    Код (Text):
    1.     {
    2.         DWORD TmpAddr = AddrCurDesc, Cnt1;
    3.         const DWORD Type = (DWORD)SYSPMODE_TYPE_DATA_RO_NP;
    4.         const DWORD OutType = ((Type & 0x0F00) << 12) + ((Type & 0xFF) << 8);
    5.  
    6.         asm cli
    7.         for(Cnt1 = GDTCnt; Cnt1 < (GDT_SIZE - 1); Cnt1++) { /* set last GDT descriptors to #NP */
    8.            printf("\n%08lX, %08lX %08lX %08lX %08lX %08lX",
    9.                 TmpAddr, AsmReadDW(0x309084), AsmReadDW(0x309088), AsmReadDW(0x30908C), AsmReadDW(0x309090), AsmReadDW(0x309094));
    10.            printf(" %08lX %08lX", AsmReadDW(0x309098), AsmReadDW(0x30909C));
    11.  
    12.            AsmWriteDW(TmpAddr, 0); //TmpAddr += sizeof(DWORD);
    13.            AsmWriteDW(TmpAddr + sizeof(DWORD), OutType); //TmpAddr += sizeof(DWORD);
    14.  
    15.            TmpAddr += AVRTOSPE_SIZE_DESC;
    16.            if(AsmReadDW(0x309099) == 0L) {
    17.               printf("\nerror");
    18.               exit(0);
    19.            }
    20.         }
    21.     }
    Видно какую-то разницу:
    Код (Text):
    1. 00209080, 0E08E003 03E8C166 00072D66 03E0C166 8966E88E 5750060D 15896600
    2. 00209088, 00C07000 03E8C166 00072D66 03E0C166 8966E88E 5750060D 15896600
    3. 00209090, 00C07000 00000000 00C07000 03E0C166 8966E88E 5750060D 15896600
    4. 00209098, 00C07000 00000000 00C07000 00000000 00C07000 5750060D 15896600
    Код (Text):
    1.    ;        {
    2.    ;            DWORD TmpAddr = AddrCurDesc, Cnt1;
    3.    ;   
    4.     mov dx,word ptr [bp-18]
    5.     mov ax,word ptr [bp-20]
    6.     mov word ptr [bp-34],dx
    7.     mov word ptr [bp-36],ax
    8.    ;   
    9.    ;            const DWORD Type = (DWORD)SYSPMODE_TYPE_DATA_RO_NP;
    10.    ;   
    11.     mov word ptr [bp-42],0
    12.     mov word ptr [bp-44],3184
    13.    ;   
    14.    ;            const DWORD OutType = ((Type & 0x0F00) << 12) + ((Type & 0xFF) << 8);
    15.    ;   
    16.     mov dx,word ptr [bp-42]
    17.     mov ax,word ptr [bp-44]
    18.     and ax,3840
    19.     and dx,0
    20.     mov cl,12
    21.     call    far ptr F_LXLSH@
    22.     push    ax
    23.     push    dx
    24.     mov dx,word ptr [bp-42]
    25.     mov ax,word ptr [bp-44]
    26.     and ax,255
    27.     and dx,0
    28.     mov cl,8
    29.     call    far ptr F_LXLSH@
    30.     pop bx
    31.     pop cx
    32.     add cx,ax
    33.     adc bx,dx
    34.     mov word ptr [bp-46],bx
    35.     mov word ptr [bp-48],cx
    36.    ;   
    37.    ;   
    38.    ;            asm cli
    39.    ;   
    40.     cli
    41.    ;   
    42.    ;            for(Cnt1 = GDTCnt; Cnt1 < (GDT_SIZE - 1); Cnt1++) { /* set last GDT descriptors to #NP */
    43.    ;   
    44.     mov ax,word ptr [bp-30]
    45.     mov word ptr [bp-38],0
    46.     mov word ptr [bp-40],ax
    47.     jmp @2@1234
    48. @2@1150:
    49.    ;   
    50.    ;               printf("\n%08lX, %08lX %08lX %08lX %08lX %08lX",
    51.    ;   
    52.    ;   
    53.    ;                    TmpAddr, AsmReadDW(0x309084), AsmReadDW(0x309088), AsmReadDW(0x30908C), AsmReadDW(0x309090), AsmReadDW(0x309094)
    54.    ;   
    55.     push    48
    56.     push    -28524
    57.     call    far ptr _AsmReadDW
    58.     add sp,4
    59.     push    dx
    60.     push    ax
    61.     push    48
    62.     push    -28528
    63.     call    far ptr _AsmReadDW
    64.     add sp,4
    65.     push    dx
    66.     push    ax
    67.     push    48
    68.     push    -28532
    69.     call    far ptr _AsmReadDW
    70.     add sp,4
    71.     push    dx
    72.     push    ax
    73.     push    48
    74.     push    -28536
    75.     call    far ptr _AsmReadDW
    76.     add sp,4
    77.     push    dx
    78.     push    ax
    79.     push    48
    80.     push    -28540
    81.     call    far ptr _AsmReadDW
    82.     add sp,4
    83.     push    dx
    84.     push    ax
    85.     push    word ptr [bp-34]
    86.     push    word ptr [bp-36]
    87.     push    ds
    88.     push    offset s@+558
    89.     call    far ptr _printf
    90.     add sp,28
    91.    ;   
    92.    ;               printf(" %08lX %08lX", AsmReadDW(0x309098), AsmReadDW(0x30909C));
    93.    ;   
    94.     push    48
    95.     push    -28516
    96.     call    far ptr _AsmReadDW
    97.     add sp,4
    98.     push    dx
    99.     push    ax
    100.     push    48
    101.     push    -28520
    102.     call    far ptr _AsmReadDW
    103.     add sp,4
    104.     push    dx
    105.     push    ax
    106.     push    ds
    107.     push    offset s@+596
    108.     call    far ptr _printf
    109.     add sp,12
    110.    ;   
    111.    ;   
    112.    ;               AsmWriteDW(TmpAddr, 0); //TmpAddr += sizeof(DWORD);
    113.    ;   
    114.     push    0
    115.     push    0
    116.     push    word ptr [bp-34]
    117.     push    word ptr [bp-36]
    118.     call    far ptr _AsmWriteDW
    119.     add sp,8
    120.    ;   
    121.    ;               AsmWriteDW(TmpAddr + sizeof(DWORD), OutType); //TmpAddr += sizeof(DWORD);
    122.    ;   
    123.     push    word ptr [bp-46]
    124.     push    word ptr [bp-48]
    125.     mov dx,word ptr [bp-34]
    126.     mov ax,word ptr [bp-36]
    127.     add ax,4
    128.     adc dx,0
    129.     push    dx
    130.     push    ax
    131.     call    far ptr _AsmWriteDW
    132.     add sp,8
    133.    ;   
    134.    ;   
    135.    ;               TmpAddr += AVRTOSPE_SIZE_DESC;
    136.    ;   
    137.     add word ptr [bp-36],8
    138.     adc word ptr [bp-34],0
    139.    ;   
    140.    ;               if(AsmReadDW(0x309099) == 0L) {
    141.    ;   
    142.     push    48
    143.     push    -28519
    144.     call    far ptr _AsmReadDW
    145.     add sp,4
    146.     or  ax,dx
    147.     jne short @2@1206
    148.    ;   
    149.    ;                  printf("\nerror");
    150.    ;   
    151.     push    ds
    152.     push    offset s@+609
    153.     call    far ptr _printf
    154.     add sp,4
    155.    ;   
    156.    ;                  exit(0);
    157.    ;   
    158.     push    0
    159.     call    far ptr _exit
    160.     pop cx
    161. @2@1206:
    162.     add word ptr [bp-40],1
    163.     adc word ptr [bp-38],0
    164. @2@1234:
    165.     cmp word ptr [bp-38],0
    166.     jae @@0
    167.     jmp @2@1150
    168. @@0:
    169.     jne short @2@1318
    170.     cmp word ptr [bp-40],8191
    171.     jae @@1
    172.     jmp @2@1150
    173. @@1:
    174. @2@1318:
    Мои версии:
    1. Ошибка в исходниках которую сложно заметить.
    2. Глюк железа.
    Проверял на разных модулях (отличаются объемом оперативной памяти) эффект повторяется один в один.
    При этом если грузится с compact flash (есть на модуле такой разъем и в биосе поддержка), то все нормально. При попытке загрузится с внутренней памяти модуля (микросхемы) проявлется данных эфект. Различаются DOS.

    3. Глюк компилятора.
    Код (Text):
    1. #define  AVRTOSPE_SIZE_DESC 8L
    Проверяю дальше.

    Бинарник слишком большой, я думаю проще будет разобраться в этом.
     
  13. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    NoName

    Ты можешь поставить BPM (я имею в виду самому DRx, или даже вроде есть сайс под дос?) на этот адрес (адреса) перед цыклом и вывести адрес с которого произошла запись? (а также локализовать код в исходнеге?)

    ++ Я бы добавил GPF и другие хандлера, но эта уже паранойя...
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    NoName
    Попробуй выкинуть всё лишнее и оставить минимальный код воспроизводящий ошибку - часто этого уже достаточно чтобы понять в чём дело. А если не будет достаточно, то запость здесь этот минимальный exe, чтобы его можно было потестить на разном железе и глянуть свежим взглядом в отладчике.
     
  15. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Удалось выделить небольшую часть кода которая содержит ошибку, перед отправлением проверил. Ошибка есть точно там же. До этого ошибка ползала по всей программе и я её никак немог локализовать, даже незнал где что искажается, когда узнал где искажается память понял что есть шанс её найти. Я на каком-то этапе даже подумал что это специальный вирус :)
    В архиве 7z исходник, бинарник и пакетный файл для сборки.

    До сих неврубаюсь что же это может быть.

    http://uploadbox.com/files/9564da7e50

    Имя файла: UnrealModeTest-2009-04-10-15-35.7z
    Размер файла: 31.22 KB
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    NoName
    AMD Turion 64 x2, ДОС 7 от win 95, загрузка с usb флешки.
    Гонит сплошные ряды AAAABBBB без искажений, сообщение error в конце не выводится.
     
  17. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Я пока что проверял только на Geode GX1, надо будет еще на других посматреть когда будет возможность.
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Удалось воспроизвести глюк на Celerone Northwood-128. Но и там он проявляется только при не загруженном драйвере Himem.sys. На Turionе глюка нет не зависимо от этого драйвера. Сдаётся мне что дело тут в линии GateA20, которая при драйвере Himem.sys есно открыта, кстати не заметил у тебя в коде:
    Код (Text):
    1. mov dx, 92h  ;Открываем вентиль GateA20
    2. in  al, dx
    3. or  al, 2
    4. out dx, al
     
  19. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Y_Mur
    Респект, вылетело из головы. Только неясно кто включает A20 при загрузке с флешки.
     
  20. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    а вообще-то есть минимум три способа включения A20...