在X86中,有一个名为IN的指令:
https://c9x.me/x86/html/file_module_x86_id_139.html
https://en.wikipedia.org/wiki/X86_instruction_listings
MIPS没有这条指令:
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html
我想在MIPS中编写自己的IN指令
怎么办呢?
我们正在编写一个使用C和MIPS的操作系统:
https://github.com/uu-os-2018/project-iota
此功能导致:
错误:无法识别的操作码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;
}
答案 0 :(得分:1)
输入/输出和内存访问指令之间的显着差异在于硬件的行为方式。软件无法使用I / O映射I / O的系统与内存指令一起工作,反之亦然。由于MIPS系统仅使用内存映射I / O,因此无法使用输入/输出指令。
答案 1 :(得分:1)
x86系列的前身(8080和8085处理器)只有一个16位地址总线,因此只能使用总共64 kB的内存。
为设备保留一些空间被认为是有问题的,因为它限制了少量的内存。因此处理器通过使用IN和OUT指令而不是加载和存储来获得第二个地址空间(I / O空间),额外的64 kB。差异在外部显示为特殊引脚,实质上为CPU提供了第17个地址位。
当英特尔设计8086时,他们遵循8085的这种设计作为某种有限的向后兼容性。尽管如此,原始PC为使用存储器映射I / O的设备保留了640 kB和1 MB之间的空间。例如,视频板出现在这个空间中。
MIPS系列的设计人员没有对前辈们的担忧,从一开始就有数GB的地址空间,他们没有看到使用这个64kB的空间用于设备的问题。这样他们也只需要提供加载和存储指令,并且可以跳过IN和OUT。