我已经谷歌了足够多,但不知道括号()是什么意思。此外,我还看到了一些语法,如movl 8(%ebp), %eax
有人能给我推荐一些好的推荐人吗?在Google的前20个搜索结果中,我找不到任何一个。
发布于 2011-07-26 01:28:08
%eax是寄存器EAX;(%eax)是其地址包含在寄存器EAX中的存储器位置;8(%eax)是其地址是EAX的值加8的存储器位置。
发布于 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
发布于 2011-07-26 01:32:21
它们是移动指令,将数据从一个位置移动到另一个位置-在这些情况下,从内存到寄存器:
register_eax = *(unsigned long *)register_eax;您的另一个示例类似于:
register_eax = *(unsigned long *)(register_ebp + 8);https://stackoverflow.com/questions/6819957
复制相似问题