Assembly X86汇编指令到MIPS指令(端口、输入、I/O)
在X86中,有一条名为In的指令:Assembly X86汇编指令到MIPS指令(端口、输入、I/O),assembly,x86,port,mips,inline-assembly,Assembly,X86,Port,Mips,Inline Assembly,在X86中,有一条名为In的指令: MIPS没有此指令: 我想用MIPS编写我自己的IN指令。 如何做到这一点? 我们正在使用C和MIPS编写操作系统: 此函数的结果是: 错误:无法识别的操作码inb$2,lo static inline uint8_t inb(uint16_t port) { uint8_t ret; asm volatile ( "inb %1, %0" : "=a"(ret)
MIPS没有此指令:
我想用MIPS编写我自己的IN指令。
如何做到这一点?
我们正在使用C和MIPS编写操作系统:
此函数的结果是:
错误:无法识别的操作码
inb$2,lo
static inline uint8_t inb(uint16_t port) {
uint8_t ret;
asm volatile ( "inb %1, %0"
: "=a"(ret)
: "Nd"(port) );
return ret;
}
输入/输出指令和内存访问指令之间的显著区别在于硬件的行为方式。软件无法使使用I/O映射I/O的系统与内存指令一起工作,反之亦然。由于MIPS系统仅使用内存映射I/O,因此不可能使用输入/输出指令。x86系列的前身(8080和8085处理器)只有16位地址总线,因此只能使用总共64 kB的内存 为设备保留部分空间被认为是有问题的,因为这会进一步限制少量内存。因此,处理器通过使用IN和OUT指令而不是load和store,获得了第二个地址空间(I/O空间),额外增加了64KB。这种差异在外部表现为一个特殊的引脚,本质上是给CPU一个第17个地址位 当Intel设计8086时,他们从8085开始采用这种设计,作为某种有限的向后兼容性。尽管如此,原始PC为使用内存映射I/O的设备保留了640KB到1MB的空间。例如,视频板就出现在这个空间中
MIPS系列的设计者们对前辈们没有这些顾虑,而且从一开始就拥有千兆字节的地址空间,他们认为在设备上使用大约64KB的地址空间没有问题。这样一来,他们只需提供加载和存储指令,就可以跳过输入和输出。MIPS中的I/O是内存映射的,没有输入/输出指令。使用
syscall
或jal
对PC硬件模拟器进行加载。因此,MIPS相当于inb
是lb
(加载字节),来自映射MMIO设备的地址。以防万一,我们不清楚MMIO是否真的仅仅意味着使用常规的加载/存储指令。