【问题标题】:C program to create assembly for reading integer用于创建读取整数的程序集的 C 程序
【发布时间】:2014-10-02 15:15:38
【问题描述】:

我想使用 x86 的内联汇编语言程序和 int $128(软件中断)在 C 中创建一个库,供 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;
}

同样我想知道读取整数。

【问题讨论】:

  • 为什么需要这样做?
  • print_int(int n) { printf("%d\n", n); } read_int(int *n) { scanf("%d", n); }
  • 这给了你什么?如果不是您想要的,您具体想要制作什么?
  • 我不想使用标准库,而是使用带有软件中断的内联汇编语言(使用 asm volatile
  • 首先缩进你的代码。

标签: c interrupt inline-assembly


【解决方案1】:

您的 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"
)

【讨论】:

  • 他可能还想考虑用输入约束替换 mov:"a" (4), "b" (1)。这样,您可以避免 eax+ebx 破坏(仍然需要内存),并允许编译器在方便时将值移动到寄存器中,并在以后的代码中重用 eax+ebx 值。
  • 另外,我不在linux上,但是中断的返回值不是eax吗?也许使用"=a" (retval) 输出和"0" (4) 输入?
  • @Timothy Baldwin ...实际上我用 asm volzatile 编写的代码可以很好地打印整数...我想知道相同的代码对于 READING 整数...希望您能提供帮助
  • 蒂莫西想说的是你的代码不能正常工作。虽然它在某些情况下似乎可以工作,但如果您的 asm 在不让 gcc 知道的情况下更改寄存器的值,则可能会出现奇怪的问题,有时在 asm 语句之后很长时间。我提出的更改可能会(略微)提高性能。使用 asm 正确编写代码可能非常具有挑战性,几乎在所有情况下,您都应该使用库函数。但是,如果您必须使用中断,syscalls.kernelgrok.com 可能会为您提供一些想法,让您了解将哪些内容放入哪些寄存器以进行各种调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多