内容更新是由低向高递增的

内容如下:
xor rax, rax #xor rax,rax是对rax的清零运算操作

条件跳转(一般配合cmp使用)

下表展示了基于零标志位、进位标志位、溢出标志位、奇偶标志位和符号标志位的跳转。


此表为1) 相等性的比较

  1. 无符号数比较
    基于无符号数比较的跳转如下表所示。操作数的名称反映了表达式里操作数的顺序(比如 leftOp < rightOp)。下表里的跳转仅在比较无符号数值时才有意义。有符号操作数使用不同的跳转指令。
  2. 有符号数比较
    下表列岀了基于有符号数比较的跳转。下面的指令序列展示了两个有符号数值的比较:

一、运算结果标志位

1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果里“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程里,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统里,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

二、状态控制标志位

状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能令之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步停断请求。这类方式主要用于程序的调试。
指令系统里没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

2、停断允许标志IF(Interrupt-enable Flag)

3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
在串处理指令李控制信息的方向
标志位操作指令
标志位操作指令是一组对标志位置位、复位、保存和恢复等操作的指令。
1、进位CF操作指令
清进位指令CLC(Clear Carry Flag):CF←0
置进位指令STC(Set Carry Flag):CF←1
进位取反指令CMC(Complement Carry Flag):CF←not CF

2、方向位DF操作指令
清方向位指令CLD(Clear Direction Flag):DF←0
置方向位指令STD(Set Direction Flag):DF←1

3、停断允许位IF操作指令
清停断允许位指令CLI(Clear Interrupt Flag):IF←0
其功能是不允许可屏蔽的外部停断来停断其后程序段的执行。
置停断允许位指令STI(Set Interrupt Flag):IF←1
其功能是恢复可屏蔽的外部停断的停断响应功能,通常是与CLI成对使用的。

4、取标志位操作指令
LAHF(Load AH from Flags):AH←Flags的低8位
SAHF(Store AH in Flags):Flags的低8位←AH

5、标志位堆栈操作指令
PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位标志寄存器进栈;
POPF/POPFD(Pop Flags off Stack):把16位/32位标志寄存器出栈;

######################################################################
######################################################################
pushad: 将所有的32位通用寄存器压入堆栈
pusha:将所有的16位通用寄存器压入堆栈
pushfd:然后将32位标志寄存器EFLAGS压入堆栈
pushf::将的16位标志寄存器EFLAGS压入堆栈
popad:将所有的32位通用寄存器取出堆栈
popa:将所有的16位通用寄存器取出堆栈
popfd:将32位标志寄存器EFLAGS取出堆栈
popf:将16位标志寄存器EFLAGS取出堆栈
######################################################################
######################################################################
cpuid:获取CPU信息
######################################################################
######################################################################
SBB(带借位减法)指令从目的操作数里减去源操作数和进位标志位的值。
下面的示例代码用 32 位操作数实现 64 位减法,EDX:EAX 的值为 0000 0007 0000 0001h,从该值里减去 2。低 32 位先执行减法,并设置进位标志位,然后高 32 位再进行包括进位标志位的减法:

SHL是逻辑左移指令,SHR是逻辑右移指令
SAL是算术左移指令(shift arithmetic right),SAR是算术右移指令(shift arithmetic right)
######################################################################
######################################################################
leave指令将EBP寄存器的内容复制到ESP寄存器里
以释放分配给该过程的所有堆栈空间。然后,它从堆栈恢复EBP寄存器的旧值。
在16位汇编下相当于:
mov sp,bp
pop bp

在32位汇编下相当于:
mov esp,ebp;//将ebp指向(ebp内部应当保存一个地址,所谓指向即这个地址对应的空间)的值赋给esp
pop ebp
#################################################################################################################
Lea eax,dword ptr ss:[esp+0x2c]
Cmp eax,dword ptr ss:[ebp-0x30]
ptr – pointer (既指针)得缩写。
汇编里面 ptr 是规定的字(既保留字),是用来临时指定类型的。
(可以理解为,ptr是临时的类型转换,相当于C语言里的强制类型转换)

