汇编

写在前面:寄存器 内存 指令
汇编语言与高级语言通过编译器将指令翻译成机器语言,让计算机执行。
几进制就有几个数,从0到几,逢几进一
每个进制都是独立的体系,都有自己独立的运算体系
16进制在计算机中是二进制简写

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

数据宽度 位 字节 字 双字
无符号数 有符号数(开头为0 正数)相同编码规则直接加起来
-1
原码 10000001
反码 11111110
补码 11111111
正数存原码,负数存补码
计算机只会做位运算
与 或 异或 非 右移(shr sar) 左移
计算机做加法减法乘法除法,其实本质是加法和减法,因为加法就是几个数相加,减法就是减去一个负数,乘法就是有几个数相加而除法就是他能减去几个,所以归根结底还是加法,万物都属于加法,计算机做加法只能利用位运算来做加法,而不能用“加法”来做加法运算,就是先异或再判断是否有进位,用与运算来判断是否有进位,如果有进位的话,就将与运算的进位内容(与运算出哪位有进位利用左移得到进位后的结果)与先前的结果再加
加法的本质
计算机中存储数据在三个地方:CPU>内存>硬盘
32位 CPU 8 16 32(能提供三种寄存器)
64位 CPU 8 16 32 64(能提供四种寄存器)
32位通用寄存
EAX ESP
ECX EBP
EDX ESI
EBX EDI
内存
每个进程会被分到4G的独立内存,其实根本用不完,用了的部分被映射到物理内存,再映射到实际的内存条上
内存的每一块占8位(一个字节)而内存地址是32位(8个十六进制数)
内存读取的五种形式(地址表示)
1)立即数
2)寄存器
3)寄存器+立即数
4)寄存器+寄存器*{1,2,4,8} (数组的汇编)
5)寄存器+寄存器*{1,2,4,8}+立即数
内存存储模式
大端存储 数据高位在低位,数据低位在高位(手机)
小端存储 数据低位在低位,数据高位在高位(电脑)
常用的汇编指令(从后往前)
mov add sub and or xor not
movs 移动数据 从内存到内存(D位方向位1减 0加)
movs byte ptr es:[edi],byte ptr ds:[esi] 简写:movsb
movs word ptr es:[edi],word ptr ds:[esi] 简写:movsw
movs dword ptr es:[edi],dword ptr ds:[esi] 简写:movsd
stos 将al/ax/eax的值存储到[edi]指定的内存单元(D位方向位1减 0加)
stos byte ptr es:[edi] 简写:stosb
stos word ptr es:[edi] 简写:stosw
stos dword ptr es:[edi] 简写:stosd
rep指令:按计数寄存器(ecx)中指定的次数重复执行字符串指令
mov ecx,10
rep movsd
rep stosd
esp 栈指针寄存器
堆栈是给运行中的程序存当前的值
堆栈是一段内存,系统在程序启动时已经分配好了,供程序执行时使用。
push 将数据压入栈顶 修改栈指针位置(修改esp值)
pop 将栈顶数据放入指定寄存器和内存 修改栈指针位置(修改esp值)
(esp改变的值和放入(立即数 内存 寄存器的值)或拿出到(内存 寄存器的值)的值位数有关)
修改EIP的值(程序下一次要执行的地址)
1.jmp 立即数 寄存器 内存 —直接修改EIP的值
2.CALL 立即数/寄存器/内存
push下一行地址
MOV EIP,立即数/寄存器/内存
与JMP唯一区别:
在堆栈中存储CALL指令下一行地址(修改堆栈数值+ ESP值减4)
3.RET
ADD ESP,4
MOV EIP,{ESP-4} (中括号里的值代表这个位置里的值)
调试原理
单步步入(f7)单步步过(f8)
单步步入与单步步过的区别
取决于调试器实现原理
单步步过(f8)依赖于断点 0xCC CPU执行到int 3就会停下来(断点的本质)
单步步入:设置EFL寄存器里的T标志位,使CPU单步执行
单步步过:在下一行设置断点(无论前面执行多少执行到断点就会停止)
函数是一系列指令的集合,为了完成某个会重复使用的特定功能
jmp和call 调用函数
传参(寄存器 堆栈) 返回值
堆栈平衡(执行程序之前栈顶指针在那执行完程序后栈顶指针在那)
1.如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
2.如果通过堆栈传递参数,那么在函数执行完毕后,要平衡参数导致的堆栈变化。
平衡堆栈的方法
1.外平栈 add esp,8
2.内平栈 ret 8
ESP寻址 利用ESP(栈顶指针的位置)来寻找其他位置的值
ESP寻址的缺点 当你在一个堆栈中,函数比较复杂时,压入很多数据,你想得到的位置就要经过一番计算。
EBP寻址(由于在函数运行过程中,不断要往堆栈中写入数据,所以栈顶指针不断在变化,这时用栈顶指针来定位就不合适,需要找一个相对固定的值)
所以想到用栈底指针(ebp的值)来定位,由于起始的ebp的值低所以要先把堆栈提升,再降回来(平衡堆栈)
EBP寻址
下面是以例子的形式展示的ebp寻址(绿框中为提升堆栈和降回堆栈的过程)
sub esp,10 这条是为了提升esp的值即提高栈顶
ebp寻址jcc指令
运算相关指令会影响标志寄存器
标志寄存器
C 在运算中最高有效位出现进位和借位 置1 表示无符号整型运算的溢出状态
P 最低有效位(最后一个字节)偶数个1 置1 奇偶校验检查
A 运算中结果的第3位进位或借位 置1 BCD运算
Z 结果为0 置1 与cmp(sub 两值是否为0
test(and 判断是否为零)一起用
S 最高有效位(符号位)的值 是1话 置1
O 有符号数加减运算是否溢出
总结: 无符号位数运算 是否溢出看C位
有符号数运算 是否溢出看O位
D 方向位 STD设置为1 CLD清除标志位(置零)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值