📄 sys_serialxx.s
字号:
EAX = 0x00 + 8
EBX = 0x04 + 8
ECX = 0x08 + 8
EDX = 0x0C + 8
ESI = 0x10 + 8
EDI = 0x14 + 8
EBP = 0x18 + 8
DS = 0x1C + 8
ES = 0x20 + 8
FS = 0x24 + 8
GS = 0x28 + 8
EIP = 0x2C + 8
CS = 0x30 + 8
EFLAGS = 0x34 + 8
OLDESP = 0x38 + 8
OLDSS = 0x3C + 8
COM_RDR = 0x3F8
COM_THR = 0x3F8
COM_IER = 0x3F9
COM_BRDL = 0x3F8
COM_BRDH = 0x3F9
COM_IIR = 0x3FA
COM_FCR = 0x3FA
COM_LCR = 0x3FB
COM_MCR = 0x3FC
COM_LSR = 0x3FD
COM_MSR = 0x3FE
.globl sys_serialNULL
.globl sys_serialopen, sys_serialclose, sys_serialrefresh
.globl sys_serialgetbaud, sys_serialsetbaud
.globl sys_serialSend, sys_serialReceive
////////////////////////////////////////////////////////
.align 4
sys_serialNULL:
movl $-1, %eax
ret
.align 4
sys_serialopen:
movl EBX(%esp), %ebx
cmpl $0, %ebx
jne sys_serialopen_0
movl $-1, %eax
ret
sys_serialopen_0:
cmpl $0x7fffff4, %ebx
jna sys_serialopen_1
movl $-1, %eax
ret
sys_serialopen_1:
cmpl $0, serialparam_ptr
je sys_serialopen_2
movl $-1, %eax
ret
sys_serialopen_2:
xorl %eax, %eax
cli
movl %eax, serialSbuf_head
movl %eax, serialSbuf_tail
movl %eax, serialRbuf_head
movl %eax, serialRbuf_tail
movl %eax, serial_state
movl %eax, serial_Scount
movl %eax, serial_Rcount
movl %ebx, serialparam_ptr
movl %eax, %gs:(%ebx)
addl $0x04, %ebx
movl %eax, %gs:(%ebx)
addl $0x04, %ebx
movl %eax, %gs:(%ebx)
sti
ret
.align 4
sys_serialclose:
cmpl $0, serialparam_ptr
jne sys_serialclose_0
movl $-1, %eax
ret
sys_serialclose_0:
xorl %eax, %eax
cli
movl %eax, serialSbuf_head
movl %eax, serialSbuf_tail
movl %eax, serialRbuf_head
movl %eax, serialRbuf_tail
movl %eax, serial_state
movl %eax, serial_Scount
movl %eax, serial_Rcount
movl %eax, serialparam_ptr
sti
ret
.align 4
sys_serialrefresh:
xorl %eax, %eax
cli
movl %eax, serialSbuf_head
movl %eax, serialSbuf_tail
movl %eax, serialRbuf_head
movl %eax, serialRbuf_tail
movl %eax, serial_state
movl %eax, serial_Scount
movl %eax, serial_Rcount
movl serialparam_ptr, %ebx
cmpl $0, %ebx
je sys_serialrefresh_0
movl %eax, %gs:(%ebx)
addl $0x04, %ebx
movl %eax, %gs:(%ebx)
addl $0x04, %ebx
movl %eax, %gs:(%ebx)
sys_serialrefresh_0:
sti
ret
.align 4
sys_serialgetbaud:
xorl %eax, %eax
movw serial_BAUD, %ax
ret
.align 4
sys_serialsetbaud:
cli
///////////////////////////////////
movl EBX(%esp), %eax
movw %ax, serial_BAUD
///////////////////////////////////
movw $COM_MCR, %dx
movb $0x00, %al
outb %al, %dx
movw $COM_LCR, %dx
movb $0x9f, %al
outb %al, %dx
movw $COM_BRDL, %dx
movw serial_BAUD, %ax
outb %al, %dx
movw $COM_BRDH, %dx
movb %ah, %al
outb %al, %dx
movw $COM_LCR, %dx
movb $0x1f, %al
outb %al, %dx
movw $COM_RDR, %dx
inb %dx, %al
movw $COM_LSR, %dx
inb %dx, %al
movw $COM_LSR, %dx
movb $0x60, %al
outb %al, %dx
movw $COM_MSR, %dx
inb %dx, %al
movw $COM_MSR, %dx
movb $0x00, %al
outb %al, %dx
movw $COM_IER, %dx
movb $0x07, %al
outb %al, %dx
movw $COM_IIR, %dx
inb %dx, %al
inb %dx, %al
inb %dx, %al
movw $COM_MCR, %dx
movb $0x08, %al
outb %al, %dx
///////////////////////////////////
xorl %eax, %eax
movl %eax, serialSbuf_head
movl %eax, serialSbuf_tail
movl %eax, serialRbuf_head
movl %eax, serialRbuf_tail
movl %eax, serial_state
movl %eax, serial_Scount
movl %eax, serial_Rcount
movl serialparam_ptr, %ebx
cmpl $0, %ebx
je sys_serialsetbaud_0
movl %eax, %gs:(%ebx)
addl $0x04, %ebx
movl %eax, %gs:(%ebx)
addl $0x04, %ebx
movl %eax, %gs:(%ebx)
sys_serialsetbaud_0:
///////////////////////////////////
sti
ret
.align 4
sys_serialSend:
cmpl $0, serialparam_ptr
jne sys_serialSend_0
movl $-1, %eax
ret
sys_serialSend_0:
movl EBX(%esp), %ebx
movl ECX(%esp), %ecx
movl serialSbuf_head, %edi
sys_serialSend_1:
cmpl $0, %ecx
je sys_serialSend_5
sys_serialSend_2:
nop
nop
nop
nop
nop
cli
cmpl $1023, serial_Scount
jne sys_serialSend_3
sti
jmp sys_serialSend_2
sys_serialSend_3:
movb %gs:(%ebx), %al
movb %al, serial_Sbuf(%edi)
incl %ebx
decl %ecx
incl %edi
andl $1023, %edi
movl %edi, serialSbuf_head
incl serial_Scount
//////////////////////
testl $0x04, serial_state
jnz sys_serialSend_4
movw $COM_THR, %dx
movl serialSbuf_tail, %esi
movb serial_Sbuf(%esi), %al
outb %al, %dx
incl %esi
andl $1023, %esi
movl %esi, serialSbuf_tail
decl serial_Scount
orl $0x04, serial_state
sys_serialSend_4:
//////////////////////
sti
jmp sys_serialSend_1
sys_serialSend_5:
movl serialparam_ptr, %edi
cli
movl serial_state, %eax
movl %eax, %gs:(%edi)
addl $0x04, %edi
movl serial_Scount, %eax
movl %eax, %gs:(%edi)
addl $0x04, %edi
movl serial_Rcount, %eax
movl %eax, %gs:(%edi)
sti
xorl %eax, %eax
ret
.align 4
sys_serialReceive:
cmpl $0, serialparam_ptr
jne sys_serialReceive_0
movl $-1, %eax
ret
sys_serialReceive_0:
movl EBX(%esp), %ebx
movl ECX(%esp), %ecx
movl serialRbuf_tail, %esi
sys_serialReceive_1:
cmpl $0, %ecx
je sys_serialReceive_2
cmpl $0, serial_Rcount
je sys_serialReceive_2
cli
movb serial_Rbuf(%esi), %al
movb %al, %gs:(%ebx)
incl %ebx
decl %ecx
incl %esi
andl $1023, %esi
movl %esi, serialRbuf_tail
decl serial_Rcount
sti
jmp sys_serialReceive_1
sys_serialReceive_2:
movl serialparam_ptr, %edi
cli
movl serial_state, %eax
movl %eax, %gs:(%edi)
addl $0x04, %edi
movl serial_Scount, %eax
movl %eax, %gs:(%edi)
addl $0x04, %edi
movl serial_Rcount, %eax
movl %eax, %gs:(%edi)
sti
movl ECX(%esp), %eax
subl %ecx, %eax
ret
////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -