汇编内联C for getchar without echo

时间:2012-11-23 19:22:20

标签: c assembly inline-assembly

我正在尝试使用带有gcc的C中的汇编内联代码,使用带有ah = 07h的中断21来生成没有echo的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;
}
...

但是它不起作用,它成功编译但它没有做任何事情。

3 个答案:

答案 0 :(得分:1)

首先,您将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;
}

答案 1 :(得分:0)

根据您提供的信息,您似乎在与DOS不同的平台上进行编程。中断21仅适用于DOS。对于linux,请查看库ncurses和readline以获得高级终端技巧。如果你想做更低级别的事情,你可能也会对ANSI转义序列感兴趣。它们为您提供了与终端进行交互的方式。

答案 2 :(得分:0)

而不是像其他人指出的那样使用内联汇编程序是特定于DOS的,为什么不设置终端来禁用echo?有关如何操作的详细信息,请参阅this answer to another question