我试图在C中使用带有gcc的C语言中的汇编内联代码,以使用ah = 07h的中断21来生成没有回显的getchar。这是我的代码(主要):

...
int main(int argc, char *argv[])
{
    int t, x, y;
    char input;
    asm(
        "movb $0x01, %%ah\n\t"
        "int $0x21\n\t"
        "movb %%al, %0"
        : "=r" (input)
    );
    printf("Character: %c\n", input);
    return 0;
}
...


但是它不起作用,可以成功编译,但是什么也没做。

最佳答案

首先,您将AT&T语法与DOS int混合使用。所以这是每个平台的答案:

1. DOS: http://msdn.microsoft.com/en-us/library/5f7adz6y(v=vs.71).aspx

__asm mov ah,01
__asm int 21


现在,al包含读取的字节。如here中所述。

如果要将al传递给char input,请使用正确的偏移量将指针esp - <the offset>堆栈到input的地址,并通过调用mov byte [esp-offset], al将其设置为读取值。

2. LINUX

编写程序集的方式是AT&T样式,因此请检查this

static inline
unsigned read_cr0( void )
{
    unsigned val;
    asm volatile( "mov %%cr0, %0"
                  : "=r"(val) );
    return val;
}

关于c - 汇编内联C,用于不带回声的getchar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13534761/

10-11 15:33