汇编语言CS,DS,SS还有一个ES定义如下:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。
一、寄存器位置不同:
1、CS:代码段寄存器;
2、DS:数据段寄存器;
3、SS:堆栈段寄存器。
二、存放位置不同:
1、代码段寄存器CS:存放当前正在运行的程序代码所在段的段基值。
2、数据段寄存器DS:存放数据段的段基值。
3、堆栈段寄存器SS:存放堆栈段的段基值。
三、段地址不同:
1、cs代码段地址,联合ip作为cpu指向当前正在执行的那条指令所使用,不能随意修改它。
2、ss堆栈度段地址问联合sp定义一个答堆栈,一旦你确定了堆栈地址,ss也不能随便改变了。
3、ds数据段地址定义一个数据段。
#################################################################################################################
byte:8位无符号整数,b表字节
sbyte:8位有符号整数,s表有符号
word:16位无符号整数
sword:16位有符号整数
dword:32位无符号整数,d表双字
sdword:32位有符号整数,sd表有符号双字
qword:64位整数,q表四字
tbyte:80位(10字节)整数,t表10字节
伪指令
DB:8位整数
DW:16位整数
DD:32位整数或实数
DQ:64位整数或实数
DT:定义80位(10字节)整数
#################################################################################################################
入栈和出栈的汇编指令 push、pop 地址从高到低
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈 有push就就要有pop
PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2;操作数是 32 位的,则 ESP 减 4;操作数是 64 位的,则 ESP 减 8。
POP 指令首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数里,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4,如果操作数是 64 位的,ESP 加 8。

标志寄存器传送指令
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈

call:过程调用,调用一个过程(即函数或者子程序)
ret:过程返回,返回指令,RET(从过程返回)指令将处理器转到该过程被调用的程序点上。call指令将其返回地址压入堆栈,再把被调用过程的地址复制到指令寄存器。当过程准备返回时,它的ret指令从堆栈把返回地址弹回到指令寄存器。
#################################################################################################################
算术指令:
mul(multiply) 乘法指令,两个数值相乘
div 除法指令
divr 除法指令
imul eax,ebx,5 imul指令有3个操作数,第1个为目的操作数,第2个和第3个为进行乘法的源操作数
add:两个数值相加 add ax,8 将寄存器AX里的数值加上8
sub(subtraction):从一个数值减去另一个数值 sub ax,18将寄存器AX里的数值减去18
subr:减法指令
xor:异或
OR :在两个操作数的对应位之间进行(按位)逻辑或(OR)操作,并将结果存放在目标操作数里:OR destination, source
and是按位“与”操作,在两个操作数的对应位之间进行(按位)逻辑与(and)操作,并将结果存放在目标操作数里:AND destination,source。当且仅当两操作数对应位都为“1”时结果的相应位为“1”,否则结果相应位为“0”。例:1101B AND 0100B = 0100B
inc(increase)指令表示寄存器或者内存操作数加1
dec(decrease)指令表示寄存器或者内存操作数减1
neg(negate反面,对立面,非)指令通过把操作数转换为其二进制补码,将操作数的符号取反

cmp(compare):比较指令,进行比较两个操作数的大小,cmp执行从目的操作数里减去源操作数的隐含减法操作,并且不修改任何操作数:CMP destination,source
标志位
当实际的减法发生时,CMP 指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。
如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如右表所示:

如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如右表所示:

mov(move):传送(分配)数值 mov ax,18 将18送入寄存器AX
mov ax ,bx 将寄存器BX数据送入寄存器AX
当指令有多个操作数,第一个操作数为目的操作数,第2个操作数为源操作数
movzx指令(进行全零并传送)将源操作数复制到目的操作数,并把目的操作数0扩展到16位或者32位。这条指令只用于无符号正数
movsx指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号0扩展到16位或者32位。这条指令只用于有符号正数

loop:循环指令,正式成为按照ECX计数器循环,将程序块重复特定次数。ECX自动成为计数器,每循环一次计数值减1

xchg(交换数据,exchange)指令交换两个操作数内容

lea(Load effective address)取有效地址,也就是取偏移地址。

nop 空指令
############################################################################################################################################
需要注意的是32位是由栈来传参的,64位前六个参数由寄存器RDI、RSI、RDX、RCX、R8、R9依次传参,超过第六个的参数由栈来传参
8位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL
16位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BP
32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP

32位 16位 8位(高) 8位(低)
EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL

其他通用寄存器只能利用32或者16位名称为访问:
32位 16位
ESI SI
EDI DI
EBP BP
ESP SP

寄存器
EAX:累加(Accumulator)寄存器,常用于函数返回值
EBX:基址(Base)寄存器,以它为基址访问内存
ECX:计数器(Counter)寄存器,常用作字符串和循环操作里的计数器
EDX:数据(Data)寄存器,常用于乘除法和I/O指针
ESI:源变址寄存器
EDI:目的变址寄存器
ESP:堆栈(Stack)指针(Pointer)寄存器,指向堆栈顶部
EBP:基址(Base)指针(Pointer)寄存器,指向当前堆栈底部
EIP:指令寄存器,指向下一条指令的地址

基本程序执行寄存器
寄存器为直接位于CPU内的高速存储位置
8个通用寄存器,6个段寄存器,一个处理器状态寄存器(EFLAGS),和一个指令指针寄存器(EIP)。(指令寄存器:Instruction pointer register)
通用寄存器:主要用于算术运算和数据传输。EAX寄存器的低16位在利用过程可用AX表示,AX寄存器的高8位被称为AH,低8位被称为AL。同样的关系也存在于EAX,EBX,ECX,EDX寄存器

乘除指令默认利用EAX。它常常被称为扩展累加器(extended accumulator)寄存器
CPU默认利用ECX为循环计数器(circulate)

ESP用于寻址堆栈(一类系统内存结构)数据。它极少用于一般算术运算和数据传输,通常被称为扩展堆栈指针(extended stack pointer)寄存器

ESI和EDI用于高速存储器传输指令,有时也被称为扩展源地址寄存器(extended source index)和扩展目的地址寄存器(extended destination index)

高级语言通过EBP来引用堆栈里的函数参数和局部变量。除了高级编程,它不用于一般算术运算和数据传输。它常常被称为扩展帧指针(extended frame pointer)寄存器

EBP和ESP作为指针的寄存器,常用于椎栈操作。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量,EBP指向栈低,ESP指向栈顶。

指令指针:指令指针(EIP)寄存器里包含下一条将要执行指令的地址。某些机器指令能控制EIP,令程序分支转向到一个新位置。

EFLAGS寄存器:EFLAGS(或者Flags)寄存器包含了独立的二进制位,用于控制CPU的操作,或者是反应一些CPU操作的结果。有些指令可以测试和控制这些单独的处理器标志位。
32位标志寄存器 EFLAGS
用于标识当前的一些状态
CF:进位标志
OF:溢出标志
SF:符号标志
ZF:零标志
AC:辅助进位标志
PF:奇偶标志

