首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`movl (%eax),%eax`中的括号是什么意思?

‘`movl (%eax),%eax`中的括号是什么意思?
EN

Stack Overflow用户
提问于 2011-07-26 01:25:55
回答 4查看 32.5K关注 0票数 10

我已经谷歌了足够多,但不知道括号()是什么意思。此外,我还看到了一些语法,如movl 8(%ebp), %eax

有人能给我推荐一些好的推荐人吗?在Google的前20个搜索结果中,我找不到任何一个。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-26 01:28:08

%eax是寄存器EAX;(%eax)是其地址包含在寄存器EAX中的存储器位置;8(%eax)是其地址是EAX的值加8的存储器位置。

票数 19
EN

Stack Overflow用户

发布于 2011-07-26 01:31:40

http://web.archive.org/web/20080215230650/http://sig9.com/articles/att-syntax是对Unix (AT&T) asm语法的快速介绍。由at&t asm syntax搜索。

这篇文章是vivek (http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek)的"AT&T汇编语法“,2003年9月1日。下面是AT&T的主要信息:

例如,

语法中的基本数据移动指令的一般格式是,

助记目标,源

而在AT&T的情况下,一般格式是

助记源,目标

(我记得这个顺序是调用AT&T asm作为真正的Unix asm,所以它是右的,它将数据流向右侧;虽然Intel的语法基于一些错误的masms文档,这些文档显然不适合Unix世界,但它们是左侧的,数据流向左侧)

IA-32体系结构的所有寄存器名称必须以'%‘符号为前缀,例如。%A1、%bx、%ds、%cr0等

所有文字值都必须以'$‘符号为前缀。例如,

mov $100,%bx mov $A,%al

第一条指令将值100移入寄存器AX,第二条指令将ascii A的数值移入AL寄存器。

在AT&T语法中,内存以以下方式引用,

段替代:带符号的偏移量(基数、索引、小数)

根据您want.> %es:100(%eax,%ebx,2)的地址,可以省略部分内容

请注意,偏移量和小数位数不应以“$”为前缀。再举几个与其等效的NASM语法的例子,应该会让事情变得更清楚,

GAS内存操作数NASM内存操作数-100%ES: 100 es:100 eax eax+ebx ecx+ebx*2 ebx*2 -10(%eax)eax-10%DS:-10(%ebp) ds:ebp-10示例说明,mov %ax、100 mov %eax、-100(%eax)

操作数大小。有时,特别是在将文字值移动到内存时,有必要指定传输大小或操作数大小。例如指令,

mov $10100

仅指定要将值10移动到存储器偏移量100,而不指定传输大小。在NASM中,这是通过向任何操作数添加强制转换关键字byte/word/dword等来实现的。在AT&T语法中,这是通过向指令添加后缀- b/w/l -来完成的。例如,

movb $10,%es:(%eax)

将字节值10移动到存储器位置ea:eax,然而,

移动$10,%es:(%eax)

将长值(dword) 10移动到同一位置。

jmp、call、ret等指令将控制从程序的一部分转移到另一部分。它们可以被分类为到相同代码段(near)或到不同代码段(far)的控制转移。可能的分支寻址类型有相对偏移(标签)、寄存器、内存操作数和段偏移指针。

相对偏移是使用标签指定的,如下所示。

label1:。。jmp label1

使用寄存器或内存操作数的分支寻址必须以'*‘为前缀。为了指定“远”控制转发器,必须加一个'l‘作为前缀,如'ljmp','lcall’等。例如,

GAS语法========== jmp *100 jmp近100调用*100调用近100 jmp *%eax jmp近eax jmp *%ecx调用近ecx jmp *(% eax ) jmp近eax调用*(% ebx )调用近ebx ljmp *100 jmp远100 lcall *100调用远100 ljmp *(%eax) jmp远eax lcall *(%ebx)调用远ebxret retn lret retf lret $0x100 retf 0x100

段偏移量指针使用以下格式指定:

jmp $segment,$offset

他还推荐gnu作为(gas)文档:http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html

票数 10
EN

Stack Overflow用户

发布于 2011-07-26 01:32:21

它们是移动指令,将数据从一个位置移动到另一个位置-在这些情况下,从内存到寄存器:

代码语言:javascript
复制
register_eax = *(unsigned long *)register_eax;

您的另一个示例类似于:

代码语言:javascript
复制
register_eax = *(unsigned long *)(register_ebp + 8);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6819957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档