gnu assembler: get address of label/variable [INTEL SYNTAX]

后端 未结 1 431
借酒劲吻你
借酒劲吻你 2021-01-13 06:06

I have a code like this:

.bss
woof: .long 0

.text
bleh:
...some op codes here.

now I would like to move the address of woof into eax. What

1条回答
  •  生来不讨喜
    2021-01-13 06:36

    The bss section can't have any actual objects in it. Some assemblers may still allow you to switch to the .bss section, but all you can do there is say something like: x: . = . + 4.

    In most assemblers these days and specifically in gnu for intel, there is no longer a .bss directive, so you temporarily switch to bss and create the bss symbol in one shot with something like: .comm sym,size,alignment. This is why you are presumably getting an error ".bss directive not recognized" or something like that.

    And then you can get the address with either:

    lea woof, %eax
    

    or

    movl $woof, %eax
    

    Update: aha, intel syntax, not intel architecture. OK:

    .intel_syntax noprefix
        lea    esi,fun
        lea    esi,[fun]
        mov     eax,OFFSET FLAT:fun
    .att_syntax
        lea     fun, %eax
        mov     $fun, %eax
    .data
    fun: .long 0x123
    

    All the lea forms should generate the same code.

    0 讨论(0)
提交回复
热议问题