9.汇编学习环境塔建
这里直接是用OD就好,因为习惯用了。
首先这里用一张截图概括吧!
10.通用寄存器
寄存器
存储数据:
1.速度方面 cpu>内存>硬盘
2.存储格式
32位cpu: 8 16 32
64位cpu: 8 16 32 64
通用寄存器
EAX WCX WDX EBX
ESP WBP WSI EDI
==//不能多于32位 不然多来的会被丢弃==
11.通用寄存器
12.内存
每个进程都有其4G的内存
==进程 即运行的程序
4G是虚拟的,需要多少映射到物理==
这里我觉得需要写出来
1Byte=8Bit
1KB=1024Byte
1MB=1024KB
1GB=1024MB
内存地址
1.内存是一个线性地址,每个数据都占有一定的内存,而他们存的位置就是他们的地址.成为内存地址,我们可以往内里存储数据或读取数据都会用到它
2.32位的话可 存房00000000到 FFFFFFFF(16进制)
也是上面每个进程都是4G的虚拟空间
mov ax,1 //放入寄存器 ax即说明了放入ax中,16位的
mov eax,1 //eax 即说明放入到了 32位的
而放入内存里,就得先说明放入多大//宽度的内存里
==mov byte ptr ds:[0018FFF0],1== 这个是固定语法 ptr表示pointer,byte表示位宽,[]表示内存地址
//不是每个内存地址都能使用的,使用前得提前申请
但可以测试时使用堆栈区的地址,那的都可以使用
立即数 写入到寄存器
寄存器的值 写入到内存
内存的值 写到 寄存器
另外 寄存器可到寄存器
内存目前的指令不可以到内存(有指令是能实现的)
1
|
mov dword PTR ds:[18fffc],12345678
|
注意宽度:
Byte:8字节
word:16字节
dword:32字节
13.内存地址的五种形式
1.形式一:[立即数]
略过
2.形式二:[reg], reg(寄存器)可以是8个通用寄存器中的任一个
读取内存的值
1
|
mov ecx,0x13FFD0
|
向内存中写入数据
1
|
mov EDx,0x13FFD8
|
3.形式3:[reg+立即数]
读取内存的值
1
|
mov ecx,0x13FFD0
|
向内存中写入数据
1
|
mov EDx,0x13FFD8
|
4.形式4:[reg+reg*(1,2,4,8)]
读取内存的值
1
|
mov eax,0x13FFC4
|
向内存中写入数据
1
|
mov Eax,0x13FFC4
|
5.形式5:[reg+reg*(1,2,4,8)+立即数]
读取内存的值
1
|
mov eax,0x13FFC4
|
向内存中写入数据
1
|
mov Eax,0x13FFC4
|
//数据是如何存放的:小端存储(大小端百度)
15.汇编常用指令//参考资料Intel白皮书
mov指令
add指令
sub指令
and指令
做个实验:
1
|
and dword PTR ds:[18FFA0],EAX
|
or指令
xor指令
not指令
1
|
not Dword PTR ds:[18FFA0] //本来里面全为0
|
16.汇编常用指令(二)
前面提到:
寄存器可到寄存器,
内存当时说不可以直接到内存,而接下来这个指令可以实现
==movs==
小提示:
程序会在两个地方停下来:
1.刚加载时
2.程序入口点
1.movs指令:移动数据 内存–》内存
1
|
byte/word/dword
|
了解下 标志寄存器 elf
elf :00000246
DF:方向标志位:从右向左 坐标为10 //注意 有0坐标哦
if DF为0
di si 自动+1 4 8
if DF为1
di si 自动-1 4 8
试验下:
开始 换成dword
ESi从 0018FF8C 到0018FF88 减了16
Edi从 0018FFA0 到0018FF9C 减了16 //原因是 elf中的D方向标志为1;
STOS指令:讲AL/AX/EAX的值存储到[EDI]指定的内存单元
1
|
STOS
|
REP指令:按计数寄存器(ECX)中的指定的次数重复执行字符串指令
1
|
mov eax,10;//这里的值是 16进制 10即代表 会执行16次
|