Borland x86 inlined assembler; get a label's address?

前端 未结 12 866
清酒与你
清酒与你 2021-01-05 03:15

I am using Borland Turbo C++ with some inlined assembler code, so presumably Turbo Assembler (TASM) style assembly code. I wish to do the following:

void foo         


        
12条回答
  •  孤城傲影
    2021-01-05 03:45

    Everything I can find about Borland suggests this ought to work. Similar questions on other sites (here and here) suggest that Borland can handle forward-references for labels, but insists on labels being outside asm blocks. However, as your label was already outside the asm block...

    I am curious whether your compiler would allow you to use this label within, for instance, a jmp instruction. When toying around with it (admittedly, on a completely different compiler), I found a pesky tendency for the compiler to complain about operand types.

    The syntax is quite different, and it's my first attempt at inline asm in a long time, but I believe I've munged this enough to work under gcc. Perhaps, despite the differences, this might be of some use to you:

    #include 
    int main()
    {
        void *too = &&SomeLabel;
        unsigned int out;
        asm
        (
          "movl %0, %%eax;"
          :"=a"(out)
          :"r"(&&SomeLabel)
        );
    SomeLabel:
        printf("Result: %p %x\n", too, out);
    
        return 0;
    }
    

    This generates:

    ...
            movl    $.L2, %eax
    ...
    .L2:
    

    The && operator is a non-standard extension, I wouldn't expect it to work anywhere other than gcc. Hopefully this may have stirred up some new ideas... Good luck!

    Edit: Though it's listed as Microsoft specific, here is another instance of jumping to labels.

提交回复
热议问题