c - at&t asm 内联 C++ 问题

标签 c gcc assembly x86 inline-assembly

我的代码

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/

相关文章:

C++:为什么访问类数据成员比访问全局变量慢?

optimization - GCC热属性语义

assembly - 汇编中的异或语句

在 C 中调用 NASM 函数

assembly - 为什么在执行 mov eax,0FFFFFFFFh 后,寄存器 eax 在调试器中显示为 0xccffffffh

c++ - 我如何强制 Windows.h 在 Visual Studio 中静态链接而不是动态链接?

c - C语言中char数组转int的方法

c - Linux 中的 PATH_MAX 定义在哪里?

c - 为什么printf语句会无限执行?

C:使用malloc和realloc将初始内存加倍