继续更新个人的学习笔记,
其它笔记传送门
逆向基础笔记一 进制篇
逆向基础笔记二 数据宽度和逻辑运算
逆向基础笔记四 堆栈篇
逆向基础笔记五 标志寄存器
逆向基础笔记六 汇编跳转和比较指令
逆向基础笔记七 堆栈图(重点)
逆向基础笔记八 反汇编分析C语言
逆向基础笔记九 C语言内联汇编和调用协定
逆向基础笔记十 汇编寻找C程序入口
逆向基础笔记十一 汇编C语言基本类型
逆向基础笔记十二 汇编 全局和局部 变量
逆向基础笔记十三 汇编C语言类型转换
逆向基础笔记十四 汇编嵌套if else
逆向基础笔记十五 汇编比较三种循环
逆向基础笔记十六 汇编一维数组
逆向基础笔记十七 汇编二维数组 位移 乘法
逆向基础笔记十八 汇编 结构体和内存对齐
逆向基础笔记十九 汇编switch比较if else
逆向基础笔记二十 汇编 指针(一)
逆向基础笔记二十一 汇编 指针(二)
逆向基础笔记二十二 汇编 指针(三)
逆向基础笔记二十三 汇编 指针(四)
逆向基础笔记二十四 汇编 指针(五) 系列完结
32位通用寄存器
32位通用寄存器的指定用途如下:
寄存器主要用途编号存储数据的范围EAX累加器00 - 0xFFFFFFFFECX计数10 - 0xFFFFFFFFEDXI/O指针20 - 0xFFFFFFFFEBXDS段的数据指针30 - 0xFFFFFFFFESP堆栈指针40 - 0xFFFFFFFFEBPSS段的数据指针50 - 0xFFFFFFFFESI字符串操作的源指针;SS段的数据指针60 - 0xFFFFFFFFEDI字符串操作的目标指针;ES段的数据指针70 - 0xFFFFFFFF寄存器编号(二进制)编号(十进制)32位16位8位EAXAXAL0000ECXCXCL0011EDXDXDL0102EBXBXBL0113ESPSPAH1004EBPBPCH1015ESISIDH1106EDIDIBH1117
汇编指令
符号含义r寄存器m内存imm立即数r88位通用寄存器m88位内存imm88位立即数MOV指令
MOV 的语法:
- MOV r/m8,r8
- MOV r/m16,r16
- MOV r/m32,r32
- MOV r8,r/m8
- MOV r16,r/m16
- MOV r32,r/m32
- MOV r8, imm8
- MOV r16, imm16
- MOV r32, imm32
MOV 目标操作数,源操作数
作用:拷贝源操作数到目标操作数
- 源操作数可以是立即数、通用寄存器、段寄存器、或者内存单位
- 目标操作数可以是通用寄存器、段寄存器或者内存单位
- 操作数的宽度必须一样
- 源操作数和目标操作数不能同时为内存单位
ADD指令
ADD 的语法:
- ADD r/m8, imm8
- ADD r/m16,imm16
- ADD r/m32,imm32
- ADD r/m16, imm8
- ADD r/m32, imm8
- ADD r/m8, r8
- ADD r/m16, r16
- ADD r/m32, r32
- ADD r8, r/m8
- ADD r16, r/m16
- ADD r32, r/m32
ADD 目标操作数,源操作数
作用:将源操作数加到目标操作数上
SUB指令
SUB 的语法:
- SUB r/m8, imm8
- SUB r/m16,imm16
- SUB r/m32,imm32
- SUB r/m16, imm8
- SUB r/m32, imm8
- SUB r/m8, r8
- SUB r/m16, r16
- SUB r/m32, r32
- SUB r8, r/m8
- SUB r16, r/m16
- SUB r32, r/m32
SUB 目标操作数,源操作数
作用:将源操作数减到目标操作数上
AND指令
AND 的语法:
- AND r/m8, imm8
- AND r/m16,imm16
- AND r/m32,imm32
- AND r/m16, imm8
- AND r/m32, imm8
- AND r/m8, r8
- AND r/m16, r16
- AND r/m32, r32
- AND r8, r/m8
- AND r16, r/m16
- AND r32, r/m32
AND 目标操作数,源操作数
作用:将源操作数与目标操作数与运算后将结果生存到目标操作数中
OR指令
OR 的语法:
- OR r/m8, imm8
- OR r/m16,imm16
- OR r/m32,imm32
- OR r/m16, imm8
- OR r/m8, r8
- OR r/m16, r16
- OR r/m32, r32
- OR r8, r/m8
- OR r16, r/m16
- OR r32, r/m32
OR 目标操作数,源操作数
作用:将源操作数与目标操作数或运算后将结果生存到目标操作数中
XOR指令
XOR 的语法:
- XOR r/m8, imm8
- XOR r/m16,imm16
- XOR r/m32,imm32
- XOR r/m16, imm8
- XOR r/m8, r8
- XOR r/m32, r32
- XOR r8, r/m8
- XOR r16, r/m16
- XOR r32, r/m32
XOR 目标操作数,源操作数
作用:将源操作数与目标操作数异或运算后将结果生存到目标操作数中
NOT指令
NOT 的语法:
NOT r/m8
NOT r/m16
NOT r/m32
NOT 操作数
作用:取反
LEA指令
lea:Load Effective Address,即装入有效地址的意思,它的操作数就是地址
lea r32,dword ptr ds:[内存编号(地址)]
将内存地址赋值给32位通用寄存器
lea是传址,mov是传值,注意区别
内存
内存的数量特别庞大,无法每个内存单位都起一个名字,所以用编号来代替,我们称计算机CPU是32位或者64位,主要指的就是内存编号的宽度,而不是寄存器的宽度。
有很多书上说之所以叫32位计算机是因为寄存器的宽度是32位,是禁绝确的,因为还有很多寄存器是大于32位的
通常所说的32位计算机是指CPU字长为32位
计算机内存的每一个字节会有一个编号(即内存编号的单位是字节)
0x000000000x000000010x00000002........................0xFFFFFFFF32位计算机的编号最大是32位,也就是32个1 换成16进制为FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是FFFFFFFF+1
内存的单位是字节,那内存中能存储的信息最多为:FFFFFFFF+1 字节 即4G,这也是为什么我们在一个XP的系统上面如果物理内存超过4G是没故意义的缘故原由
只要是32位的计算机,那么最多识别的内存为4G,对吗?
不对。可以通过打补丁,或者拓展操作系统来,寻址方式是由操作系统决定的
内存格式
- 每个内存单位的宽度为8
- [编号]称为地址,用[]来区分立即数和内存地址
- 地址的作用:当我们想从内存中读取数据或者想向内存中写入数据,首先应该找到要读、写的位置。就像写信要写地址一样。
从指定内存中写入/读取数据
只要是涉及到内存读写的,一定要指定内存的宽度
mov 读/写的数据宽度 ptr ds:[地址],XXXX
例:
mov eax,dword ptr ds:[0x0012FF34]
dword :要读/写多少 此时是32bit (byte 字节 8bit word字 16bit dword双字 32bit)
ds:段寄存器 这里为数据段(后续学习会讲段寄存器)
0x0012FF34 内存编号,必须是32位的,前面的0可以省略
注意:内存编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)
寻址公式
寻址公式一:[立即数]
读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
MOV EAX,DWORD PTR DS:[0x13FFC8]
向内存中写入数据:
MOV DWORD PTR DS:[0x13FFC4],eax
MOV DWORD PTR DS:[0x13FFC8],ebx
获取内存编号:
LEA EAX,DWORD PTR DS:[0X13FFC4]
LEA EAX,DWORD PTR DS:[ESP+8]
寻址公式二:[寄存器]
reg代表寄存器 可以是8个通用寄存器中的恣意一个
读取内存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
向内存中写入数据:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX],0x87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EDX]
寻址公式三:[reg+立即数]
读取内存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX+4]
向内存中写入数据:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX+0xC],0x87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EDX+4]
寻址公式四:[reg+reg*{1,2,4,8}]
读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*4]
寻址公式五:[reg+reg*{1,2,4,8}+立即数]
读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |