Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly X86汇编指令到MIPS指令(端口、输入、I/O)_Assembly_X86_Port_Mips_Inline Assembly - Fatal编程技术网

Assembly X86汇编指令到MIPS指令(端口、输入、I/O)

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)

在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)  
                   : "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是否真的仅仅意味着使用常规的加载/存储指令。