CTF-汇编语言归纳相关推荐

  1. CTF隐写常见套路归纳

    杂项 1文件操作与隐写 2图片隐写术 3压缩文件处理 4流量取证技术 文件操作与隐写 文件类型识别 1.File命令(linux下) 使用:不知道后缀名,无法打开文件. file 文件名 2.winh ...

  2. 记首次参加网络安全比赛(初赛-知识竞赛,决赛-CTF夺旗赛-解题模式)

    网络安全相关的方向很多,几乎IT相关的安全内容都可以涵盖在内.笔者本身的知识体系更偏向于编程语言和Web应用,本次参赛可谓极具挑战,但是就是喜欢这种感觉:) 赛程安排 9月16日接到通知 9月26日初 ...

  3. AM335X的汇编语言与c语言,X86汇编语言学习手记 -- 汇编和C协同

    X86汇编语言学习手记(3) 2004年12月 在X86汇编语言学习手记(1)(2)中,可以看到栈(Stack)作为进程执行过程中数据的临时存储区域,通常包含如下几类数据: 局部变量 函数调用的返回地 ...

  4. 计算机组成原理考试知识点总结,最新2018计算机组成原理期末复习考试知识点复习考点归纳总结总结...

    电大计算机组成原理期末复习考试考点 归纳总结 科学研究和工程技术计算是计算机最早的领域. 信息处理是计算机应用的最广泛的领域. 计算机系统分为硬件和软件两大部分.硬件是实体部件,是看得见摸得着的.软件 ...

  5. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  6. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  7. C语言与汇编语言的区别

    源地址:C语言与汇编语言的区别 EDN电子技术设计 EDN电子技术设计 微信号 edn-china 功能介绍 EDN China电子技术设计为电子设计工程师和设计经理人提供前沿深度的电子资讯.设计实例 ...

  8. 【网络安全】从零开始的CTF生活

    1.CTF是什么? CTF(Capture The Flag,夺旗赛)起源于 1996 年 DEFCON 全球黑客大会,是网络安全爱好者之间的竞技游戏. 2.比赛怎么打? 1.解题模式: 与ACM编程 ...

  9. CTF PWN-攻防世界XCTF新手区WriteUp

    文章目录 前言 PWN基础 1.1 x86 汇编 1.2 ELF 文件 1.3 延迟绑定 1.4 linux防护 1.5 ROP编程 1.6 Pwntools XCTF-Pwn 2.1 get_she ...

  10. CTF比赛(详细介绍)

    CTF(Capture The Flag,夺旗赛)起源于 1996 年 DEFCON 全球黑客大会,是网络安全爱好者之间的竞技游戏. CTF竞赛模式具体分为以下三类: 一.解题模式(Jeopardy) ...

最新文章

  1. 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image
  2. Web安全之命令执行漏洞
  3. Java自动部署maven_Maven+Tomcat8 实现自动化部署的方法
  4. 12c oracle 修改内存_Oracle Database 12c In-Memory(内存数据库) 基本原理与简介
  5. C++内存和进程,线程学习补充(内存泄漏,信号量)
  6. 「专题训练」k-Tree(CodeForces Round #247 Div.2 C)
  7. 【转】字符串编辑距离
  8. Navicat Premium 注册机 激活报错
  9. 安卓加密软件_U盘或者文件夹加密
  10. 目标检测(Object Detection)
  11. 去除加粗的css,css如何取消加粗
  12. HTML如何长截图谷歌,『技巧』如何利用Chrome进行网页长截图
  13. PDF文件中失效链接修改
  14. 计算机键盘无法使用怎么处理,为什么键盘不能用 键盘不能用怎么办
  15. 【CF802O】April Fools‘ Problem (hard)(wqs二分,模拟费用流,老鼠进洞)
  16. 布袋除尘器过滤风速多少_布袋除尘器过滤风速的确定标准是什么?
  17. Java/Kotlin 最多保留两位小数处理方法
  18. 航空公司客户画像和客户价值分析
  19. 在word中插入较为清晰的CAD框线图方法
  20. 基于JWT规范实现的认证微服务

热门文章

  1. 云效Codeup代码评审中的代码协同
  2. 小红书推荐大数据在阿里云上的实践
  3. 阿里宜搭发布专有云版本,基于云原生的应用构建PaaS平台
  4. 玩转运维编排服务的权限:Assume Role+Pass Role
  5. PostgreSQL PostGIS 的5种空间距离排序(knn)算法
  6. 助力全站WebP ,阿里云云上FPGA 团队发布 WebP图片解决方案
  7. 创业 4 年获近 7000 万美元融资,53 岁老程序员 all in 开源
  8. mysql行转列函数_一个小知识点-Hive行转列实现Pivot
  9. 服务器 独立显卡 显示不出来,dell服务器R720+独立显卡GTX1650,进不去系统,UEIF报错...
  10. mysql锁表更新_Mysql InnoDB 数据更新导致锁表