• 编译原理—寄存器和指令入门


    指令样例

    mov (%edx), %eax		// 将内存地址为 EDX 的数据放入到 EAX 寄存器中
    XCHG %edi %eax			// 交换 EAX 和 EDI 寄存器的值
    add %ebx, %eax			// 将 EAX 和 EBX 相加,并将结果更新到 EAX 中
    shl $4, %eax				// 将 eax 逻辑左移 4 位
    
    mov eax, 56					// 将 56H 的数据传送给 EAX 寄存器
    mov esi, dword ptr [eax*2+1]  // 将内存地址为 eax*2+1 处的4字节数据传送给 esi 寄存器
    mov ah, byte ptr [esi*2+eax]  // 将内存地址为 esi*2+eax 处的8位数据传送到 ah 寄存器
    mov dword ptr [esp+36],ebx		// 将ebx 寄存器的值以 4 字节 传送到堆栈地址为 esp+36 所指的地方
    
    push eax	 			// 将 eax 寄存器的值以 4字节 压栈,同时 esp-4
    push dword ptf [12FF8589]			// 将内存地址为 12FF8589 所指向的值以 4字节 压入堆栈,同时 ESP-4 
    pop dword ptr [12FF8589]			// 将堆栈顶部的 4字节 弹出到内存地址
    pop eax			// 将堆栈顶部的 4 字节弹出到 eax 寄存器,同时 esp+4
    

    通用寄存器

    EAX寄存器

    称为累加器,常用于算数运算、布尔操作、逻辑操作、返回函数等。

    EBX寄存器

    基址寄存器,常用于存档内存地址。

    CX寄存器

    计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用。

    EDX寄存器

    数据寄存器,常和EAX一起使用。

    这四个通用寄存器的用途并非固定不变。编译器在编译程序的时候,会根据很多因素,如编译器、编译条件、操作系统等作出相应的改变。

    我们首先要知道自己的程序是用什么的编译器编译的,然后参考具体的编译器的说明。

    变址寄存器

    变址的含义是内存地址会变化,即变址寄存器中存放着变动的内存地址。

    在80386结构中有两个变址寄存器:ESEDI

    ESI寄存器

    源变址寄存器,通常存放要处理的数据的内存地址

    EDI寄存器

    目的变址寄存器,通常存放处理后的数据的内存地址

    用途

    ESI 和 EDI 一个存放来源数据地址,一个存放处理后的数据地址,常搭配起来使用,完成数据的赋值操作。

    Rep movs dword ptr [edi], dword ptr [esi]
    

    上述指令把 ESI 指向的内存地址中的内容,复制到 EDI 所指的内存中,复制的数据长度在 ECX 寄存器中指定。

    指针寄存器

    简介

    80386 的指针寄存器有 基址寄存器 EBP,堆栈指针寄存器 ESP 和指令指针寄存器 EIP。

    其中指令指针寄存器 EIP 总是指向下一条要执行的指令的地址,一般情况下无需修改 EIP。

    EBP寄存器

    基址寄存器,作为通用寄存器,用于存放操作数。常用来代替堆栈指针访问堆栈中的数据。

    ESP寄存器

    堆栈指针寄存器,不可作为通用寄存器使用,存放当前堆栈栈顶的地址。一般情况下,ESP 和 EBP 联合使用来访问函数中的参数和局部变量。

    push ebp
    mov ebp, esp
    sub esp, 78
    push esi
    push edi
    cmp dword ptr [ebp+8], 0
    

    寻址方式和作用

    立即寻址

    mov eax, 56H
    

    通常用于赋值

    直接寻址

    mov eax, [12558878H]
    

    通常用于处理变量

    寄存器寻址

    mov eax, [edi]
    

    地址在寄存器中

    基址加变址寻址

    mov eax, [ebp+esi]
    

    常用于访问结构

  • 相关阅读:
    操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
    文加图, 理解Http请求与响应
    Android Retrofit 2.0使用
    Java 注解 (Annotation)你可以这样学
    MySQL 基本语句
    Java数据类型和MySql数据类型对应表
    Android Library 打造自己的 SDK,并 Maven 发布
    Java并发——线程同步Volatile与Synchronized详解
    Android getScrollX()详解
    图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
  • 原文地址:https://www.cnblogs.com/CocoML/p/13753721.html
Copyright © 2020-2023  润新知