at&t asm inline c ++问题

Kel*_*ton 1 c x86 assembly gcc 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)
Run Code Online (Sandbox Code Playgroud)

我的问题

我正在使用gcc编译器.出于某种原因,我的缓冲区/ howmany变量在我的asm眼中是不确定的.我不知道为什么.我只想将缓冲区数组的起始地址移动到esi寄存器中,在将每个元素复制到al寄存器时循环"howmany"次.

Ale*_*lli 7

你在gcc中使用内联汇编程序吗?(如果没有,在其他C++编译器中,究竟是什么?)

如果是gcc,请参阅此处的详细信息,特别是此示例:

    asm ("leal (%1,%1,4), %0"
         : "=r" (five_times_x)
         : "r" (x) 
         );
Run Code Online (Sandbox Code Playgroud)

%0并且%1指的是C级变量,它们被特别列为第二个(用于输出)和第三个(用于输入)参数asm.在您的示例中,您只有"输入",因此您有一个空的第二个操作数(传统上,在该冒号之后使用注释,例如/* no output registers */,以更明确地指示).