C程序创建用于读取整数的程序集

C程序创建用于读取整数的程序集,c,interrupt,inline-assembly,C,Interrupt,Inline Assembly,我想使用x86的内联汇编语言程序和int$128(软件中断)为GCC汇编程序创建一个库,用于读取整数输入。如何进行 要打印整数,我使用了以下方法:- #define BUFF 20 int print_int(int n){ // print_int.c char buff[BUFF], zero='0'; int i=0, j, k, bytes; if(n == 0) buff[i++]=zero; else{ if(n < 0) { buff[i++]='-'; n

我想使用x86的内联汇编语言程序和int$128(软件中断)为GCC汇编程序创建一个库,用于读取整数输入。如何进行

要打印整数,我使用了以下方法:-

#define BUFF 20
int print_int(int n){ // print_int.c
char buff[BUFF], zero='0';
int i=0, j, k, bytes;
if(n == 0) buff[i++]=zero;
else{
   if(n < 0) {
   buff[i++]='-';
   n = -n;
 }



while(n){
   int dig = n%10;
   buff[i++] = (char)(zero+dig);
   n /= 10;
}
if(buff[0] == '-') 
   j = 1;
else 
   j = 0;
k=i-1;
while(j<k){
   char temp=buff[j];
   buff[j++] = buff[k];
   buff[k--] = temp;
  }
}


buff[i]='\n';
bytes = i+1;

__asm__ __volatile__ (
  "movl $4, %%eax \n\t"
  "movl $1, %%ebx \n\t"
  "int $128 \n\t"
  :
  :"c"(buff), "d"(bytes)
) ; // $4: write, $1: on stdin

return bytes-1;
}
#定义BUFF 20
int print_int(int n){//print_int.c
字符buff[buff],零=0';
int i=0,j,k,字节;
如果(n==0)buff[i++]=0;
否则{
if(n<0){
buff[i++]='-';
n=-n;
}
while(n){
int-dig=n%10;
buff[i++]=(字符)(零+挖掘);
n/=10;
}
如果(buff[0]='-')
j=1;
其他的
j=0;
k=i-1;

而(j您的asm语句需要一个clobber列表,因为它修改eax和ebx,并且取决于未列为输入的内存内容(buff的内容,只有buff的地址列为输入)。目前编译器将假定它没有

__asm__ __volatile__ (
  "movl $4, %%eax \n\t"
  "movl $1, %%ebx \n\t"
  "int $128 \n\t"
  :
  :"c"(buff), "d"(bytes)
  :"%eax", "%ebx", "memory"
)

为什么需要这样做?
print_int(int n){printf(“%d\n”,n);}
read_int(int*n){scanf(“%d”,n);}
这给了你什么?如果它不是你想要的,你具体想要生成什么?我不想使用标准库,而是使用带软件中断的内联汇编语言(使用ASM易失性)从缩进代码开始。他可能还想考虑用输入约束替换MOVs:<代码>“(4)”、“B”(1)< /代码>。这样您就可以避免EAX+EBX阻塞(仍然需要内存)。,并允许编译器在方便的时候将值移动到寄存器中,并在以后的代码中重新使用eax+ebx值。此外,我不在linux上,但eax不是中断返回值所在的位置吗?可能对输出使用
“=a”(retval)
,对
“0”(4)
输入?@Timothy Baldwin…事实上,我用asm volzatile编写的代码可以很好地打印整数…我想知道读取整数的相同代码…希望你能有所帮助Timothy想说的是,你的代码工作不好。虽然在某些情况下它似乎可以工作,但如果你的asm更改注册表的值在没有让gcc知道的情况下,奇怪的问题可能会出现,有时是在asm声明之后很久提高性能。使用asm正确编写代码可能非常具有挑战性,并且在几乎所有情况下,您都应该使用库函数。但是,如果必须使用中断,则可能会让您了解如何在各种调用的寄存器中放入内容。