汇编

汇编

  • 笔记
    • 01进制
    • 02进制运算
    • 03二进制简写
    • 04数据宽度
    • 05无符号数有符号数
    • 06原码反码补码
    • 07计算机不会做加法计算机只会位运算
    • 08加减运算过程
    • 09汇编学习环境搭建
    • 10-11通用寄存器
    • 12内存
    • 13内存地址的5种形式
    • 14小端存储模式
    • 15常用汇编指令
    • 16常用汇编指令
    • 17堆栈
    • 18修改EIP的指令
    • 19反调试之Fake F8
    • 20汇编眼中的函数
    • 21通过堆栈形式传递参数
    • 22堆栈平衡
    • 23外挂
    • 24ESP寻址
    • 25EBP寻址
    • 26JCC指令

笔记

1.视频提供:昆山爱达人信息技术有限公司
2.官方网址:www.bcdaren.com

01进制

1.二进制01
2.忘掉十进制,忘掉进制间的转换
3.进制的定义:
八进制:由八个符号组成,分别是01234567逢八进一
十进制:由十个符号组成,分别是0123456789逢十进一
N进制的定义:由N个符号组成,逢N进一
4.进制的书写:
5.1+1=3?

02进制运算

八进制运算
2+3=5 2×3=6 4+5=11 4×5=24
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27
277+333=632 236-54=162 276*54=20250 234/4=47

03二进制简写

0000 0001 0010 0011 0100 0101 0110 0111
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
8 9 A B C D E F

04数据宽度

数据宽度:
bit 字节byte word 双字doubleword
存储范围:
字节0-0xFF 0-0xFFFF 双字0-0xFFFFFFFF

05无符号数有符号数

1.无符号数的编码规则:
16进制0x9A 10进制154 10011010
2.有符号数的编码规则:
0正1负
int main(int argc, char*argv[])
{
Int x=0x9A000000;
printf{“以无符号形式显示:%u\n”,x};
printf{“以有符号形式显示:%d\n”,x};
return 0;
}
以无符号形式显示:2583691264
以有符号形式显示:-1711276032

06原码反码补码

有符号数的编码规则
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:正数:反码与原码相同;负数:符号位为1,其余位对原码取反
补码:正数:补码与原码相同;负数:符号位为1,其余位对原码取反加1
举例说明
-1 : 原码10000001 反码:11111110 补码:11111111
-7 : 原码10000111 反码:11111000 补码:11111001
总结:1.正数原码存储2.负数补码存储

07计算机不会做加法计算机只会位运算

1.与运算:and(&)两位都为1时,结果才为1
2.或运算:or(|)只要有一个为1就是1
3.异或运算:xor(^)不一样的时候是1
4.非运算:not(~)0就是1,1就是0
5.左移:各二进制全部左移若干位,高位丢弃,低位补0
shl(<<) 1101 1000 左移2位为:0110 0000
6.右移:各二进制全部右移若干位,低位丢弃,高位补0或者补符号位
shr 1101 0101 0011 0101
对应C语言(>>)
unsigned int a=10;
printf(“%d\n”,a>>2);
sar 1101 0101 1111 0101 加符号位11
对应C语言(>>)
int a=10;
printf(“%d\n”,a>>2);
7.总结:计算机只会位运算

08加减运算过程

09汇编学习环境搭建

应用/安全
C语言--------汇编--------二进制

10-11通用寄存器

1.寄存器
存储数据:
CPU>内存>硬盘
32位CPU:8 16 32
64位CPU:8 16 32 64
2.通用寄存器
32位通用寄存器
EXA ESP
ECX EBP
EDX ESI
EBX EDI
3.MOV指令
<1>立即数到寄存器
<2>寄存器到寄存器

12内存

1Byte=8bit 1KB=1024Byte 1MB=1024KB 1GB=1024KB
MOV指令
<1>立即数到内存

<2>寄存器到内存

<3>内存到寄存器

13内存地址的5种形式

1.形式一:[立即数]
读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
向内存中写入数据:
MOV DWORD PTR DS:[0x13FFC4],EAX
2.形式二:[reg]
reg代表寄存器 可以是8个通用寄存器中的任意一个
读取内存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
向内存中写入数据:
MOV ECX,0x13FFD8
MOV DWORD PTR DS:[EDX], 0x87654321
3.形式三:[reg+立即数]
读取内存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX+4]
向内存中写入数据:
MOV ECX,0x13FFD8
MOV DWORD PTR DS:[EDX+0xC], 0x87654321
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

14小端存储模式

  1. 存储模式
    <1>mov byte ptr ds:[0x00000000],0x1A
    <2>mov word ptr ds:[0x00000000],0x1A2C
    <3>mov dword ptr ds:[0x00000000],0x1A2C3E4F
    大端模式:数据高位在低位,数据低位在高位
    小端模式:数据低位在低位,数据高位在高位
  2. DTDEBUG内存窗口的使用
    <1>分别以字节/字/双字形式来查看内存(db dw dd)
    <2>向内存中写入四个字节的数据,并观察存储形式(大端存储/小端存储)

15常用汇编指令

数据可以存在哪:寄存器、内存
数据是如何存放的:小端存储
一.MOV指令
指令格式:
r通用寄存器
m代表内存
imm代表立即数
r8代表8位通用寄存器
m8代表8位内存
imm8代表8位立即数
1.MOV r/m8,r8
2. MOV r/m16,r16
3. MOV r/m32,r32
4. MOV r8,r/m8
5. MOV r16,r/m16
6. MOV r32,r/m32
7. MOV r8,imm8
8. MOV r16,imm16
9. MOV r32,imm32
二.ADD指令
指令格式:
1.ADD r/m8,imm8
2.ADD r/m16,imm16
3.ADD r/m32,imm32
4.ADD r/m16,imm8
5.ADD r/m32,imm8
6.ADD r/m8,r8
7.ADD r/m8,r16
8.ADD r/m32,r32
9. ADD r8,r/m8
10. ADD r16,r/m16
11. ADD r32,r/m32
三.SUB指令
指令格式
1.SUB r/m8,imm8
2.SUB r/m16,imm16
3.SUB r/m32,imm32
4.SUB r/m16,imm8
5.SUB r/m32,imm8
6.SUB r/m8,r8
7.SUB r/m8,r16
8.SUB r/m32,r32
9. SUB r8,r/m8
10. SUB r16,r/m16
11. SUB r32,r/m32
四.AND指令
五.OR指令
六.XOR指令
七.NOT指令
NOT r/m8
NOT r/m16
NOT r/m32

16常用汇编指令

1.MOVS指令:移动数据 内存-内存
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI]
例子:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI] 观察EDI的值
修改标志寄存器中D位的值,然后在执行下面的指令:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
2.STOS指令:讲AI/AX/EAX的值存储到[EDI]指定的内存单元
STOS BYTE PTR ES:[EDI] 简写为STOSB
STOS WORD PTR ES:[EDI] 简写为STOSW
STOS DWORD PTR ES:[EDI] 简写为STOSD
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
修改标志寄存器中D位的值,然后在执行下面的指令:
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI] 观察EDI的值
3.REP指令:按计数寄存器(ECX)中指定的次数重复执行字符串命令
MOV ECX,10
REP MOVSD
REP STOSD

17堆栈

1.什么是堆栈?
就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用。
和数据结构的堆栈无关
查看堆栈
2.栈指针寄存器
ESP中存储了当前的堆栈用到哪里了
3.堆栈的使用
<1>存储数据
<2>修改栈顶指针
4.PUSH指令
功能:
<1>向堆栈中压人数据
<2>修改栈顶指针ESP寄存器
指令格式:
PUSH r32
PUSH r16
PUSH m16
PUSH m32
PUSH imm8/imm16/imm32
5.POP指令
功能:
<1>向栈顶数据存储到寄存器/内存
<2>修改栈顶指针ESP寄存器
指令格式:

  1. POP r32
  2. POP r16
  3. POP m16
  4. POP m32

18修改EIP的指令

1.JMP指令
MOV EIP,寄存器/立即数/内存 简写为 JMP寄存器/立即数/内存
2.CALL指令
PUSH下一行地址
MOV EIP,立即数/寄存器/内存 简写为 CALL寄存器/立即数/内
与JMP唯一的区别:
在堆栈中存储Call指令下一行地址
3.RET指令
ADD ESP,4
MOV EIP,[ESP-4]简写为:RET

19反调试之Fake F8

1.单步步入(F7) 单步步过(F8)
<1>单步步入与单步步过的区别
<2>调试器实现原理:
断电:0xCC
单步步入:设置EFLAGS的TF位
单步步过:在下一行设置断点

20汇编眼中的函数

1.什么是函数
函数就是一系列指令的集合,为了完成某个会重复使用的特定功能
例子:向寄存器中赋值
2.如何执行一个函数?即函数调用
<1>用JMP来执行函数
<2>用CALL来执行函数
3.什么是参数?什么是返回值?
例子:编写一个函数,能够得到任意2个整数的值

21通过堆栈形式传递参数

22堆栈平衡

什么是堆栈平衡?
1)如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
2)如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。

23外挂

24ESP寻址

1.寄存器传参与堆栈传参
2.ESP寻址

25EBP寻址

26JCC指令

1.标志寄存器:EFLAGS

2.CF(bit 0)[Carry flag]
若计算操作产生的结果在最高有效位(most-significant bit)发生进位或借位则将其置1,反之清零。
这个标志通常用来指示无符号整型运算的溢出状态。
例:
MOV AL,0XFE
ADD AL,2
或者
MOV AL,0X7F
SUB AL,0xFF
3.PF(bit 2)[Parity flag]
如果结果的最低有效字节(least-significant byte)包含偶数个1位则该位置1,否则清零。
利用PF可进行奇偶校验检查:
需要传输”11001110”,数据中含5个”1”,所以其奇校验位为”0”,同时把”110011100”传输给接收方,接收方收到数据后再一次计算奇偶性,”110011100”中仍然含有5个”1”,所以接收方计算出的奇校验位还是”0”,与发送方一致,表示在此次传输过程中未发生错误。
例:
MOV AL,0CE
ADD AL,0
4.AF(bit 4)[Auxiliary Carry flag]
如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。
这个标志在BDC(binary-code decimal)算术运算中被使用。
5.ZF(bit 6)[Zero flag]
若结果为0则将其置1,反之清零。
经常与CMP或者TEST等指令一起使用
例1:判断2个值是否相等
MOV EAX,100
MOV ECX,100
CMP EAX,ECX
(CMP指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中)
例2:判断某个值是否为0
TEST EAX,EAX
(TEAT指令相当于AND指令,但是与的结果并不保存到第一个操作数中)
6.SF(bit 7)[Sign flag]
该标志被设置为有符号整型的最高有效位
(0指示结果为正,反之则为负)
例:
MOV AL,0X7F
ADD AL,2
或者
MOV AL,0XFE
ADD AL,2
7.OF(bit 11)[Overflow flag]
溢出标志OF用于反映有符号数加减运算所得结果是否溢出
可以这样理解:
如果是无符号数运算,是否溢出看CF位。
如果是有符号数运算,是否溢出看OF位
例:
MOV AL,0x7F
ADD AL,2
8.DF(bit 10)[Direction Flag]
这个方向标志控制串指令(MOVS,CMPS,SCAS,LODS以及STOS)。设置DF标志使得串指令自动增减(从高地址向低地址方向处理字符串),清除该标记则使得串指令自动递增。
STD以及CLD指令分别用于设置以及清除DF标志。

认真是一种态度更是一种责任

你可能感兴趣的:(汇编,堆栈)