ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 汇编中寄存器加[]的意思 任何一个 32 位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP 和 ESP)加上括号就能构成一个间接操作数。 `Intel`语法格式: 一般说来,加方括号 [] 表示一种间接的取操作数方式,有点类似于C语言中的指针概念. * 第一条指令 `ADD EBX ,[ESI]` 中,`[ESI]` 表示寄存器间接寻址. 也就是说,与`EBX`中内容相加的加数,不是SI寄存器的内容,而是以`ESI`的内容作为地址指针的内存操作数. 假设`ESI`的内容是1234H,这条加法指令,不是将1234H加到`EBX`里(也加不了,数据类型不对),而是以1234H作为地址,从内存的数据段(DS所指)中,段内偏移地址为1234H的那个内存单元中取出一个字节的数据来,加到`EBX`中. * 同样的,第二条指令 `MOV [20H],EAX`,是将`EAX`中的内容传送到内存里的一个单元中去.这个单元的有效地址就是[20H]. 这里,加了方括号的`20H`,不是运算所用的数据,而是数据的地址. ## 看一段AT&T规范的例子 ``` subl $16,%esp     ; 调整栈指针,向下移动16个字节,给局部变量留出空间 movl $0,-8(%ebp)  ; 给位于ebp-8的局部变量赋值0 movl $0,-4(%ebp)  ; 给位于ebp-4的局部变量赋值0 ``` 翻译成INTEL汇编 ```  sub esp,16  mov [ebp-8],0  mov [ebp-4],0 ``` ps: http://c.biancheng.net/view/3525.html