| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- #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
|