簡體   English   中英

關於linux內核__asm__語法

[英]about linux kernel __asm__ grammar

當我從linux 0.11內核的include / asm / system.h分析內核代碼時,

我有一個問題。

有一些類似的代碼

#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \
    "movw %0,%%dx\n\t" \
    "movl %%eax,%1\n\t" \
    "movl %%edx,%2" \
    : \
    : "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
    "o" (*((char *) (gate_addr))), \
    "o" (*(4+(char *) (gate_addr))), \
    "d" ((char *) (addr)),"a" (0x00080000))

#define set_intr_gate(n,addr) \
    _set_gate(&idt[n],14,0,addr)

#define set_trap_gate(n,addr) \
    _set_gate(&idt[n],15,0,addr)

#define set_system_gate(n,addr) \
    _set_gate(&idt[n],15,3,addr)

它需要設置idt。 設置idt的一些代碼使用宏

void trap_init(void)
{
    int i;

    set_trap_gate(0,&divide_error);
    set_trap_gate(1,&debug);
    set_trap_gate(2,&nmi);
    set_system_gate(3,&int3);   /* int3-5 can be called from all */
    set_system_gate(4,&overflow);
    set_system_gate(5,&bounds);
    set_trap_gate(6,&invalid_op);
    set_trap_gate(7,&device_not_available);

我現在對c語法有疑問:“ o”(*((char )(gate_addr)))。 和“ o”( (4+(char *)(gate_addr)))

此代碼是否使輸出一個字節???

例如,如果&idt [0]為0x00006620,由於char類型,“ o”(*((char *)(gate_addr)))代碼是否像0x20一樣輸出?

但是,似乎代碼使輸出類似於0x00006620。

我不知道這種asm語法。 為什么這個匯編代碼像這樣工作??? 規則和語法是什么?

這本身不是“ C語法”,而是GCC 擴展的asm語法的一部分 "o"是一個約束 ,它限制了在程序集中引用該變量時編譯器將嘗試使用的訪問方法。

暫無
暫無

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

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