4
我有这样的代码:GNU汇编:获取标签/变量的地址[Intel语法]
.bss
woof: .long 0
.text
bleh:
...some op codes here.
现在我想纬的地址移到EAX。什么是英特尔语法代码在这里做到这一点?将bleh的地址转换成ebx也是一样。
非常感谢您的帮助!
我有这样的代码:GNU汇编:获取标签/变量的地址[Intel语法]
.bss
woof: .long 0
.text
bleh:
...some op codes here.
现在我想纬的地址移到EAX。什么是英特尔语法代码在这里做到这一点?将bleh的地址转换成ebx也是一样。
非常感谢您的帮助!
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
表单应该生成相同的代码。
非常感谢,很有启发。尽管如此,这不是真正的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
感谢DigitalRoss!我也在使用lea,但是我想知道是否可以使用mov来完成。我认为OFFSET FLAT是这里的关键? – jian2587 2009-12-14 00:16:49
对,有多种寻址模式; MOV可以立即加载,这可能也是一个地址,或者它可以加载地址的内容。通常在Unix上,'movl $ woof,%eax'与'movl woof,%eax',但在英特尔语法中它更加粗俗。无论如何,“是”,lea和mov都可以加载地址。 – DigitalRoss 2009-12-14 00:35:21