0
点赞
收藏
分享

微信扫一扫

day03.2-寻址方式

书坊尚 2022-02-12 阅读 72

一、为什么要寻址

  • 我们知道数据存储在内存中,CPU需要使用存在内存中的数据,使用一个数据就要在内存中找到这个数据,用什么找,就是用内存编号,即地址,来找到数据在内存中所在的位置,把它取出来使用,或者再放回到指定位置
  • 上述就是一个寻址过程:寻址方式一共有五种,计算机只认识这五种方式来寻址

二、五种寻址方式

1.寻址方式一[立即数]

  • 直接通过[立即数],即直接用内存地址来寻址

  • 读取内存的值

    MOV EAX,DWORD PTR DS:[0x13FFC4]   
    
    BBCB4D45FEEF6B0E68FC1C7299C98A85
  • 内存中写入数据

    MOV DWORD PTR DS:[0x13FFC4],ebx
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[0x13FFC4]
    
    535E45CAA61E06FC94AD883FFC11D7FA

2.寻址方式二[reg]

  • 通过[reg]来寻址,reg可以是8个通用寄存器中的任意一个。先通过读取寄存器中存放的内存地址编号,再通过内存地址编号找到内存中的值

  • 读取内存的值

    MOV ECX,0x13FFD0    #将0x13FFD0这个地址编号,放到到ECX寄存中,此地址就是ecx的基址
    #中间可能还有很多对ecx中的值的操作,我们只要找到ecx的基址,就可以跟踪ecx,最后得到下面语句中ecx究竟是什么
    MOV EAX,DWORD PTR DS:[ECX]    #将ECX寄存中存储的0x13FFD0这个地址中的值取出来放到EAX里
    
    8CFD8A6055012E11FC6BFBEE1DD4F520
  • 向内存中写入数据

    MOV EDX,0x13FFD8     #将0x13FFD8存入EDX中
    MOV DWORD PTR DS:[EDX],0x87654321
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EDX]
    
    429BF6AA2E5457D5D99FC0BAF68FDE19

3.寻址方式三[reg+立即数]

  • 通过[reg+立即数]

  • 读取内存的值

    MOV ECX,0x13FFD0
    MOV EAX,DWORD PTR DS:[ECX+4]     #将地址编号为0x13FFD0+0x000004中的值取出存到EAX中
    
  • 向内存中写入数据

    MOV EDX,0x13FFD0
    MOV DWORD PTR DS:[EDX+0xC],0x87654321
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EDX+4]
    

4.寻址方式四[reg+reg*{1,2,4,8}]

  • 通过[reg+reg*1或者2或者4或者8]来寻址,只能是1,2,4,8,后面学硬编码就知道了

  • 读取内存的值

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV EDX,DWORD PTR DS:[EAX+ECX*4]  #将0x13FFC4+0x8后的地址编号中的值取出来存到EDX
    
  • 向内存中写入数据

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV DWORD PTR DS:[EAX+ECX*4],87654321   #将87654321这个值写入到0x13FFC4+0x8这个内存中
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EAX,ECX*4]   #只是将EAX,ECX*4这个地址编号存入到EAX中
    

5.寻址方式五[reg+reg*{1,2,4,8}+立即数]

  • 通过[reg + reg*1或者2或者4或者8 + 立即数 ]

  • 读取内存的值

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
    
  • 向内存中写入数据

    MOV EAX,0x13FFC4
    MOV ECX,2
    MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
    
  • 获取内存编号

    LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
    

三、作业

1.内存读写练习

  • 每种寻址公式分别实现内存的读、写和取内存地址

    • 寻址公式一:[立即数]

      mov eax,dword ptr ss:[0x0019ff74]          #读取内存
      mov dword ptr ss:[0x0019ff74],0xAAAAAAAA   #写入内存
      lea eax,dword ptr ss:[0x0019ff74]          #取内存地址
      
    • 寻址公式二:[reg]

      mov eax,dword ptr ss:[esp]
      mov dword ptr ss:[esp],0xBBBBBBBB
      lea eax,dword ptr ss:[esp]
      
    • 寻址公式三:[reg + 立即数]

      mov eax,dword ptr ss:[esp+4]
      mov dword ptr ss:[ebp-8],edx   #将edx中的值存入到[ebp-8]内存
      lea eax,dword ptr ss:[esp+8]
      
    • 寻址公式四:[reg + reg * {1,2,4,8}]

      mov eax,2
      lea ecx,dword ptr ss:[ebp]  #现在ecx中存的值即为栈底地址编号0x19ff80
      lea ebx,dword ptr ss:[esp]  #现在ebx中存的值即为栈顶地址编号0x19ff74
      ----------------------------------
      #mov edx,dword ptr ds:[ecx-eax*1]  不能是减法!!!
      mov edx,dword ptr ds:[ebx+eax*1]   #将0x19ff76地址编号以及往高位的后三位地址编号组合起来的数存入									  edx中
      mov edx,dword ptr ds:[ebx+eax*2]   #将0x19ff78地址中的值复制一份存入edx中
      ----------------------------------
      mov dword ptr ds:[esp+eax*2],ecx
      lea eax,dword ptr ds:[esp+eax*4]
      
    • 寻址公式五:[reg + reg * {1,2,4,8} + 立即数]

      mov eax,1
      mov ebx,dword ptr ss:[esp+eax*4+0x2]   #fa100019
      mov dword ptr ss:[esp+eax*4+0x2],edx
      lea eax,dword ptr ss:[esp+eax*4+0x2]
      
      屏幕截图 2021-11-24 113659
举报

相关推荐

0 条评论