我已经谷歌搜索了,但无法弄清楚什么括号 () 方法。另外,我认为一些语法为 movl 8(%ebp), %eax

有人可以建议我一些很好的参考吗?我无法在Google的前20名结果中找到任何。

有帮助吗?

解决方案

%eax 是注册EAX; (%eax) 是在寄存器EAX中包含地址的内存位置; 8(%eax) 是内存位置,其地址是EAX Plus 8的值。

其他提示

http://web.archive.org/web/20080215230650/http://sig9.com/articles/att-syntax 快速介绍UNIX(AT&T)ASM语法。谷歌搜索 at&t asm syntax.

该帖子是Vivek的“ AT&T组装语法”(http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek),2003-09-01。关于AT&T的主要信息:

例如,Intel-Syntax中基本数据运动指令的一般格式是,

mnemonic    destination, source

而对于AT&T,一般格式是

mnemonic    source, destination

(我记得这个命令称为AT&T ASM为真正的Unix ASM,所以它是 正确的 一个,然后将数据向右流动;虽然英特尔语法是基于一些不正确的MASMS文档,这些文档显然不适合Unix World,但它们是 剩下 数据流向左侧)

IA-32体系结构的所有寄存器名称必须由“%”标志(例如。 %al,%bx,%ds,%cr0等。

所有文字值必须由“ $”符号前缀。例如,

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

第一个指令将值100移至寄存器AX,第二个指令将ASCII A的数值移至AL寄存器中。

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

segment-override:signed-offset(base,index,scale)

可以根据您想要的地址省略部分。>%ES:100(%eax,%ebx,2)

请注意,偏移和量表不应以“ $”为前缀。还有一些与等效nasm-syntax的示例,应该使事情变得更清晰,

GAS memory operand      NASM memory operand
------------------      -------------------

100                     [100]
%es:100                 [es:100]
(%eax)                  [eax]
(%eax,%ebx)             [eax+ebx]
(%ecx,%ebx,2)           [ecx+ebx*2]
(,%ebx,2)               [ebx*2]
-10(%eax)               [eax-10]
%ds:-10(%ebp)           [ds:ebp-10]
Example instructions,
mov %ax,    100
mov %eax,   -100(%eax)

操作数尺寸。有时,尤其是在将文字值移至内存时,指定转移大小或操作数大小的必要条件。例如指令,

mov    $10,    100

仅指定值10要移至内存偏移100,而不是传输大小。在NASM中,这是通过将铸造关键字字节/word/dword等添加到任何操作数来完成的。在AT&T语法中,这是通过在指令中添加后缀-B/W/L-来完成的。例如,

movb    $10,    %es:(%eax)

将字节值10移至内存位置[ea:eax],而

movl    $10,    %es:(%eax)

将长的值(dword)移至同一位置。

JMP,呼叫,RET等指令将控件从程序的一个部分传输到另一部分。它们可以分类为转移到相同的代码段(接近)或不同代码段(FAR)的控制传输。分支地址的可能类型是 - 相对偏移(标签),寄存器,内存操作数和段偏移指针。

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

label1:
    .
    .
  jmp   label1

使用寄存器或内存操作数的分支解决方案必须由“*”前缀。要指定“远”控制式tranfers,必须将'l'前缀,例如'ljmp','lcall'等。例如

GAS syntax        NASM syntax
==========        ===========

jmp   *100        jmp  near [100]
call  *100        call near [100]
jmp   *%eax       jmp  near eax
jmp   *%ecx       call near ecx
jmp   *(%eax)     jmp  near [eax]
call  *(%ebx)     call near [ebx]
ljmp  *100        jmp  far  [100]
lcall *100        call far  [100]
ljmp  *(%eax)     jmp  far  [eax]
lcall *(%ebx)     call far  [ebx]
ret               retn
lret              retf
lret $0x100       retf 0x100

使用以下格式指定段出现指针:

jmp    $segment, $offset

他还建议GNU作为(煤气)文档: http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html

他们是 移动 说明,将数据从一个地方转移到另一个地方 - 在这些情况下,从内存到寄存器:

register_eax = *(unsigned long *)register_eax;

您的另一个例子是:

register_eax = *(unsigned long *)(register_ebp + 8);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top