汇编

只是学学不详细

汇编

通用寄存器

32位 16位 8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
EBP BP CH
ESI SI DH
EDI DI BH

MOV指令
1.立即数到寄存器 mov eax,1
2.寄存器到立即数 mov eax,edx

内存

mov指令
1.立即数到内存
1.一个字节 mov byte ptr ds:[地址编号],1
2.2个字节 mov word ptr ds:[地址编号],ax
3.4个字节 mov dword ptr ds:[地址编号],0x12345678

2.寄存器到内存
mov dword ptr ds:[地址编号],eax

3.内存到寄存器
mov eax,dword ptr ds:[地址编号]

内存地址的5种形式

1.立即数
mov dword ptr ds:[0x13FFC4],eax
mov eax,dword ptr ds:[0x13FFC4]

2.[reg] reg表示8个32位通用寄存器中的一个

mov ecx,0x13FFD0
mov eax,dword ptr ds:[ecx]
mov edx,0x13FFD8
mov dword ptr ds:[edx],0x87654321

前提是该寄存器的值为一个地址编号

3.[reg+立即数]

mov ecx,0x13FFD0
mov eax,dword ptr ds:[ecx+4]
mov edx,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

前提是eax+ecx*4的值为一个地址编号

5.[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

存储模式

大端模式:数据高位在低位,数据低位在高位
小端模式:数据低位在低位,数据高位在高位

db 地址: 以一个字节显示内存地址的内容
dw 地址: 以两个字节显示内存地址的内容
dd 地址: 以四个字节显示内存地址的内容

汇编指令

r 通用寄存器 m 内存 imm 代表立即数 r8 代表8位通用寄存器 m8 代表8位内存
imm8 代表8位立即数

1.mov指令

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 r8,imm16
9.mov r8,imm32

2.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/m16,r16
8.add r/m32,r32
9.add r8,r/m8
10.add r16,r/m16
11.add r32,r/m32

最后存在前面

3.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/m16,r16
8.sub r/m32,r32
9.sub r8,r/m8
10.sub r16,r/m16
11.sub r32,r/m32

4.and指令(与运算)

1.and r/m8,imm8
2.and r/m16,imm16
3.and r/m32,imm32
4.and r/m16,imm8
5.and r/m32,imm8
6.and r/m8,r8
7.and r/m16,r16
8.and r/m32,r32
9.and r8,r/m8
10.and r16,r/m16
11.and r32,r/m32

5.or指令(或运算)

1.or r/m8,imm8
2.or r/m16,imm16
3.or r/m32,imm32
4.or r/m16,imm8
5.or r/m32,imm8
6.or r/m8,r8
7.or r/m16,r16
8.or r/m32,r32
9.or r8,r/m8
10.or r16,r/m16
11.or r32,r/m32

6.xor指令(异或运算)

1.xor r/m8,imm8
2.xor r/m16,imm16
3.xor r/m32,imm32
4.xor r/m16,imm8
5.xor r/m32,imm8
6.xor r/m8,r8
7.xor r/m16,r16
8.xor r/m32,r32
9.xor r8,r/m8
10.xor r16,r/m16
11.xor r32,r/m32

7.not指令(非)

1.not r/m8
2.not r/m16
3.not r/m32

8.movs指令:移动数据 内存->内存

指定edi和esi

byte/word/dword
move byte ptr ds:[EDI],byte ptr ds:[esi] movsb
move word ptr ds:[EDI],word ptr ds:[esi] movsw
move dword ptr ds:[EDI],dword ptr ds:[esi] movsd

当d位为0时执行完一次edi和esi会自动加1(或2或4)
当d位为1时执行玩一次edi和esi会自动减1(或2或4)

9.stos指令

将AL/AX/EAX的值存储到[edi]指定的内存单元
stos byte ptr ds:[EDI] stosb
stos word ptr ds:[EDI] stosw
stos dword ptr ds:[EDI] stosd

10.rep指令

按计数寄存器(ecx)指定的次数重复执行字符串指令

使用堆栈

esp寄存器
esp寄存器存储的是此时堆栈所对应的位置

push指令

1.向堆栈中压入数据
2.修改栈顶指针esp寄存器
相当于
move dword ptr ds:[],3
sub esp,4
格式
1.push r32
2.push r16
3.push m16
4.push m32
5.push imm8/imm16/imm32

若执行完之后想恢复到初始esp位置,直接add esp,n*对应的字节数

pop指令

与push相反,取出栈顶指针此时指向的值,存到指定的位置,并将栈顶指针加对应的字节数
相当于
move eax,dword ptr ss:[esp]
add esp,4
格式
1.pop r32
2.pop r16
3.pop m16
4.pop m32

修改eip相关的指令

1.jmp指令
jmp 寄存器/立即数/内存 相当于 mov eip,寄存器/立即数/内存

2.call指令(单步执行f7)
call 寄存器/立即数/内存
相当于
push 下一行地址
mov eip,寄存器/立即数/内存
与jmp的区别:在堆栈中存储call指令下一行地址

3.ret指令
ret
相当于
add esp,4
mov eip,[esp-4]

断点

f2或int 3

函数

函数调用
1.jmp调用
2.call调用
两者区别主要是call可以主动将下一行地址压入堆栈中,通过ret即可返回

传参
1.寄存器传参
2.堆栈传参

堆栈平衡

1.如果要返回父程序,则当我们在堆栈中进行堆栈的操作时,一定要保证在ret这条指令之前,
esp指向的是我们压入堆栈的地址

2.如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化

外平栈
在执行完之后的下一条语句加一个add esp

内平栈
在ret 语句后加上一个移动的字节数 如 ret 8

例子:

	push 1
	push 2
	call 00418413
	1.外平栈 add esp,8
	mov eax,dword ptr ds:[内存地址编号+8]
	add eax,dword ptr ds:[内存地址编号+4]
	2.内平栈 retn 8

ebp寻址

ebp栈底指针
ebp的值不会随着对堆栈的操作而改变,具体做法就是将ebp的指向指到esp的指向然后进行操作
将ds改成ss

例子:

push 1
push 2
call 00418413
1.保存esp的地址
push ebp
mov ebp,esp

sub esp 10
mov eax, dword ptr ss[ebp-8]
add eax, dword ptr ss[esp+C]

2.移回esp、ebp的指向
mov esp,ebp
pop ebp

retn 8

JCC指令

修改eip指令,但是有条件依据标志寄存器来进行修改

efl存储的内容是下面12个标志寄存器依照高位在前的顺序写出来的16进制形式

标志寄存器32个

OF(11):溢出标志
DF(10):方向标志
IF(9):中断使能标志
TF(8):单步标志
SF(7):符号标志
ZF(6):零标志
0(5)
AF(4):辅助进位标志
0(3)
PF(2):奇偶标志
1(1)
CF(0):进位标志

1.cf位(bit 0)

主要判断无符号数计算结果有没有溢出,若在最高有效位产生进位或借位则置为1,反之为0

2.pf位(bit 2)

主要进行奇偶校验,如果结果的最低有效字节包含偶数个数"1"则为,反之为0

3.af位(bit 4)

如果算术操作在结果的第3位发生进位或借位则将该标志置为1,反之为0

4.zf位(bit 6)

若结果为0则置为1,反之为0
与cmp或者test一起用
cmp指令相当于sub指令,但并不把数据存储到第一个里
cmp指令相当于and指令,但并不把数据存储到第一个里

5.sf位(bit 7)

有符号整数的最高有效位,为正则为0,反之为1

6.of位(bit 11)

反映有符号数加减运算结果是否溢出
即:无符号看CF,有符号看OF

7.df位(bit 10)

方向标识位控制(movs,cmps,scas,lods,stos).设置DF标志使得串指令自动递减(又高向低处理字符串),禽畜该标志则使得串指令递增
std以及cld指令分别用于设置以及清除DF标志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值