Нужно максимально быстро заполнить экран в unreal mode, используя линейный видеобуфер 1280х1024 @ 8. если при заполнении использовать код типа, Код (Text): nxt: mov gs:[edi],eax add edi,4 dec ecx jnz nxt все работает отлично .... только медленно значительно интереснее заменить весь этот код командой stos: Код (Text): rep stosd gs:[edi] только вот в какой точке экрана начнется прорисовка - неизвестно, даже если использовать команду без префикса rep или с другой разрядностью операнда. простой пример: нарисуем две идентичные точки, одну на другой, в левом верхнем углу двумя способами одновременно: Код (Text): mov gs:[edi],eax stosd gs:[edi] первая точка - там где и должна быть, вторая - ниже середины ... если команды поменять местами - stos нарисует точку ниже середины, и увеличит edx на 4, при этом следующая команда mov будет рисовать неизвестно где Вопрос: кто объяснит такое поведение команды Привожу полный рабочий код: может компилироваться как. com или быть записан в MGR Код (Text): .model tiny .code .startup .586 ; ---===Creating GDT===--- xor eax,eax mov di,ax stosd stosd dec ax stosd mov ax,9200h stosw mov ax,0cfh stosw mov al,0fh stosw mov ax,cs shl eax,4 stosd ; ---===Load Shadow GS===--- db 66h,0fh,1,16h,16,0;LGDT ds[0010] db 0fh,20h,0c0h ;mov eax, cr0 mov bx,8 inc ax db 0fh,22h,0c0h ;mov cr0, eax mov gs, bx dec ax db 0fh,22h,0c0h ;mov cr0, eax ; ---===Get VESA Info===--- mov ax,4f01h mov cx,4107h lea di,vmi int 10h ; ---===Main Cycle===--- cyc: mov ax,4f02h mov bx,4107h mov ecx,050000h mov edi,dword ptr vmi+28h int 10h db 0fh,31h ;RDTSR eax mov ebx,eax ;save in ebx ;============================Здесь======================= mov gs:[edi],eax ;работает прекрасно db 65h,66h,67h,0f3h,0abh ;(rep stosd ds:[edi]) ;работает непонятно ;======================================================= db 0fh,31h ;RDTSR eax sub eax,ebx ;считаем сколько прошло тактов mov ecx,40000000h p1: db 67h loop p1 ;Pause ; ---===Print Cycle Clount===--- mov hex,eax mov ax,0b800h mov es,ax mov ax,3 int 10h fild hex fbstp bcd lea si,bcd mov di,1eh nmb: mov eax,737373h cld lodsb ror ax,4 rol eax,4 ror ax,4 std stosd dec di dec di jnz nmb mov ecx,40000000h p2: db 67h loop p2 ;Pause#2 jmp cyc hex dd ? bcd dt ? vmi db ? end команда ведет себя одинаково на всех проверенных мной платформах: Аthlon64n nForce4SLI Radeon X700Pro Аthlon64 nForce4 ATI Rage II AthlonXP VIA KT133 nVidia Vanta Celeron intel GMA 950 а также виртуалках: VirtualBox, VMware, DosBox Если есть предложения, как можно код улучшить / уменьшить / ускорить - буду рад выслушать
Спасибо Ezrah, разобрался. Был сбит с толку одной из статей где говорится что доступ к линейному буферу можно достать только с нереалу. С реалу он также доступен))) Ezrah - оперативно работаешь, даже в 4 ночи
Gelon Агнер Фог и leo советуют заменять компактные, но медленные stos/lods/movs/scas/cmps на более быстрые аналоги с mov и cmp