X86汇编指令到MIPS指令(端口,IN,I / O)

时间:2018-05-05 20:19:13

标签: assembly x86 port mips inline-assembly

在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;  
}

2 个答案:

答案 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。