Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2012, 20:51   #1
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию В защищенном режиме вывести время

нужно в защищенном режиме вывести на экран текущее время.
Привожу код в котором вывожу 3 строки(код рабочий):
Код:
include	pmode.lib
;---------------------------------------------------------------------------
.386p
pmode segment use16
	assume	cs:pmode, ds:pmode, es:pmode
	org	100h
main		proc	far
start:

Code_selector	=  8
Stack_selector	= 16
Data_selector	= 24
Screen_selector	= 32
R_Mode_Code		= 40	; Селектор дескриптора сегмента кода для возврата
			; в режим реальных адресов.
R_Mode_Data		= 48	; Селектор дескриптора сегментов стека и данных.
;------------------------------------------------------------------------
; Сохраняем сегментные регистры, используемые в R-Mode:
	mov	R_Mode_SS,ss
	mov	R_Mode_DS,ds
	mov	R_Mode_ES,es
	mov	R_Mode_FS,fs
	mov	R_Mode_GS,gs
; Подготавливаем адрес возврата в R-Mode:
	mov	R_Mode_segment,cs
	lea	ax,R_Mode_entry
	mov	R_Mode_offset,ax
; Подготовка к переходу в защищённый режим:
	mov	bx,offset GDT + 8
	xor	eax,eax
	mov	edx,eax
	push	cs
	pop	ax
	shl	eax,4
	mov	dx,1024
	mov	cl,10011000b
	call	set_descriptor		; Code
	lea	dx,Stack_seg_start
	add	eax,edx
	mov	dx,1024
	mov	cl,10010110b
	call	set_descriptor		; Stack
	xor	eax,eax
	mov	ax,ds
	shl	eax,4
	mov	dx,0ffffh
	mov	cl,10010010b
	call	set_descriptor		; Data
	mov	eax,0b8000h
	mov	edx,4000
	mov	cl,10010010b
	call	set_descriptor		; Screen
; Готовим дополнительные дескрипторы для возврата в R-Mode:
	xor	eax,eax
	push	cs
	pop	ax
	shl	eax,4		
	mov	edx,0ffffh
	mov	cl,10011010b		; P=1, DPL=00b, S=1, Тип=101b, A=0
	call	set_descriptor		; R_Mode_Code
	mov	cl,10010010b		; P=1, DPL=00b, S=1, Тип=001b, A=0
	call	set_descriptor		; R_Mode_Data
; Устанавливаем GDTR:
	xor	eax,eax
	mov	edx,eax
	mov	ax,ds
	shl	eax,4
	lea	dx,GDT
	add	eax,edx
	mov	GDT_adr,eax
	mov	dx,55		; Предел GDT = 8 * (1 + 6) - 1
	mov	GDT_lim,dx
	cli
	lgdt	GDTR
	mov	R_Mode_SP,sp	
call time_proc
; Переходим в защищённый режим:
	mov	eax,cr0
	or	al,1
	mov	cr0,eax

; Процессор в защищённом режиме
	db	0eah		; Команда far jmp Code_selector:P_Mode_entry.
	dw	P_Mode_entry
	dw	Code_selector
;------------------------------------------------------------------------
P_Mode_entry:
	mov	ax,Screen_selector
	mov	es,ax
	mov	ax,Data_selector
	mov	ds,ax
	mov	ax,Stack_selector
	mov	ss,ax
	mov	sp,0
; Сообщаем о входе в P-Mode (выводим ZS-строку):
    
	lea	bx,Start_P_Mode_ZS
	mov	di,480
	call	putzs
; Работа программы в защищённом режиме (здесь - только вывод строки):
       
      ; // mov P_Mode_ZS, ch
    
	;lea	bx,P_Mode_ZS
    
	add	di,160
	call	putzs

	db	0eah		; Команда far jmp R_Mode_Code:Pre_R_Mode_entry.
	dw	Pre_R_Mode_entry
	dw	R_Mode_Code
Pre_R_Mode_entry:


	mov	ax,R_Mode_Data	; Селектор R_Mode_Data - "один на всех".
	mov	ss,ax
	mov	ds,ax
	mov	es,ax
	mov	fs,ax
	mov	gs,ax
; 4. Сбросить флаг PE в CR0.
	mov	eax,cr0
	and	al,0feh		; FEh = 1111'1110b
	mov	cr0,eax
