我的代码
const int howmany = 5046;
char buffer[howmany];
asm("lea buffer,%esi"); //Get the address of buffer
asm("mov howmany,%ebx"); //Set the loop number
asm("buf_loop:"); //Lable for beginning of loop
asm("movb (%esi),%al"); //Copy buffer[x] to al
asm("inc %esi"); //Increment buffer address
asm("dec %ebx"); //Decrement loop count
asm("jnz buf_loop"); //jump to buf_loop if(ebx>0)
我的问题
我正在使用 gcc 编译器。出于某种原因,我的缓冲区/多少变量在我的 asm 眼中是未定义的。我不确定为什么。我只想将缓冲区数组的起始地址移动到 esi 寄存器中,在将每个元素复制到 al 寄存器时循环“多少”次。
最佳答案
您是否在 gcc 中使用内联汇编程序? (如果不是,确切地说是在其他什么 C++ 编译器中?)
如果是gcc,详见here ,特别是这个例子:
asm ("leal (%1,%1,4), %0"
: "=r" (five_times_x)
: "r" (x)
);
%0
和 %1
指的是 C 级变量,它们被特别列为第二个(用于输出)和第三个(用于输入) asm
的参数。在您的示例中,您只有“输入”,因此您将有一个空的第二个操作数(传统上在该冒号之后使用注释,例如 /* no output registers */
,以更明确地表明).
关于c - at&t asm 内联 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1956379/