簡體   English   中英

理解GCC內聯匯編語法中的輸入/輸出操作數

[英]Understanding input/output operands in GCC inline assembly syntax

由於寫我的操作系統的一部分,我在執行中斷處理和I / O功能, inboutb

我必須學習在GCC中編寫內聯匯編並在線閱讀很多內容。 根據我的理解,我編寫了自己的代碼。 同時,我從/usr/include/sys/io.h查找了Linux的函數實現。 這就是outb

static __inline void
outb (unsigned char __value, unsigned short int __port)
{
  __asm__ __volatile__ ("outb %b0,%w1": :"a" (__value), "Nd" (__port));
}

這是我的問題:

  • GCC手冊說“N”是

無符號8位整數常量(用於輸入和輸出指令)。

但是這里__portunsigned short int ,我認為它是16位。 那么如何確定16位的哪一部分用於內聯匯編?

  • 這是我對其工作原理的理解 - __port值將直接用於(因為“N”)作為常量來代替%w1。 __value值被復制到eax %bo由%al替換。 然后執行指令。 它是否正確 ?

  • 如何決定將哪個“N”或“d”用於第二個操作數? 有一些偏好順序嗎?

  • 如果我不使用“N”,會有什么不同? 不會簡單地使用“d”更好,因為這是16位?

  • 如果我省略了“N”,那么將__port值復制到edx然后將%w1替換為edx是否正確?

我可能錯了,但我的理解是"Nd"意味着在編譯器的偏好下使用Nd 如果該值不知道是一個適合8位的常量,那么N是不可滿足的,因此編譯器別無選擇,只能使用d 但是當該值是編譯時常量並且其值適合8位時,使用8位立即數比浪費寄存器更可取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM