2009-12-13 78 views

回答

7

bss部分中不能有任何实际的对象。有些汇编程序可能仍允许您切换到.bss段,但您可以在此处执行的操作如下所示:x: . = . + 4

在大多数编译器这些天,特别是在GNU对于英特尔来说,也不再是.bss指令,让你暂时切换到BSS和喜欢的东西建立在一杆的BSS符号:.comm sym,size,alignment。这就是为什么你大概会得到一个错误“bss指令不承认”或类似的东西。

然后你就可以用你可以下载地址:

lea woof, %eax 

movl $woof, %eax 

更新:啊哈,英特尔的语法,而不是英特尔架构。确定:

.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 

所有lea表单应该生成相同的代码。

+0

非常感谢,很有启发。尽管如此,这不是真正的bss或数据部分。我只需要知道如何使用gnu INTEL语法将标签的地址加载到地址中,而不是AT&T的。 我试过mov eax,woof和mov eax,dword ptr [woof],但两者都给了我相同的结果。 我想要做一些像movl $ woof,%eax,但使用gnu intel语法的东西。 – jian2587 2009-12-13 21:30:44

+0

感谢DigitalRoss!我也在使用lea,但是我想知道是否可以使用mov来完成。我认为OFFSET FLAT是这里的关键? – jian2587 2009-12-14 00:16:49

+0

对,有多种寻址模式; MOV可以立即加载,这可能也是一个地址,或者它可以加载地址的内容。通常在Unix上,'movl $ woof,%eax'与'movl woof,%eax',但在英特尔语法中它更加粗俗。无论如何,“是”,lea和mov都可以加载地址。 – DigitalRoss 2009-12-14 00:35:21