汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

简介: 作者主页:https://www.couragesteak.com/

@[TOC]

1 nop 指令

定义:不执行任何操作。

在这里插入图片描述

2 现场保护指令

2.1 push 与 pop

push:入栈。
pop:出栈
在这里插入图片描述

2.2 pushad 与 popad

定义:对寄存器的现场保护

pushad相当于如下8条指令:

push eax
push ecx
push edx
push ebx
push esp
push ebp
push esi
push edi        最顶指向

popad作用则相反

2.3 pushfd 与 popfd

定义:是对标志位进行的现场保护

在这里插入图片描述

3 内存操作

3.1 mov指令

定义:对操作数进行赋值,操作数可以是寄存器、数值、间接寻址的内存数据。

mov eax,0x1
mov dword [44907D],1
mov al,dh
mov byte [449086],0xff

3.2 movsx 与 movzx

  • movsx:带符号扩展,并传送
  • movzx:无符号扩展,并传送
movsx eax,cx

movzx eax,cx

# 8位扩展到32位
movzx eax,ax

在这里插入图片描述
在这里插入图片描述

4 lea 指令

定义:去内存地址(非数据)
(需继续研究)
在这里插入图片描述

5 xchg 指令

定义:交换指令

与内存交换

xchg eax, [449080]

与寄存器交换

mov eax,0x1
mov ecx,0x2
xchg eax,ecx

在这里插入图片描述

6 算数运算指令

6.1 add 与sub指令

add:加法指令,2个操作数相加,结果返回给第1个操作数。

mov eax,0x5
mov ecx,0x7
add eax,ecx
# 低8位+1
add al,0x1

还可以和地址相加,但是这里测试未通过
mov eax,0x1
add eax, [40190]

在这里插入图片描述

sub:减法指令,2个操作数相减,结果返回给第1个操作数。

mov eax,0x9
mov ecx,0x6
sub eax,ecx
sub ax,0x1

在这里插入图片描述

6.2 adc 与 sbb 指令

adc:与add不同的是,它需要额外加上cf进位标志位寄存器的值。

令 cf=1

mov eax,0x3
mov ecx,0x2
adc eax,ecx

结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1            

在这里插入图片描述

sbb:与sub不同的是,它需要额外减去cf进位标志寄存器的值。
令 cf=1

mov eax,0x3
mov ecx,0x2
sbb eax,ecx

结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1            

在这里插入图片描述

6.3 inc 与 dec 指令

inc:该指类似于 C语言中的 i++或者i=i+1。

mov eax,0x2
inc eax

在这里插入图片描述
deg:递减
在这里插入图片描述

6.4 cdq、mul 与 div 指令

cdq:扩展,它是将eax扩展成 edx:eax

mul:乘法指令,对操作数进行乘法运算,结果放在eax,如果溢出则扩展存放到edx。

mov eax,0x2
mov ecx,0x3
mul ecx

在这里插入图片描述
在这里插入图片描述

mov eax,0x5
mov ecx,0x3
cdq
div ecx

div:除法指令,对操作数进行除法运算,根据多少位的寄存器而不同存放的商和余数的位置也不同。
在这里插入图片描述
cl 低8位做除数,商在al存储,余数在ah存储。

mov eax,0x5
mov ecx,0x3
cdq
div cl

在这里插入图片描述

6.5 imul 与 idiv 指令

imul:也是乘法指令,却别在它有多个操作数,并且溢出直接舍去溢出的值。
操作数位3个的时候,第一个寄存器作为存储结果使用。
在这里插入图片描述
idiv:跟imul一样,有多个操作数,丢弃溢出。

6.6 xadd 与 neg 指令

xadd:互换并相加指令,结果返回第1个操作数。

mov eax,0x2
mov ecx,0x3
xadd eax,ecx

xadd eax,ecx相当于

xchg eax,ecx
add eax,ecx

在这里插入图片描述

neg:指令取反指令。

mov eax, 6
neg eax

7 位运算指令

7.1 and 与

and为逻辑 与 运算,通过位运算得出结果。

  • 相同为1,不同为0(都为0则不变)
3   0011
5   0101
    0001

mov eax,0x3
mov ecx,0x5
and eax,ecx

在这里插入图片描述

7.2 or 或

or:逻辑 或 运算,通过位运算得出结果。

只要有1,则为1;2个都为0则为0

3   0011
5   0101
---------
7   0111    

mov eax,0x3
mov ecx,0x5
or eax,ecx

在这里插入图片描述

7.3 xor 异或

xor:逻辑异或运算,通过位运算得出结果。

  • 相同为0,不同为1。
3   0011
5   0101
---------
7   0110        6h

mov eax,0x3
mov ecx,0x5
xor eax,ecx

逻辑异或

7.4 not 取反

not:逻辑取反运算,通过位运算得出结果。

  • 1则为0, 0则为1
3  0000 0000 0000 0000 0000 0000 0000 0011
---------
7  11111111111111111111111111111100

mov eax,0x3
not eax

8 比较指令

8.1 cmp 比较

cmp:比较指令,2个操作数,通常是比较2个值是否相等,影响标志位寄存器。

  • 结果为truw,zf(零标志位)为1,不同为0

