汇编笔记二【32位通用寄存器 以及 常用汇编指令】 by:凉游浅笔深画眉 / Net7Cracker...

本文详细介绍了32位计算机中的寄存器类型,包括32位、16位和8位通用寄存器,并阐述了它们之间的关系。此外,还解析了32位计算机的最大寻址空间,并解释了常用汇编指令的功能和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、32位通用寄存器(EAX,ECX,EDX,EBP,ESP,EBP,ESI,EDI)

 

二、十六位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI)

 

三、八位通用寄存器(AH,AL,CH,CL,DH,DL,BH,BL)

 

四、32位,16位,8位寄存器之间的关系

  1.寄存器都是高位在前,低位在后。

  2.都是包含关系,32位寄存器之中包含了16位寄存器,16位寄存器之中包含了8位寄存器。

  关系如下:

  

五、32位的含义

  一位只能放0或1,32位就意味着能放32个0或1。

  所以32位最小取值为00000000000000000000000000000000=0x00000000

            最大取值为11111111111111111111111111111111=0xFFFFFFFF

 

  0x00000000到0xFFFFFFFF,寻址范围是0xFFFFFFFF+1=0x10000000(这里为什么要+1? 因为从0x00000000--0xFFFFFFFF,就好比0-9一共有多少位数,9-0=9再加上0本身占了一位,所以要加1)。

  0x10000000换算为10进制=4294967296(Byte)   4294967296/1024=4194304(KB)  4194304/1024 =4096(MB) 4096/1024=4(GB)

  由此可知,32位计算机最大寻址空间为4GB,也就是32位计算机最大能识别内存大小为4GB(注:这里只是针对正常计算机而已,其实也能通过补丁的方式强行修改计算机寻址范围)。

 

 

六、OD中EIP的含义:EIP指向了当前CPU运行到的指令地址。双击EIP的值,可以在CPU窗口中回到EIP指向的地址。

  

 

七、汇编常见指令及其用法

  A、Mov指令

    定义:拷贝源操作数到目标操作数

    语法定义:Mov 目标操作数,源操作数

    语法规定:

      a、源操作数可以使立即数,通用寄存器,段寄存器,或者内存单元

      b、目标操作数可以是通用寄存器,段寄存器,或者内存单元

      c、操作数的宽度必须一样

      d、源操作数和目标操作数不能同时为内存单元

           

  B、ADD指令

    定义:加法指令,两数相加

        

  C、SUB指令

    定义:减法指令,两数相减

  D、AND指令

    定义:与指令,两个数都是1,结果才是1

  E、OR指令

    定义:或指令,两个数只要有一个为1,结果就是1.

  F、XOR指令

    定义:异或指令,两个数不相同,结果才是1

  G、NOT指令

    定义:非指令,当被此运算符修饰时,每位取反

       

  H、LEA指令

    定义:取内存地址指令

    例:LEA EAX,DWORD PTR DS:[0xFFFFFFFF],最后EAX的结果是0xFFFFFFFF

 

八、汇编中内存地址的表示方法

  当一个立即数被[]包围,其表示内存地址

  例1:[0xFFFFFFFF],表示内存地址是0xFFFFFFFF

  例2:Mov dword ptr ds:[0x00401000],123456789

     上面语句表示,将123456789这个立即数赋值给0x00401000这个内存地址所指向的值,具体赋值宽度由前面的dword修饰,也就是4字节。在没有寄存器名存在的情况下,用操作符 X  ptr 指明内存单元的长度。

     0x00401000:一个内存编号,也就是内存地址

     ptr:Pointer,表示后面是一个指针,也就是一个地址,本例中的地址是0x00401000。

     ds:数据段寄存器

  例3:Mov eax,dword ptr ds:[0x00401000]

     将内存地址0x00401000所指向的值,取dword长度赋值给eax。

 

 

九、数据在内存中的存放方式

  数据在内存中存放形式都是地位在前高位在后。

  例子:mov dword ptr ds:[0x593000],12345678

    正常情况下:12345678 是从高到低排序,那么内存中就应该是78563412

  如图:可以看到实际存放的是78 56 34 12。为什么不是87 65 43 21呢?因为在内存中最小单位是字节。

     一个十六进制数(0x0--0xF)=能表示4位二进制的数(0000-1111),又因为1个字节=8位,所以一个字节可以存放2个4位的数,也就是,字节的取值范围是(0x00--0xFF)。

      上面说到,内存中最小单位是字节,所以内存中的数据都是两两存放,也就是78 56 34 12

    

转载于:https://www.cnblogs.com/fuhua/p/5883729.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值