全部博文(60)
分类: WINDOWS
2010-11-30 22:40:40
x86汇编语言编程小结
8个32位通用寄存器(EAX, EBX, ECX,
EDX, EBP, ESP, ESI, EDI)解释如下:
EAX:The Accumulator Register(累加寄存器),函数的返回值就保存在EAX中。
EBX:The Base Register(基址寄存器),在8个通用寄存器中,EBX是唯一一个没有被用作特殊用途的寄存器,经常用来存放数组的开始地址或者中间计算。
ECX:The Count Register(计数寄存器),经常被用作数组的索引寄存器,或者是循环计数器。
EDX:The Data Register(数据寄存器),是除EAX之外其他七个通用寄存器中与EAX关系最为紧密的寄存器,可以看作是EAX的扩展,存储EAX当前运算过程中的数据。同时,EDX也用于IO指令中,EAX存放端口上待读写的数据,而EDX则存放端口地址。
EBP:The Base Pointer,栈帧指针(Stack Frame
Pointer)即栈的基址指针。
ESP:The Stack Pointer,栈指针,指向栈顶。
ESI:The Source Index,源索引,源变址寄存器。
EDI:The Destination Index,目的索引,目的变址寄存器,以上二者常在拷贝数据块时使用。
EIP:Instruction Pointer,指令指针寄存器,存放下一条待执行指令的地址。隐含地设置,反汇编代码中看不到。
操作系统还有一个32位的标志寄存器(EFLAGS),部分位保留或给系统开发人员使用,用户只需要了解低16位中的8位常用标志位即可,如(ZF,PF,CF,SF,OF等)。
另外还有6个16位的段寄存器segment register(CS, DS, SS, ES, FS, GS),段寄存器里存放的是段选择子(segment selector),段选择子指向段描述符(segment descriptror),段描述符指定了相应的段。结合博客中《段寄存器的基本概念》阅读理解。
立即寻址模式:操作数就是已有的立即数,如mov EAX, 56H
直接寻址模式:操作数是地址,如mov EAX,
[12345678H]
寄存器寻址模式:寄存器中存放操作数,如mov EAX, EBX
寄存器间接寻址模式:寄存器中存放内存地址,如mov EAX, [EDI]
基址偏移和相对寻址模式:基址加偏移,查询内存得到。
数据移动指令
Instruction |
Operands |
Notes |
Mov des sour |
reg immed reg reg reg mem mem immed mem reg |
立即数à寄存器 寄存器à寄存器 内存à寄存器 立即数à内存 寄存器à内存 注意:没有 内存à内存 |
Push |
reg immed |
寄存器压栈 立即数压栈 ESP减去4字节(栈的增长方向从高向低) 注意:没有内存压栈 |
Pop |
reg |
栈顶元素弹出到寄存器 ESP增加4字节 |
Lea |
reg mem |
读取内存地址到寄存器 |
Offset也是取数据的地址指令,数据的地址必须是明确的(编译阶段确定),如全局变量、静态变量、字符串常量等存放在.data/.rdata节中的数据,不能获取运行时的地址,如栈上的数据地址。
Lea常用来获取栈上的数据的地址,也可以获取确定的地址。
算数运算指令
值得注意的是算数运算指令的目的寄存器必须是EAX,EBX,ECX,EDX其中之一。
逻辑运算指令
与(AND) 或(OR) 非(NOT) 异或(XOR)
比较运算指令
cmp dest sour:dest – sour不将结果保存至目的寄存器中,只是修改标志寄存器EFLAGS。 test dest sour:将dest和sour按位AND操作,但不将结果保存至目的寄存器中,只是修改标志寄存器EFLAGS。 Little Endian指的是数据低位存放在内存低字节位置上。比如要表示十进制整型100,那么换成十六进制表示就是64H,因为在计算机设计中,数据类型整型int需采用4字节表示,所以Intel处理器将64H放在低字节上,其他三个字节均是00H。 Big Endian指的是数据低位存放在内存高字节位置上。数据存储
Little Endian(Intel系列处理器)
Big Endian(Motorola PowerPC系列处理器)
chinaunix网友2010-12-01 15:12:37
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com