Assembler - язык неограниченных возможностей


Пример программы - часть 3


gdtr dw GDT_l-1 ; 16-битный лимит GDI dd ? ; здесь будет 32-битный линейный адрес GDT ; названия для селекторов (все селекторы для GDT, с RPL = 00) SEL_flatCS equ 00001000b SEL_flatDS equ 00010000b SEL_16bitCS equ 00011000b SEL_16bitDS equ 00100000b

RM_seg ends

; 32-битный сегмент, содержащий код, который будет исполняться в защищенном ; режиме PM_seg segment para public "CODE" use32 assume cs:PM_seg PM_entry: ; загрузить сегментные регистры (кроме SS для простоты) mov ax,SEL_16bitDS mov ds,ax mov ax,SEL_flatDS mov es,ax ; вывод на экран mov esi,offset message ; DS:ESI - сообщение mov edi,0B8000h ; ES:EDI - видеопамять mov ecx,message_l ; ECX - длина rep movsb ; вывод на экран mov eax,07200720h ; два символа 20h с атрибутами 07 mov ecx,rest_scr ; остаток экрана / 2 rep stosd ; очистить, остаток экрана ; загрузить в CS селектор 16-битного сегмента RM_seg db 0EAh ; код дальнего jmp dd offset RM_return ; 32-битное смещение dw SEL_16bitCS ; селектор PM_seg ends

; сегмент стека - используется как в 16-битном, так и в 32-битном режимах ; так как мы не трогали SS, он все время оставался 16-битным RM_stack segment para stack "STACK" use16 db 100h dup(?) RM_stack ends end start





Начало  Назад  Вперед