与sub指令不同的是,cmp指令不存储结果。

mov eax, 0x1
mov ecx, 0x2
cmp eax,ecx

8.2 test 逻辑比较

test:比较指令,2个操作数,类似于逻辑与运算,但是结果不进行赋值,而是影响标志位寄存器,达到跳转指令的目的。

mov eax,0x0
test eax,eax            zf 为1
je 44908f                跳转

mov eax,0x2
test eax,eax            zf 为0
je 44908f                不跳转

9 跳转类指令

9.1 jmp 无条件跳转

jmp:无条件跳转,不根据标志位来改变程序逻辑。

jmp 00449087

在这里插入图片描述

9.2 je 与 jz 相等跳转

定义:je与jz根据 zf 标志位来进行跳转,

  • zf=1:跳转
  • zf=0:不跳转

注释:je与jz相同

mov eax,0x1
mov ecx,0x2
cmp eax,eax
je short 0044908F

在这里插入图片描述

9.3 jne 与 jnz 不相等跳转

定义:jne 与 jnz 根据 zf 标志位来进行跳转

  • zf=0,不相等 跳转
  • zf=1,相等 不跳转
mov eax,0x1
cmp eax,eax
jne short 0044908F

补充

jnz与je写到一起相当于无条件跳转jmp

mov eax,0x1
cmp eax,eax
jne 0044908F
je 0044908F

9.4 js 负数 跳转

定义:js如果结果为负数时,sf置1

  • sf=1 负数 跳转
  • sf=0 正数 不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx        1-2=-1
js 44908F    跳转

在这里插入图片描述

9.5 jns 正数 跳转

定义:如果比较结果为正数,SF置0

  • sf=0 正数 跳转
  • sf=1 非正数 不跳转

9.6 jp[jpe] 偶 跳转

定义:如果比较结果(二进制1的个数)为偶数时,PF置1

  • PF=1 偶数 跳转
  • PF=0 奇数 不跳转
mov eax,0x4
mov ecx,0x1
cmp eax,ecx      4-1=(3)d=(0011)o
jp 44908F        1为偶数个,跳转

9.7 jnp[jpo] 奇 跳转

定义:如果比较结果(二进制1的个数)为奇数时,PF置0

  • PF=0 奇数 跳转
  • PF=1 偶数 不跳转

9.8 jo 溢出跳转

定义:jo为溢出标志位跳转指令

  • OF=1 溢出 跳转
  • OF=0 不跳转

以32位举例如下:
最大正数:7FFFFFFF~2147483647(有符号)

mov eax,0x7FFFFFFF
add eax,0x1
jo 0044908F

在这里插入图片描述

9.9 jb 无符号 产生进位跳转

定义:比较后,如果第一个操作数 < 第2个操作数,CF置1

  • CF=1 跳转
  • CF=0 不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx        1-2,产生借位,CF=1
jb 00449091    跳转

在这里插入图片描述

9.9 jnb 未产生进位跳转

定义:2个操作数比较,第一个操作数 > 第二个操作数,CF置0

  • CF=0 跳转
  • CF=1 不跳转
mov eax,0x2
mov ecx,0x1
cmp eax,ecx        未产生借位,CF=0
jb 00449091     不跳转

9.9 jbe C和Z标志位跳转

定义:操作数1 < 操作数2 的时候,

  • CF=1或ZF=1,跳转
  • 反之,不跳转

CF:进位标志位(产生进位/错位时,CF=1)
ZF:零标志位(运算结果为0时,ZF=1)

9.9 jnbe[ja] C和Z标志位跳转

定义:操作数1 > 操作数2 的时候

  • CF=0且ZF=0,跳转
  • 只要有1,则不跳

9.10 jl 有符号 S标志位跳转

jl与jb类似的是 比较 操作数1 < 操作数2 的跳转,但主要根据SF(符号)标志位跳转。

  • SF=1,负数 跳转
  • SF=0,不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx          1-2<0  则 SF=1
jl 499091         实现跳转

10 函数call指令

类似于jmp指令,但它主要用于调用一个子程序或函数。

call 地址

retn

11 循环类指令

11.1 跳转实现

xor eax,eax
mov ecx,0x5
dec ecx
test ecx,ecx
jnz 00449087

在这里插入图片描述

11.2 loop指令

定义:根据寄存器 ECX值,递减直到为1时,不在继续循环。

xor edx,edx
mov ecx,0x5
inc edx
nop
nop
loopd 00449097

loopd:32位
loopw:16位
在这里插入图片描述

12 寻址方式

12.1 直接寻址

根据直接看到的指令干的什么,就是直接寻址

push 0x123456
mov eax,0x2
inc eax
dec ebx
mov ecx,0x3
add eax,0x5
push eax

12.2 间接寻址

肉眼看的话,不知道结果,通过CPU运行到此处,才能得出结果

在这里插入图片描述

参考地址:
https://www.bilibili.com/video/BV135411u7HR

相关文章
|
21天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
104 9
|
12天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
21 1
|
15天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
18天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
20天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
46 4
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
24天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
初步认识栈和队列
初步认识栈和队列
61 10
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
20 1
|
1月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
48 3