'movl(%eax)中的支架是什么意思?
题
我已经谷歌搜索了,但无法弄清楚什么括号 ()
方法。另外,我认为一些语法为 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);