⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmlib.asm

📁 ucos在x86上的移植代码。吐血推荐啊
💻 ASM
字号:
; asmutils.asm :
;   必须采用汇编语言编写的保护模式实用函数集。除非十分有必要
; 采用汇编,否则建议这里不要放太多的东西。
;
; Copyright(c) 2007, Alex P.Wonder
; phoenixwonder@gmail.com

[SECTION .text]
[BITS 32]

global reset_cursor
reset_cursor:
	push ax
	push dx
	
	mov dx, 0x3d4
	mov al, 14
	out dx, al
	
	mov dx, 0x3d5
	mov al, 0
	out dx , al
	
	mov dx, 0x3d4
	mov al, 15
	out dx , al 
	
	mov dx, 0x3d5
	mov al, 0
	out dx, al
	
	pop dx
	pop ax
	ret

;==================================================================
; C格 式: void os_memset(void *buf, char chr, int n);
; 说  明:
;
; 参  数:
;
; 返回值:
;
;==================================================================
global os_memset
os_memset:
	push ebp
	mov  ebp, esp

	push ecx
	push edi

	mov  ax, ds
	mov  es, ax

	cld
	mov  ecx, [ebp + 16] ;n
	mov  edi, [ebp + 8] ;buf
	mov  al, byte [ebp + 12] ;chr
	rep  stosb

	pop edi
	pop ecx

	leave
	ret

;==================================================================
; C格 式: void *os_memcpy(void *dest, const void *src, int n);
; 说  明:
;
; 参  数:
;
; 返回值:
;
;==================================================================
global os_memcpy
os_memcpy:
	push ebp
	mov  ebp, esp

	pushfd
	push eax
	push ecx
	push esi
	push edi

	mov  ax, ds
	mov  es, ax

	cld
	mov  ecx, [ebp + 16] ;n
	mov  esi, [ebp + 12] ;src
	mov  edi, [ebp + 8]  ;dest

	rep movsb

	pop edi
	pop esi
	pop ecx
	pop eax
	popfd

	leave
	ret

;==================================================================
; C格 式:
;     OS_STK *init_task_stk( void (*task)(void *pd),
;                            void *pdata,
;                            OS_STK *ptos
;                           );
; 说  明:
;
; 参  数:
;
; 返回值:
;
;==================================================================
global init_task_stk
init_task_stk:
	push ebp
	mov	 ebp, esp

	push ebx

	mov  ebx, [ebp + 16] ;ptos

	;--模仿任务(函数)调用--
	mov  eax, [ebp + 12] ;pdata
	mov  dword [ebx], eax
	sub  ebx, 4

	mov  eax, [ebp + 8]  ;task
	mov  dword [ebx], eax
	sub  ebx, 4

	;--模仿中断,IRETD--
	mov  dword [ebx], 0x00000202 ;eflags
	sub  ebx, 4

  xor  eax, eax ;cs
	mov  ax, cs
	mov  dword [ebx], eax
	sub  ebx, 4

	mov  eax, [ebp + 8]  ;task
	mov  dword [ebx], eax
	sub  ebx, 4

	;--模仿PUSHAD--
	mov  dword [ebx], 0xaaaaaaaa ;eax
	sub  ebx, 4
	mov  dword [ebx], 0xcccccccc ;ecx
	sub  ebx, 4
	mov  dword [ebx], 0xdddddddd ;edx
	sub  ebx, 4
	mov  dword [ebx], 0xbbbbbbbb ;ebx
	sub  ebx, 4

	mov  dword [ebx], 0x00000000 ;esp
	sub  ebx, 4
	mov  dword [ebx], 0x11111111 ;ebp
	sub  ebx, 4
	mov  dword [ebx], 0x22222222 ;esi
	sub  ebx, 4
	mov  dword [ebx], 0x33333333 ;edi
	sub  ebx, 4

	;--模仿push es--
	xor  eax, eax
	mov  ax, es
	mov  dword [ebx], eax
	sub  ebx, 4

	;--模仿push ds--
	xor  eax, eax
	mov  ax, ds
	mov  dword [ebx], eax

	mov  eax, ebx ; retval = 堆栈顶部

	pop  ebx
	leave
	ret

;==================================================================
; C格 式: int os_outb(int port, unsigned char val);
; 说  明:
;		 向端口port输出一个字节数据val
; 参  数:
;
; 返回值:
;    0 -- 成功, -1 -- 失败
;==================================================================
global os_outb
os_outb:
	push ebp
	mov  ebp, esp
	push dx

	mov  dx, [ebp + 8]  ;port
	mov  al, [ebp + 12] ;val
	out  dx, al

	xor  eax, eax ;retval

	pop  dx
	leave
	ret

;==================================================================
; C格 式: int os_outw(int port, unsigned short val);
; 说  明:
;
; 参  数:
;
; 返回值:
;		0 -- 成功, -1 -- 失败
;==================================================================
global os_outw
os_outw:
	push ebp
	mov  ebp, esp
	push dx

	mov  dx, [ebp + 8] ;port
	mov  ax, [ebp + 12] ;val
	out  dx, ax

	xor  eax, eax ;retval

	pop  dx
	leave
	ret

;==================================================================
; C格 式: unsigned char os_inb(int port);
; 说  明:
;
; 参  数:
;
; 返回值:
;		>=0 -- 端口返回值, -1 -- 失败
;==================================================================
global os_inb
os_inb:
	push ebp
	mov  ebp, esp
	push dx

	xor  ax, ax
	mov  dx, [ebp + 8] ;port
	in   al, dx ;retval

	pop  dx
	leave
	ret

;==================================================================
; C格 式: unsigned short os_inw(int port);
; 说  明:
;
; 参  数:
;
; 返回值:
;   >=0 -- 端口返回值, -1 -- 失败
;==================================================================
global os_inw
os_inw:
	push ebp
	mov  ebp, esp
	push dx

	mov  dx, [ebp + 8] ;port
	in   ax, dx ;retval

	pop  dx
	leave
	ret

;==================================================================
; C格 式: unsigned char read_rtc_regs(int index)
; 说  明:
;		  读取RTC芯片的时间值, RTC芯片总共有64个寄存器, 日历数据以BCD码
;   存放.
; 		Address 			Function																					
;				00 			Current second for RTC																					
;				01 			Alarm second																					
;				02 			Current minute																					
;				03 			Alarm minute																					
;				04 			Current hour																					
;				05 			Alarm hour																					
;				06 			Current day of week(01=Sunday)																					
;				07 			Current date of month																					
;				08 			Current month																					
;				09 			Current year(final two digits,eg:93)																					
;
; 参  数:
;		index -- 数据寄存器索引
; 返回值:
;
;==================================================================
global read_rtc_regs
read_rtc_regs:
	push	ebp
	mov  	ebp, esp
	
	;RTC读取前, 需要先读取状态寄存器0x0a, bit[7]——UIP标志(Update in Progress)
	;为0时,才可以读取其他日历数据寄存器;否则,访问它们将得到一个无意义的渐变值.
.again:
	mov 	al, 0x0a
	out 	70h, al
	jmp 	$+2 ; a slight delay to settle thing
	in		al, 71h
	test 	al, 0x80
	jnz		.again
	
	;读数据
	mov 	al, [ebp + 8] ;index
	out		70h, al
	jmp 	$+2 ; a slight delay to settle thing
	in		al, 71h	
				
	leave
	ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -