汇编(通用寄存器_内存读写)

  寄存器分为64位 32位 16位 8位寄存器,现阶段最多的就是64位寄存器,不过好多程序都是32位的,寄存器的位数是由计算机发展决定的 


下面是他们的关系结构:
  32位寄存器前面是32位的名词,后面是16位寄存器,而16位寄存器又由2个8位的寄存器组成


 
mov指令:
    MOV EAX(目标操作数),0xAAAAAA(原操作数)

          这段代码的意思是把0xAAAAAA复制一份给EAX



  汇编语言就是不停的移动数据,程序越复杂,数据流动就越复杂,逆向就是分析数据跑来跑去是怎么跑的!


代码操作:
 


现在我们可以看见
eax=de856253
而我们汇编代码为
mov eax,0xaaaaaaaa
此时当我们执行
 

我们的eax就变成了AAAAAAAA
接下来,我们的代码是:
mov ax,0xbbbb
我们在把上面的一张图拿来:
 


AX是EAX里面的,所以我们运行代码后eax的值应该是
EAX = 0xAAAABBBB
现在我们运行一下:
 


果然不出我们所料eax的值变成了0xAAAABBBB
然后我们第3条代码为:
mov ah,0xDD
由上图我们可以看出来AH是AX的前2位,当我们运行程序寄存器EAX的值应该是:0xAAAADDBB


 
接下来就是最后一条语句了
mov al,0xff
AL是AX中的后2位,如果我们再次运行的话EAX的值应该变成0xAAAADDFF


 
接下来我们尝试把EXA的值复制到ECX中去,代码是:
mov ECX,EAX
我们可以看见此时我们EAX的值为:
 


那么当我们执行此语句后ECX的值也会是AAAADDFF


 
重上图可以看见ECX的值已经变成和EAX一样了

以下是mov的语法


 
看不懂的话,我会一个一个的解释

MOV r/m8,r8
      r/m8的意思可以是通用的8位寄存器,也可以是8位内存

        整句话的意思是可以把8位的通用寄存器的值复制给8位的地址或者8位的通用寄存器



代码演示:
file:///C:/Users/Xuanxuan/Documents/My%20Knowledge/temp/1ccd35f7-f0ac-424c-8b3c-244b0588923c.jpg


代码:
mov ah,cl
    重上图可以看出 AH和CL都是8位寄存器这句代码翻译到上面的汇编格式为:

                mov r8,r8

此时我们
EAX=0xAAAADDFF
ECX=0xAAAADDFF

运行代码后为
EAX=0xAAAAFFFF



 
可以看见我们的值变了
注意一点:8位必须对应8位,16位对应16位,32位对应32位
下面我解释下立即数:
立即数在这里就是8-32位的16进制数
比如:
mov ax,0x8f8d
 


可以看见我们EAX的值重0xAAAAFFFF变成了0xAAAA8F8D




那么其他的imm8,imm16,imm32也是一样的

ADD指令:
ADD 寄存器,值
    目标操作数=目标操作数+原操作数


代码演示:
add eax,0xFF

此时我们eax的值为:


 
我i们运行代码


我们的寄存器的值变成了:aaab00fe

我们用计算器来验证正确性:
 


我们计算一下:


 



和我们寄存器的值是一样的
 

ADD的语法和mov是一样的

sub是减法,和ADD是一样的道理


相关链接:http://bbs.ichunqiu.com/thread-8744-1-1.html?from=csdnJG

发布了46 篇原创文章 · 获赞 15 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章