汇编基础一日一学习4

首先今天我给大家来讲解下我们内存中数据的存储以及存取。这节课的基础也是非常重要的。。因为我们大家都知道80386的数据地址线是32根,所以它一次可以传送数据是4个字节。所以我们内存单元是按照4个字节来对齐的。用高级语言的话,就是DWORD类型也就是4个字节。

        首先来看下00403025h在内存中的存放情况。因为我们内存中是一段连续的字节单元。一个内存单元存放一个字节。并且是按照低地址结尾的。也就是低地址是放在内存中的低地址处。高地址放在内存中的高地址处。






为何我们一些程序通过编译器以及链接器生成后,我们通过一些16进制编辑工具(如c32asm,UE等)打开后,总是看到一些RVA地址是倒序的形式。这就是因为我们编译的程序必须按照我们内存中的存放形式,这样我们的程序被映射到内存后,我们cpu才能正确的读入,否则读取的就是错误的数据。
  

    
      之前我们已经简单的讲过mov语句,例如将立即数00403025h传送到eax寄存器。
  mov eax,00403025h 等. 之前我们还学过将一个内存单元的数据传送到一个寄存器中。

   这样的格式呢就是mov寄存器名, [内存单元的偏移地址]


  "[]"表示的就是一个内存单元。"[xxxx]" 中的xxxx就表示的内存单元的偏移地址。 因为80386是平坦模式寻址,所以此时不需要段寄存器。


  上面是将内存单元的数据传送到寄存器。那么如何将寄存器中的值传送到内存单元呢。?

  呵呵,我们反之其道而行。
   例如eax =00403050h ,我们想把eax寄存器的值传送到内存单元[00405085]处

   也就是这样。 mov[00405085], eax
  
  
   这样的格式呢就是 mov[内存单元的偏移地址],寄存器或者是立即数(也可以说ASCII码)  嘿,想起免杀课程动态恢复ASCII的那节课程了吗?其实利用的就是这个原理。

    
到这里我在给大家总结一下:
      
    mov 寄存器名,[内存单元的偏移地址]  ;这样的形式就是读取内存单元的数据
      
    mov [内存单元的偏移地址],寄存器或者是立即数(也可以说ASCII码)  ;这样的形式就是向内存单元中写入数据

  



小作业:


    1.假如此时eax寄存器的值=00004000h,那么00402530h地址的双字内存单元中存放的数据是 70h 60h 50h 00h
那么执行mov eax, [00402530h] 后,eax的寄存器值等于多少?


    2.假如此时eax寄存器的值=00305060h,那么此时00403520h地址的双字内存单元中存放的数据是 00h 50h 60h 00h,那么执行
    moveax, 00403520h 后, eax的寄存器值等于多少?


    3.假如此时eax寄存器的值=00403020h,那么ebx寄存器的值是00305025h, 00305025h地址的双字内存单元存放的数据是 00h 30h 50h00h
  那么执行 mov eax,[ebx] 后,eax寄存器的值等于多少?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值