📄 os_cpu_a.s
字号:
.text
.code32
# 导出函数
.global out_byte
.global in_byte
.global OSTickISR
.global OSStartHighRdy
.global OSCtxSw
.global OSIntCtxSw
# ========================================================================
# void OSTickISR(void)
# ========================================================================
# 导入的函数
.extern OSTimeTick
OSTickISR:
pushal # 保护task现场
movb $0x20, %al # send an end-of-int(EOI) to the i8259
outb %al, $0x20
call OSTimeTick
popal
iret
# ========================================================================
# void OSStartHighRdy(void)
# ========================================================================
# 导入的全局变量
.extern OSRunning # INT32U
.extern OSTCBHighRdy # INT32U
OSStartHighRdy:
movl $1, OSRunning # OSRunning = 1
movl OSTCBHighRdy, %eax # Load OSTCBHighRdy->OSTCBStkPtr into ESP
movl (%eax), %esp
popal # Pop all general regs from task stack
iret
# ========================================================================
# void OSCtxSw(void)
# ========================================================================
# 导入的全局变量
.extern OSTCBHighRdy # INT32U
.extern OSTCBCur # INT32U
OSCtxSw:
pushal # PUSH general regs to the current task's stack
movl OSTCBCur, %eax # Save the esp into OSTCBCur->OSTCBStkPtr
movl %esp, (%eax)
movl OSTCBHighRdy, %eax # OSTCBCur = OSTCBHighRdy
movl %eax, OSTCBCur
movl (%eax), %esp # Load OSTCBHighRdy->OSTCBStkPtr into ESP
popal # Pop all general regs from task stack
iret
# ========================================================================
# void OSIntCtxSw(void)
# ========================================================================
# 导入的全局变量
.extern OSTCBCur # INT32U
OSIntCtxSw:
# | PUSHAD | <-- task stack pointer 本该在的位置
# | call to OSTimeTick |
# | xxx | <-- 编译器产生的 esp 使用
# | yyy | <
# | zzz | <
# | OS_ENTER_CRITICAL() - PUSHF |
# | call to OSIntCtxSw | <-- esp 实际所在的位置
addl $(4*10), %esp # Ignore calls to OSIntExit & PUSHF & OSIntCtxSw
movl OSTCBCur, %eax # Save the esp into OSTCBCur->OSTCBStkPtr
movl %esp, (%eax)
movl OSTCBHighRdy, %eax # OSTCBCur = OSTCBHighRdy
movl %eax, OSTCBCur
movl (%eax), %esp # Load OSTCBHighRdy->OSTCBStkPtr into ESP
popal # Pop all general regs from task stack
iret
# ========================================================================
# void out_byte(INT32U port, INT8U value);
# ========================================================================
out_byte:
movl 4(%esp), %edx # port
movb 8(%esp), %al # value
out %al, %dx
rep
nop # 一点延迟
ret
# ========================================================================
# INT8U in_byte(INT32U port);
# ========================================================================
in_byte:
movl 4(%esp), %edx # port
xorl %eax, %eax
in %dx, %al
rep
nop
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -