0

我正在尝试将C中的汇编内联代码与gcc一起使用,以使用带有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;
}
...

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

4

3 回答 3

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包含读取字节。如此处所述。

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

2 LINUX.:

你编写程序集的方式是AT&T风格,所以请检查一下

static inline
unsigned read_cr0( void )
{
    unsigned val;
    asm volatile( "mov %%cr0, %0"
                  : "=r"(val) );
    return val;
}
于 2012-11-23T19:35:27.377 回答
0

从您提供的信息来看,您似乎是在与 DOS 不同的平台上编程。中断 21 仅适用于 DOS。对于 linux,请查看库 ncurses 和 readline 以了解高级终端技巧。如果您想做一些更底层的事情,您可能还对 ANSI 转义序列感兴趣。它们为您提供了一种与终端交互的方式。

于 2012-11-23T19:31:01.200 回答
0

而不是使用内联汇编器,正如其他人指出的那样,它是特定于 DOS 的,你为什么不把你的终端设置为禁用回显呢?有关如何执行此操作的详细信息,请参阅另一个问题的答案

于 2012-11-23T19:31:10.010 回答