c - Os Dev 的 PCI IDE 教程中的函数 insl 是做什么的?

标签 c assembly x86 osdev ata

这是调用 insl 的函数。

void ide_read_buffer(unsigned char channel, unsigned char reg, unsigned int buffer,
                     unsigned int quads) {
   /* WARNING: This code contains a serious bug. The inline assembly trashes ES and
    *           ESP for all of the code the compiler generates between the inline
    *           assembly blocks.
    */
   if (reg > 0x07 && reg < 0x0C)
      ide_write(channel, ATA_REG_CONTROL, 0x80 | channels[channel].nIEN);
   asm("pushw %es; movw %ds, %ax; movw %ax, %es");
   if (reg < 0x08)
      insl(channels[channel].base  + reg - 0x00, buffer, quads);
   else if (reg < 0x0C)
      insl(channels[channel].base  + reg - 0x06, buffer, quads);
   else if (reg < 0x0E)
      insl(channels[channel].ctrl  + reg - 0x0A, buffer, quads);
   else if (reg < 0x16)
      insl(channels[channel].bmide + reg - 0x0E, buffer, quads);
   asm("popw %es;");
   if (reg > 0x07 && reg < 0x0C)
      ide_write(channel, ATA_REG_CONTROL, channels[channel].nIEN);
}

链接在这里,https://wiki.osdev.org/PCI_IDE_Controller#Commands .

最佳答案

What does the function insl do in Os Dev's PCI IDE tutorial?

void ide_read_buffer(... unsigned int buffer ...)

很明显为什么看不懂代码:

unsigned int buffer 显然是教程代码中的错误。它应该是 unsigned int * buffer

现在很清楚 insl 做了什么:它从第一个参数中给定的端口读取 quad 次并将结果写入数组 buffer.

函数的黑盒行为可以用以下方式解释:

void insl(unsigned reg, unsigned int *buffer, int quads)
{
    int index;
    for(index = 0; index < quads; index++)
    {
        buffer[index] = inl(reg);
    }
}

关于c - Os Dev 的 PCI IDE 教程中的函数 insl 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628271/

相关文章:

gcc - 没有这样的指令: dd 0

android - WeTab 将运行 Android 应用程序,但使用 Atom CPU。这对 NDK 和 MonoDroid 意味着什么?

assembly - 我对这次 assembly 的理解正确吗?

linux - 无法在 VMX 中将 VM 的事件状态更改为 HLT

c - 指向指针 malloc 和操作的指针

c - 如何对 C 代码的托管包装器进行单元测试?

c# - pinvoke:结构在C端填充,但回到家后数据消失了

c - AVR32 异常 : Bus Data Error

gcc - 为什么gcc "start"函数(在main之前)中有无意义的asm代码?

assembly - 计算机如何区分数据和指令?