汇编达人视频学习4:MOVS、STOS、REP、PUSH、POP、JMP、CALL、RET指令解析
title: 汇编达人视频学习4
date: 2021年8月3日 09点35分
tags: 汇编达人
categories: 汇编达人
17、常用汇编指令(MOVS指令、STOS指令)
1、MOVS指令:移动数据 内存 - 内存
从内存到内存的指令
EDI:地址编号,要把这个数据复制到哪里去。
ESI:地址编号,要复制的数据在哪里
MOVS指令执行一次,EDI 和 ESI 的地址编号,会自加。
EFL是标志寄存器,它是32位的。在它的第十位,是DF方向位,如果DF位是0,那么执行一次MOVS之后,EDI,ESI就自加1 2 4,如果DF位是1,那么执行一次MOVS之后,EDI,ESI就自减1 2 4,加减多少取决于是byte word dword
2、STOS指令
将AL,AX,EAX的值存储到【EDI】指定的内存单元
同样的,EDI在执行完STOS指令之后,会自加或者自减,这也同样取决于DF位是1 还是 0
3、REP指令
按计数寄存器(ECX)中指定的次数重复执行字符串指令
18、堆栈相关的指令
1、什么是堆栈
别的内存需要程序员去申请,堆栈是操作系统分配好的。
怎么查看堆栈的范围和地址呢。
首先在寄存器窗口,可以看到有一个FS 00AFE000的地址,这个地址就是操作系统为这个程序分配的堆栈。
我们在内存窗口通过dd 00AFE000 就可以查看到,堆栈。也就是四块窗口,反汇编窗口,寄存器窗口,内存窗口,堆栈窗口。
在右下角的就是堆栈窗口。
堆栈窗口的内存地址 从00D3FF5C 到 00D40000
2、ESP是栈指针寄存器
ESP是栈指针寄存器,ESP中存储了当前的堆栈用到哪里了,需要注意的是,堆栈内存空间,是从大地址往小地址用
3、堆栈的使用
1.存储数据
2.修改栈顶指针
利用命令mov dword ptr ds:【0x18ff88】,1 //把1 存放到堆栈里面
sub ESP,8 //把ESP的值减去8个,因为刚刚用了8个
需要注意的是,当用完堆栈之后,需要让ESP指向现在的栈顶,原因是如果不指向栈顶,后面程序可能会把你写的数据,覆盖掉。
4、PUSH指令
注意不要只记住指令的格式,而是需要去明白它真正的含义
5、pop指令
19、修改EIP的指令
EIP里面存放的是下一次CPU执行的地址。
1、JMP指令
JMP指令,修改EIP的地址。
2、CALL指令
注意,其他代码单步执行的时候是F8,而遇到CALL指令的时候,单步执行需要按F7
CALL指令所做的事情:
1.把CALL指令后面的那个地址,存到了EIP里面。
2.会把当前CALL指令的下一行地址,存到堆栈中。
3.ESP的值减4
3、RET指令
RET指令做的事情:
1.把当前栈顶的这个值,放入EIP里
2.同时栈顶指针加4