我正在尝试使用带有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;
}
...
但是它不起作用,它成功编译但它没有做任何事情。
答案 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。