; 5. Выполнить команду far jump на программу режима реальных адресов.
		db	0eah
R_Mode_offset	dw	?	; Значения R_Mode_offset и R_Mode_segment
R_Mode_segment	dw	?	; сюда прописались перед входом в
				; защищённый режим (в начале программы).
;------------------------------------------------------------------------
R_Mode_entry:
; 6. Загрузить в регистры SS, DS, ES, FS и GS необходимые значения или 0
; (восстанавливаем сохранённые значения):
	mov	ss,R_Mode_SS
	mov	ds,R_Mode_DS
	mov	es,R_Mode_ES
	mov	fs,R_Mode_FS
	mov	gs,R_Mode_GS
	mov	sp,R_Mode_SP		; Восстанавливаем указатель стека
					; непосредственно перед разрешением
					; прерываний.
; 7. Разрешить прерывания (STI).
	sti
; Выводим ZS-строку "Back to real address mode..."
	lea	bx,R_Mode_ZS
	mov	ax,0b800h
	mov	es,ax
	mov	di,800
	call	putzs		; Функция putzs универсальна и работает
				; в обоих режимах.
	int	20h		; Конец программы (здесь - выход в MS-DOS).

; "pmode.lib":
init_set_descriptor
init_putzs

Start_P_Mode_ZS:	db	"Entering to protected mode...",0
; ZS-строка для вывода при работе в P-Mode:
P_Mode_ZS:	db	"****",0
; ZS-строка для вывода в R-Mode:
R_Mode_ZS:	db	"Back to real address mode...",0

; Значения регистров, которые программа имела до перехода в P-Mode:
R_Mode_SP	dw	?
R_Mode_SS	dw	?
R_Mode_DS	dw	?
R_Mode_ES	dw	?
R_Mode_FS	dw	?
R_Mode_GS	dw	?
;------------------------------------------------------------------------
; Образ регистра GDTR:
GDTR	label	fword
GDT_lim		dw	?
GDT_adr		dd	?
;------------------------------------------------------------------------
GDT:
	dd	?,?	
	dd	?,?	
	dd	?,?	
	dd	?,?	
	dd	?,?	
	dd	?,?	
	dd	?,?	
;------------------------------------------------------------------------
	db	1024 dup (?)	; 
Stack_seg_start:	;
;------------------------------------------------------------------------
main		endp


	pmode	ends
	end	start

Последний раз редактировалось Stilet; 10.12.2012 в 21:07.
sheff123 вне форума Ответить с цитированием
Старый 10.12.2012, 20:53   #2
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию

вот код программы процедуры которая выводит время:
Код:
time_proc proc
  mov ah, 2Ch 
  int 21h
  mov al, ch
  xor ah, ah
  push dx
  push cx

  aam 
  add ax,3030h 
  mov dl,ah 
  mov dh,al 
  mov ah,02 
 
  int 21h 
  mov dl,dh 
  int 21h

  mov dl, 0 						;вывод пробела
  int 21h

  pop cx
  mov al, cl
  xor ah, ah

  aam 
  add ax,3030h 
  mov dl,ah 
  mov dh,al 
  mov ah,02 
  int 21h 
  mov dl,dh 
  int 21h

  mov dl, 0 						;вывод пробела
  int 21h
  pop dx
  mov al, dh
  xor ah, ah

  aam 
  add ax,3030h 
  mov dl,ah 
  mov dh,al 
  mov ah,02 
  int 21h 
  mov dl,dh 
  int 21h
  ret
time_proc endp

тоже самое нужно сделать в защищенном режиме

Последний раз редактировалось Stilet; 10.12.2012 в 21:14.
sheff123 вне форума Ответить с цитированием
Старый 11.12.2012, 11:27   #3
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

"тоже самое" не получится - "код программы процедуры которая выводит время" ориентирован на выполнение в реальном режиме под управлением MS-DOS.
xoodoo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация памяти в защищенном режиме. BigBong Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 24.09.2011 11:58
Как проверить что windows запущена в защищенном режиме vitol Win Api 8 21.05.2010 12:02
работа с подпрограммами в защищенном режиме x86 =termi= Помощь студентам 1 19.01.2010 12:22
Работа в защищенном режиме(TASM) adgam Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 11.11.2009 22:48