【第22期】观点:IT 行业加班,到底有没有价值?

汇编代码学习一

原创 2013年12月03日 22:04:22

一个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;

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








版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

从汇编代码学习C++语言2—类复制构造函数

从汇编代码学习C++语言2—类复制构造函数         类的复制构造函数同样是C++类的重要函数。         Code 1没有复制构造函数,我们将从汇编代码分析: class Obje...

C语言汇编代码分析(switch case)

我们来看下面的例子:   switch-case控制语句维护着一张跳转表(jump table),并不是用一系列的if-else来实现,在上例中就

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

从汇编代码学习C++语言1—类对象构造函数与析构函数

从汇编代码学习C++语言1—类对象构造函数与析构函数         类对象必须经历初始化与销毁两个过程,类的构造函数与析构函数担当此重任。本文作为从汇编代码学习C++语言系列的...

linux 0.11 内核学习 -- rs_io.s,串口汇编代码

/* * 该文件实现rs232 串行通信中断处理 */ /* * linux/kernel/rs_io.s * * (C) 1991 Linus Torvalds */ /* * rs_io.s * * This module implements the rs232 io...

《网络渗透技术》学习笔记(2)——一段简单的汇编代码分析 zz

http://blog.sina.com.cn/s/blog_492101c7010002sy.html 在学习笔记1中,主要分析了一个非常简单的有strcpy函数的程序被溢出的原理,以...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)