寄存器分为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 |
汇编(通用寄存器_内存读写)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.