簡體   English   中英

轉換問題:__ asm__ __volatile__

[英]Converting problem: __asm__ __volatile__

我已經在linux環境中與Nasm打交道已經有一段時間了,這個功能運行得很好......但是現在我正在切換到Windows環境,我想使用Masm(使用VS2008)我似乎無法讓這個工作.. 。

void outportb (unsigned short _port, unsigned short _data)
{
  __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

當我寫這樣的東西......

void outportb (unsigned short _port, unsigned short _data)
{
  asm volatile ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

asm不再被識別,並且volatile拋出一個錯誤,說“string”,我也嘗試編寫_asm volatile但是我得到一個錯誤,說''opcode'中的內聯匯編語法錯誤;找到'數據類型'“

假設您正在討論x86命令集,請記住以下幾點:

  1. 指令“outb”輸出一個字節,這相當於C / C ++中的“char”或“unsigned char”類型。 對於輸出16位(因為你使用的是“unsigned short”),單詞需要使用“outw”
  2. 話雖如此,英特爾建議(並且VS要求)使用指令助記符“out”,並從操作數大小識別端口大小。 例如,“out dx, ax ”等同於“outw”,而“out dx, al ”等同於“outb”
  3. 在x86上,“out”指令要求將端口和輸出值分別放入(e)dx和{eax / ax / al}寄存器中。 雖然Nasm可能會為你做這些(我沒有編譯器方便,所以我無法確認),在VS中,你必須按照CPU級別的方式完成它。
  4. 沒有理由用__asm指定“volatile”關鍵字。 任何內聯匯編指令都會導致VS編譯器禁用讀緩存(volatile關鍵字用於)

這是代碼(假設您正在寫入16位端口):

void outportw(unsigned short port, unsigned short data)
{
    __asm  mov ax, data; 
    __asm  mov dx, port; 
    __asm  out dx, ax;
}

如果你寫入8位端口,代碼應如下所示:

void outportb(unsigned short port, unsigned char data)
{
    __asm  mov al, data; 
    __asm  mov dx, port; 
    __asm  out dx, al;
}

暫無
暫無

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

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