Непонятное поведение команды stos в unreal mode

Тема в разделе "WASM.ASSEMBLER", создана пользователем Gelon, 10 май 2011.

  1. Gelon

    Gelon New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2007
    Сообщения:
    4
    Нужно максимально быстро заполнить экран в unreal mode, используя линейный видеобуфер 1280х1024 @ 8.

    если при заполнении использовать код типа,
    Код (Text):
    1. nxt:
    2. mov gs:[edi],eax
    3. add edi,4
    4. dec ecx
    5. jnz nxt
    все работает отлично .... только медленно

    значительно интереснее заменить весь этот код командой stos:
    Код (Text):
    1. rep     stosd   gs:[edi]
    только вот в какой точке экрана начнется прорисовка - неизвестно, даже если использовать команду без префикса rep или с другой разрядностью операнда.

    простой пример: нарисуем две идентичные точки, одну на другой, в левом верхнем углу двумя способами одновременно:
    Код (Text):
    1. mov gs:[edi],eax
    2. stosd   gs:[edi]
    первая точка - там где и должна быть, вторая - ниже середины ...

    если команды поменять местами - stos нарисует точку ниже середины, и увеличит edx на 4, при этом следующая команда mov будет рисовать неизвестно где


    Вопрос: кто объяснит такое поведение команды

    Привожу полный рабочий код:
    может компилироваться как. com или быть записан в MGR
    Код (Text):
    1. .model  tiny
    2. .code
    3. .startup
    4. .586
    5. ;   ---===Creating GDT===---
    6. xor eax,eax
    7. mov di,ax
    8. stosd
    9. stosd
    10. dec ax
    11. stosd
    12. mov ax,9200h
    13. stosw
    14. mov ax,0cfh
    15. stosw
    16. mov al,0fh
    17. stosw
    18. mov ax,cs
    19. shl eax,4
    20. stosd
    21.  
    22. ;   ---===Load Shadow GS===---
    23. db  66h,0fh,1,16h,16,0;LGDT ds[0010]
    24. db  0fh,20h,0c0h    ;mov    eax, cr0
    25. mov bx,8
    26. inc ax
    27. db  0fh,22h,0c0h    ;mov    cr0, eax
    28. mov gs, bx
    29. dec ax
    30. db  0fh,22h,0c0h    ;mov    cr0, eax
    31.  
    32.  
    33. ;   ---===Get VESA Info===---
    34.  
    35.  
    36. mov ax,4f01h
    37. mov cx,4107h
    38. lea di,vmi
    39. int 10h
    40.  
    41. ;   ---===Main Cycle===---
    42. cyc:
    43. mov ax,4f02h
    44. mov bx,4107h
    45. mov ecx,050000h
    46. mov edi,dword ptr vmi+28h
    47. int 10h
    48.  
    49. db  0fh,31h ;RDTSR  eax
    50. mov ebx,eax ;save in ebx
    51.  
    52. ;============================Здесь=======================
    53. mov gs:[edi],eax                                            ;работает прекрасно
    54. db  65h,66h,67h,0f3h,0abh ;(rep stosd ds:[edi]) ;работает непонятно
    55. ;=======================================================
    56.  
    57.  
    58. db  0fh,31h ;RDTSR  eax
    59. sub eax,ebx ;считаем сколько прошло тактов
    60.  
    61.  
    62. mov ecx,40000000h
    63. p1:
    64. db 67h
    65. loop p1 ;Pause
    66.  
    67. ;   ---===Print Cycle Clount===---
    68. mov hex,eax
    69. mov ax,0b800h
    70. mov es,ax
    71.  
    72. mov ax,3
    73. int 10h
    74.  
    75. fild    hex
    76. fbstp   bcd
    77. lea si,bcd
    78. mov di,1eh
    79. nmb:
    80. mov eax,737373h
    81. cld
    82. lodsb
    83. ror ax,4
    84. rol eax,4
    85. ror ax,4
    86. std
    87. stosd
    88. dec di
    89. dec di
    90. jnz nmb
    91.  
    92.  
    93. mov ecx,40000000h
    94. p2:
    95. db  67h
    96. loop p2 ;Pause#2
    97.  
    98. jmp cyc
    99.  
    100. hex dd  ?
    101. bcd dt  ?
    102. vmi db  ?
    103. end
    команда ведет себя одинаково на всех проверенных мной платформах:
    Аthlon64n nForce4SLI Radeon X700Pro
    Аthlon64 nForce4 ATI Rage II
    AthlonXP VIA KT133 nVidia Vanta
    Celeron intel GMA 950
    а также виртуалках:
    VirtualBox, VMware, DosBox

    Если есть предложения, как можно код улучшить / уменьшить / ускорить - буду рад выслушать
     
  2. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Gelon
    Какой бы Вы префикс не приписывали к stosd [edi], использоваться будет es.
     
  3. Gelon

    Gelon New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2007
    Сообщения:
    4
    Спасибо Ezrah, разобрался. Был сбит с толку одной из статей где говорится что доступ к линейному буферу можно достать только с нереалу. С реалу он также доступен)))

    Ezrah - оперативно работаешь, даже в 4 ночи
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Возможно, удастся ускорить, используя SSE (писать не по 4 байта, а большими порциями).
     
  5. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Или по DMA.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.873
    Gelon
    Агнер Фог и leo советуют заменять компактные, но медленные stos/lods/movs/scas/cmps на более быстрые аналоги с mov и cmp