📄 asmlib.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 + -