• 汇编常用指令


    虽然现在已经不需要写汇编代码。

    但是通过汇编代码理解C++语言的详细设计是很有必要的。

    各种寄存器的意义:

    1. esp 与 ebp

    esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;

    ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以;

    既然使用esp也可以,那么为什么要设定ebp呢?

    答案是为了方便程序员。

    因为esp在函数运行时会不断的变化,所以保存一个一进入某个函数的esp到ebp中会方便程序员访问参数和局部变量,而且还方便调试器分析函数调用过程中的堆栈情况。前面说了,这个ebp不是必须要有的,你非要使用esp来访问函数参数和局部变量也是可行的,只不过这样会麻烦一些。

    1. push、pop

    PUSH 等价于:

    subl $4, %esp

    movl %ebp (%esp)

    POP 等价于:

    movl (%esp), %ead

    addl $4, %esp

    也就是入栈和出栈的功能,要注意的是操作系统栈是从高地址到底地址入栈的。

    2.CALL,RET和LEAVE

    CALL指令的步骤:首先是将返回地址(也就是call指令要执行时EIP的值)压入栈顶,然后是将程序跳转到当前调用的方法的起始地址。执行push和jump指令。

    RET指令则是将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序。

    //下面的这个指令不是很懂

    LEAVE指令是将栈指针指向帧指针,然后POP备份的原帧指针到%EBP。

    Leave等价于:

    movl %ebp %esp

    popl %ebp

    3. dword

    dword   双字 就是四个字节
    ptr pointer缩写 即指针
    []里的数据是一个地址值,这个地址指向一个双字型数据
    比如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax 
    1
    

    4. MOV 

    MOV AX,2000H;将16位数据2000H传送到AX寄存器
    注意是把右边给左边。
    (1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV [SI],[2000H];这是错误的
    (2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV IP,2000 H ;这是错误的
    (3)CS和IP不能作为目的操作数。MOV CS,AX ;这是错误的
    (4)MOV指令中立即数不能作目标操作数。MOV 2000H,[SI] ;这是错误的

     movl     %eax,     %ebx        #把32位的EAX寄存器值传送给32为的EBX寄存器值
     movw   %ax,       %bx         #把32位的EAX寄存器值传送给32为的EBX寄存器值
     movb    %al,       %lx            #把32位的EAX寄存器值传送给32为的EBX寄存器值
     ----
  • 相关阅读:
    问题 A: C#抽象类Vehicles
    最短路练习
    BFS
    poj 1083 Moving Tables
    组合数
    hdu 1443 Joseph【约瑟夫环】
    poj 2449 Remmarguts' Date【第K短路】
    hdu 1695 GCD 【莫比乌斯函数】
    hdu 2178 猜数字
    bzoj 2440 完全平方数 【莫比乌斯函数】
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/7447825.html
Copyright © 2020-2023  润新知