汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式
文章目录
- 1 nop 指令
- 2 现场保护指令
- 2.1 push 与 pop
- 2.2 pushad 与 popad
- 2.3 pushfd 与 popfd
- 3 内存操作
- 3.1 mov指令
- 3.2 movsx 与 movzx
- 4 lea 指令
- 5 xchg 指令
- 6 算数运算指令
- 6.1 add 与sub指令
- 6.2 adc 与 sbb 指令
- 6.3 inc 与 dec 指令
- 6.4 cdq、mul 与 div 指令
- 6.5 imul 与 idiv 指令
- 6.6 xadd 与 neg 指令
- 7 位运算指令
- 7.1 and 与
- 7.2 or 或
- 7.3 xor 异或
- 7.4 not 取反
- 8 比较指令
- 8.1 cmp 比较
- 8.2 test 逻辑比较
- 9 跳转类指令
- 9.1 jmp 无条件跳转
- 9.2 je 与 jz 相等跳转
- 9.3 jne 与 jnz 不相等跳转
- 9.4 js 负数 跳转
- 9.5 jns 正数 跳转
- 9.6 jp[jpe] 偶 跳转
- 9.7 jnp[jpo] 奇 跳转
- 9.8 jo 溢出跳转
- 9.9 jb 无符号 产生进位跳转
- 9.9 jnb 未产生进位跳转
- 9.9 jbe C和Z标志位跳转
- 9.9 jnbe[ja] C和Z标志位跳转
- 9.10 jl 有符号 S标志位跳转
- 10 函数call指令
- 11 循环类指令
- 11.1 跳转实现
- 11.2 loop指令
- 12 寻址方式
- 12.1 直接寻址
- 12.2 间接寻址
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,cxmovzx 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 01010001mov 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 6hmov 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 11111111111111111111111111111100mov 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写到一起相当于无条件跳转jmpmov 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
汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式相关推荐
- 常用技巧 —— 位运算 —— 位运算基础
[与运算] 与运算常用于二进制的取位操作,其用符号 & 表示,相同位的两个数字都为1,则为1,若有一个不为1,则为0. 例如:00101 & 11100 = 00100 其会将两个十进 ...
- Home_W的位运算(位运算+预处理)
Home_W的位运算1 题目链接: 传送门解题思路:这题有两种解题思路,一种就是\(n^2\times m\)的时间复杂度,还有一种就是经过预处理的时间复杂度为\(n^2\)的方法,先说第一种,大家直 ...
- linux寄存器位运算,位运算的一些操作
最近在做一些嵌入式软件相关的工作,经常涉及到对于FPGA寄存器的相关操作.而对于寄存器的操作,软件这边通常是把数据进行组装为一个固定位宽(8bit, 16bit)的数通过localbus总线写到寄存器 ...
- 位运算 - 位运算基本操作
package com.bitOperation;/*** java的整数是有符号的,二进制表示的时候,第一位是符号位* 其范围是 -2^31 ~ 2^31-1** Java的设计,负数在内存中存储的 ...
- 位运算 位运算应用
本页目录 位运算分为2个大类 位于 &(一0则0) 位或| (双0则0) 异或 ^(互异则1) 利用异或可实现一个小面试题,如何不添加变量,实现数据的替换 按位取反 ~ 左移 << ...
- 常用技巧 —— 位运算 —— 位运算的应用
1.lowbit:计算一个数字 x 二进制下最低位 1 对应的值 方法: int lowbit(int x){return x&(-x); } lowbit 利用了补码的特性:正数的补码是其自 ...
- java 减法 位运算,位运算-实现加减乘除
基本性质:1:~n=-(n+1),比如:~3=-4 2:获取整数n的二进制串中最后一个1:-n&n=~(n-1)&n 3:去掉整数n的二进制串中最后一个1:n&(n-1) 加法 ...
- [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习
作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...
- 算法笔记(一)位运算、二分、基本递归、排序、基本数据结构
文章目录 位运算 原码.补码与反码 左移右移`<<` & `>>` 无符号右移 异或运算`^` 位运算常用技巧 取相反数 反转0-1 判断负数与非负数 数组交换两元素位 ...
最新文章
- 源码推荐:基于uni-app前端框架,开源版本还开源免费商用
- C++ MFC常用函数(转)
- Vue——[Props with type Object/Array must use a factory function to return the default value.]解决方案
- 实验:sigsuspend(),sigprocmask()
- 由衷的信来激励有抱负的开发人员
- LeetCode 1453. 圆形靶内的最大飞镖数量(几何题)
- 2021-09-26 关于打开Ubuntu的main universe restricted
- java 时间戳_Java并发编程之CAS三CAS的缺点 及解决办法
- matlab兔子繁殖问题,斐波那契数列在《疯狂动物城》兔子繁衍中的应用
- Bailian4019 黑色星期五【模拟】
- OpenRefine使用教程
- Extjs EditorGridPanel
- 高德地图按行政区描边
- Mysql 带条件计数
- [算法总结] LCA倍增法 dfs
- 做人必须留的几张底牌
- 计算机u盘序列号,win10-u盘序列号cmd怎么查
- 线段树开4N空间证明
- java gc 有钱人_小猿圈java之GC垃圾回收机制
- 1455B.Jumps