汇编(通用寄存器_内存读写)寄存器分为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是一样的道理
有兴趣的可以看下作业:
mov eax,0xAD8596FF
ADD EAX,0xDF
mov ecx,eax
sub ecx,0x6
mov eax,ecx
add al,ah
sub ax,cx
mov edx,eax
提示:亲,请别用OD之类的工具,用笔记本+计算器算哦!
求:最后edx的值 = =
答案在下期公布
来源:http://bbs.ichunqiu.com/thread-8744-1-1.html?from=ch