请教一个x64汇编的问题啊~
小弟我最近在学习汇编语言,实际操作的机器是台core2,安的是x86_64的linux。但在实践的时候,发现寄存器和指令的命名和书上讲的有点区别(书上用的是x86的)。
比如,
我发现x64下貌似pushl不了%eax。
x64下可以用mov,push等,但书上却只讲了,movl,movb和movw。
x64下寄存器貌似用的是%rax,%rbx,%rsp等。
请问哪里可以找到详细介绍这些差别的文档的地方啊,谢谢了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
谢谢回馈。
Intel语法和AT&T语法的区别。
http://www.moon-soft.com/program/bbs/readelite9681.htm
http://blog.csdn.net/robin_qiu/archive/2006/03/02/613904.aspx
这位兄台,intel和att的区别我大概知道的,可我问的不是这个啊。我问的是x86和x64的一些区别。比如%eax和%rax。比如在x64下,怎么使用%eax等。
补充一点,我在x64下可以使用,movl $1, %eax,但不能pushl %eax。这是怎么回事啊?
rax是64位寄存器,eax是低32位。看看AMD或者Intel的手册吧。
在x64下可以使用,movl $1, %eax,但不能pushl %eax?x64我也不熟,等待mik和ald吧。
movl $1, %eax
movl是mov一个双字,4字节的。可以
pushl %eax
pushl是push一个双字,x86的通用寄存器恰好双字,OK。但是x64的通用寄存器是8字节的,要pushq,q代表8字节。不可以push半个寄存器。
x86在32位模式下下可以push一个寄存器的低16位或者低8位么?x64不能,为了就是电路上更简单。
哦~非常感谢啊。其实道理我还是懂的,就是想知道哪里可以找到比如介绍pushq这些指令的资料,总不能一个一个试吧,呵呵。我下了intel的手册3卷,不过貌似是讲32位的。能否请教一下哪里能找到x64的相关资料。我是新手,别笑话我啊,呵呵。
http://developer.intel.com/products/processor/manuals/index.htm
32、64都有讲
http://developer.amd.com/documentation/guides/Pages/default.aspx
AMD的优化手册不错,manual结构很清晰。
OK~
太感谢了……赶紧去充电去……
我又找了下,发现对于这个问题,as的文档其实也是一个不错的选择,很简介
http://sourceware.org/binutils/docs-2.18/as/index.html