#ifndef __LIB_KERNEL_IO_H #define __LIB_KERNEL_IO_H #include "stdint.h" /// @brief 向端口写入一个字节 /// @param port 0~255 /// @param data static inline void outb(uint16_t port, uint8_t data) { // 对端口指定 N 表示 0~255,d 表示用 dx 存储端口号, %b0 表示对应 al,%w1 表示对应 dx asm volatile("outb %b0, %w1" : : "a"(data), "Nd"(port)); } /// @brief 将 addr 处起始的 word_cnt 个字写入端口 port /// @param port 端口号 /// @param addr 地址 /// @param word_cnt 个数 static inline void outsw(uint16_t port, const void *addr, uint32_t word_cnt) { // + 表示此限制即做输入又做输出 outsw 是把 ds:esi 处的 16 位的内容写入 port 端口,共写入 word_cnt 个 asm volatile("cld; rep outsw" : "+S"(addr), "+c"(word_cnt) : "d"(port)); } /// @brief 读取端口 port 的一个字节 /// @param port 端口号 static inline uint8_t inb(uint16_t port) { uint8_t data; asm volatile("inb %w1, %b0" : "=a"(data) : "Nd"(port)); return data; } static inline void insw(uint16_t port, void *addr, uint32_t word_cnt) { // insw 是把从端口 port 处读入的 16 位内容写入 es:edi 指向的内存,共 word_cnt 个 asm volatile("cld; rep insw" : "+D"(addr), "+c"(word_cnt) : "d"(port) : "memory"); } #endif // __LIB_KERNEL_IO_H