当前位置:首页 > 北京头条 > 北京经验

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

2022-05-30 05:24:27 来源:163健康
浏览量:

汇编(通用寄存器_内存读写)寄存器分为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