汇编代码学习一

来源:互联网 发布:淘宝苏宁易购退笔记本 编辑:程序博客网 时间:2024/05/28 06:07

一个IA32的cpu包含八个存储32位值的寄存器。这些寄存器可以用来存储寄存器和指针。每个寄存器一%开头,如下图所示:


大多情况下,前六个可以看作通用寄存器,多他们没有特别的使用限制。最后两个保存着指向程序最重要的两个指针。栈指针和帧指针(基址指针)。

操作数指示符

1 立即数,也称常数,在ATT汇编代码中用 '$'后面跟一个标准C表示的常数。如:$ox1F;

2 寄存器,表示某个寄存器的内容,对双字操作来说,可以是8个32位寄存器其中一个如:%eax; 对单字操作来说,可以表示8个16位寄存器其中的一个如:%ax,对字节操作来说,可以表示8个8位寄存器其中的一个:%ai;

3 存储器,他会根据计算出来的地址访问,访问某个存储器位置。如;4(%eax),表示访问 %eax  + 4 这个地址的内容。



上图所示,是操作数指示符的一些操作。

数据传送指令

movb:移动一个byte

movw:移动一个字(2byte)

movl:移动双字 (4byte)

movl     $0x12F %eax         immediate -> register  4bytes

movw  %bp       %sp           register -> register       2bytes

movb   (%edi,%ecx)  %ah  memmory -> register   1byte

movl     $0x12    4(%eax)             immediate -> memory   4bytes

-------------------------------------------------------------

pushl: 把数据压入栈顶,指令只有一个操作数,动作为:先把栈指针减四4(栈向低地址扩展),然后把值写到新的栈顶地址

 如在函数调用的时候经常看到的 pushl %ebp,其行为等价于下面两条:

subl  $0x4    %esp

movl %ebp   (%esp)


popl:把数据弹出栈顶,指令也只有一个操作数,动作:先把栈顶值读出,然后栈指针加4

如 popl %eax 其行为等价于下面两条指令;

movl     (%esp)   %eax

addl      $0x4       %esp


加载有效地址指令 lean

如: lean   (%eax)     %ecx

表面上看上去是将存储器的内容传给%ecx,实际上根本没有用到存储器引用,而是把有效地址加载给%ecx,即 把%eax -> %ecx;

淡然还有其他的整数算数操作,如下图: