我试图在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/