汇编语言学习笔记

1、NOP指令:号称最安全的指令,全名为no Operation,一条nop指令占用一个字节,什么也不做。有时编译器会使用该指令将代码对齐到偶数地址边界(类似于内存对齐)。IA-32处理器从偶数双字地址处加载代码和数据时会更快

2、变量名仅仅只是对数据段内偏移地址的引用, 类似于mov eax, [变量名称]的汇编指令中,方括号暗示了要进行寻址操作,但是许多程序(包括微软的程序)在通常情况下都不使用方括号,除了lea指令外

3、mov指令:

        指令格式: mov destination, source

        运行后的效果:目的操作数的内容改变成源操作数的内容,源操作数内容不变;等价于C++中的赋值操作:destination  = source

        mov指令的限制:1)两个操作数的尺寸必须一致;2)两个操作数不能同时为内存操作数,需要借助通用寄存器中转:先将源操作数移入一个通用寄存器中,再将通用寄存器的内容移到目目的内存位置;3)目的操作数不能为CS,EIP和IP;4)立即数不能直接送到段寄存器上,需要借助通用寄存器中转(如:mov eax, 立即数; mov ss, eax)

4、movzx指令:零扩展传送,该指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或者32为,此指令仅适用于无符号数整数;

5、movsx指令:符号扩展传送,该指令将源操作数的内容复制到目的操作数中并将该值进行符号扩招至16位或者32位;

 6、LAHF指令(load status flag into AH):该指令将EFLAGS寄存器的低字节复制到AH寄存器,被复制的内容包括:符号标志位、零标志位、奇偶标志位和进位标志位。使用该指令可以方便的将标志值保存在变量中;

7、SAHF指令(store AH into status flag):该指令复制AH的值至EFLAGS寄存器的低字节;

8、XCHG指令(exchange data):该指令交换两个操作数的内容,注意它不接受立即操作数,除此之外,XCHG指令的操作数与MOV指令的操作数遵循同样的规则;

9、直接偏移操作数:在变量名称后面加上一个偏移值(单位为字节),可以创建直接偏移操作数,这个操作数可用于访问没有显示标号的内存地址。通过在变量的偏移地址后面加上一个常数得到的表达式被称为有效地址。有效地址以方括号括起来时就表示要对方括号内的表达式进行寻址以获取该有效地址处内存的内容(LEA指令除外)

10、INC和DEC指令:操作数自增(加1)或者自减(减1)

11、ADD/SUB指令:将同尺寸的源操作数和目的操作数相加或者相减,格式为:

        ADD/SUB 目的操作数 源操作数

        加减法操作数并不改变源操作数,相加/减的结果存储在目的操作数中。ADD指令会根据目的操作数的结果相应修改进位标志、零标志、符号标志、溢出标志和奇偶标志。SUB指令会根据目的操作数的结果相应修改进位标志、零标志、符号标志、溢出标志、辅助进位标志和奇偶标志等。

状态标志的简要描述:

        进位标志位CF:用于表示无符号整数运算是否发生了溢出

        溢出标志位OF:用于表示有符号整数运算是否发生了溢出,分为上溢和下溢

        零标志位ZF:用于表示运算结果是否为0

        符号标志位SF:用于表示运算结果是否为负数(负数的二进制表示中,符号位为1),如果运算结果的最高有效位被置位,那么符号标志就会置位

        奇偶标志位PF:用于表示目的操作数的最低有效字节内1的个数是否为偶数

        辅助进位标志位AC:在运算结果(存储于目的操作数中)的最低位有效字节的第3位向第4位的进位值

12、NEG指令(negate):该指令通过将数字转换为相应的补码而求得其相反数(正数的原码、反码和补码相同,负数的反码=除符号位外,原码按位取反,负数的补码=负数的反码+1);

13、PTR操作符:可以使用该操作符来重载操作数生命的默认尺寸,这在试图以不同于变量声明时所使用的尺寸属性来访问变量的时候很有用(简单来说,就是高级语言中的类型强转), PTR必须和汇编器的标准数据类型(如BYTE, WORD,DWORD等)联合使用

间接寻址:在处理数组时完全直接使用直接寻址是不现实的,不大可能为数组的每一个元素都提供一个不同的标号,也不大可能使用非常多的常量偏移去寻址数组的各个元素。处理数组的唯一可行的方法是使用寄存器作为指针并操作寄存器的值,这被称为间接寻址,操作数使用简介寻址时就称为简介操作数。在保护模式下,间接操作数可以是任何用方括号括起来的任意的32位通用寄存器(EAX、EBX等),寄存器里面存放着数据的偏移。在实地址模式下,使用16位的寄存器存放变量的偏移地址,如果要使用寄存器做间接操作数的话,只能使用SI,DI,DX或者BP寄存器。通常应当尽量避免使用BP,因为BP经常用来寻址堆栈而不是数据段

变址操作数:把常量和寄存器相加以得到一个有效地址,任何32位通用寄存器都可以作为变址寄存器,变址操作数常用形式:mov eax, [esi+4]

14、JMP指令:无条件跳转指令,通常情况下只能跳转到当前过程内的标号处

15、LOOP指令:用于重复执行一块语句,执行的次数是特定的,ECX被自动用作计数器,在每次循环之后减1。LOOP指令的执行包含两部:首先ECX减1,接着与0比较,如果ECX不等0,则跳转到目的地址(标号)处,如果ECX等于0,则不发生跳转,这时控制权将转移到紧跟在LOOP后面的指令处。LOOPD指令总是使用ECX作为循环计数器,而LOOPW总是使用CX作为循环计数器。

16、操作数类型:

        直接操作数:也就是变量的名字,代表了变量的地址。

        直接偏移操作数:在变量的名字后面加一个偏移量而生成新的偏移,这个新偏移可以用来访问内存数据。

        间接操作数:是用方括号括起来的包含数据地址的寄存器,如[esi],程序可以根据该地址寻址并返回内存数据。

        变址操作数:把常量和间接操作数结合在一起,常量和寄存器值加在一起,得到最终的结果被用来寻址,例如[arr+esi], [arr+es*8]等

17、运行时堆栈,也称为堆栈:使用两个寄存器SS和ESP,保护模式下,SS寄存器存放的就是段选择子,用户模式程序不应该对其进行修改。ESP寄存器存放的是指向堆栈内特定位置为的一个32为偏移值。我们很少需要直接操纵ESP的值,相反,ESP寄存器的值通常是由CALL、RET、PUSH和POP等指令间接修改的。ESP指向的是是最后压入(添加)到堆栈上的数据。此处的堆栈与数据结构中的数据类型堆栈(堆栈抽象数据类型)是不同的。此处的运行时堆栈在系统层上(由硬件直接实现)处理子过程调用;堆栈抽象数据类型通常用于实现于后进先出操作的算法,一般使用高级语言如C++等编写。运行时堆栈有以下几种重要的用途:1)寄存器在做多种用途的时候,堆栈可以方便地作为其临时保存区域,在寄存器使用完毕之后,可以通过堆栈恢复其原始值。2)CALL指令执行的时候,CPU使用堆栈保存当前被调用过程(即函数)的返回地址。3)调用函数的时候,可以通过压栈传递参数。4)函数内的局部变量在堆栈上创建,函数返回时,这些变量被丢弃。

运行时堆栈是一个特殊数组,是一个用于存放寄存地址和数据的临时区域,这个堆栈常用于保存返回地址、函数参数、局部变量以及函数内部使用的寄存器。

18、PUSH指令:该指令首先减少ESP 的值,然后再把一个16位或者32位的源操作数复制到堆栈上。

19、POP指令:首先将ESP所指向的堆栈元素复制到16位或者32位的目的操作数中,然后增加ESP的值。

20、PUSHFD和POPFD指令:前者在堆栈上压入32位的EFLAGS寄存器的值,POPFD指令将在堆栈顶部的值弹出并发送到EFLAGS寄存器。注意MOV指令不能复制标志寄存器的值到变量或者寄存器中,因此PUSHFD指令可能就是保存标志寄存器的最佳方式了。

21、PUSHAD和POPAD指令:PUSHAD指令在堆栈上按照如下顺序压入所有的32位通用寄存器:EAX、ECX、EDX、EBX、ESP(执行PUSHAD指令之前的值)、EBP、ESI和EDI;POPAD指令以相反顺序从堆栈中弹出这些通用寄存器。如果代码中修改了很多32位寄存器,那么可以在函数的开始和结束分别调用PUSHAD和POPAD指令保存和恢复寄存器的值

22、CALL指令和RET指令:CALL指令先将返回地址(当前CALL指令的下一条指令的地址)压入堆栈(ESP会减4)并把被调用函数的地址复制到指令指针寄存器EIP中。当程序返回时,RET指令从堆栈中弹出返回地址(此时ESP会加4)并送到指令指针寄存器EIP中。32位模式下,CPU总是EIP所指向的内存地址处的指令,16模式下,CPU总是执行IP寄存器所指向的指令。

23AND指令:对目的操作数和源操作数进行布尔位与操作并将执行结果存放在目的操作数中,ADD指令总是会清除溢出标志和进位标志,并根据目的操作数中的值修改符号标志、零标志和奇偶标志

24、OR指令:在每对操作数的对应数据位之间进行布尔或操作并将执行结果存放于目的操作数中。OR指令总是清除溢出标志和进位标志,并根据目的操作数的值修改符号标志、零标志和奇偶标志。

25、XOR指令:该指令在目的操作数和源操作数之间执行按位异或操作,并肩执行结果存放与目的操作数中。

26、NOT指令:NOT指令对一个操作数的所有数据位取反,得到的结果称为操作数的反码,NOT指令不影响任何状态标志

27、TEST指令:TEST指令对目的操作数和源操作数进行按位与操作并设置相应的标志位,和AND指令的唯一区别在于,TEST指令不修改目的操作数。

28、CMP指令:该指令在源操作数和目的操作数执行隐含的减法操作,两个操作数都不会被修改。CMP指令对标志位的影响如下:假想减法操作完成之后,CMP指令会根据运算结果修改溢出标志位、符号标志位、零标志位、进位标志位、辅助进位标志位和奇偶标志的值。

在IA-32逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简单介绍下Beego框架】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台,还是最近的“滴滴被安全审查”事件,我们听得最多的一个词,就是“等保。” 只要你接触安全类工作,听得最多的一个词,一定是“等保。” 那么,到底什么是“等保”呢…

c++初阶——类和对象(上)

大家好我是小锋今天我们来学习类和对象 面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对…

NASM中的-f选项

2024年4月19日,周五下午 -f选项 在 NASM 中,-f 选项用于指定输出格式或目标文件格式。这个选项允许你告诉 NASM 将汇编代码编译成特定格式的目标文件,以便与特定的操作系统或环境兼容。下面是 -f 选项的一些常见用法和参数: -f …

✌粤嵌—2024/4/11—合并区间✌

代码实现: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/// 交换 void swap(i…

“开关是灯的日出日落,日出日落是灯的开关”

C语言刷题 day01 本篇是C语言刷题大杂烩,收集了笔者遇到的认为有价值的题目,本篇会持续更新~~ day01 至少是其他数字两倍的最大数 题目原文: 题意解析: 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 …

【汇智知了堂来袭】西华师范大学鸿蒙专题讲座,共探HarmonyOS新机遇!

在这个信息化的时代,我们身处一个日新月异、科技飞速发展的世界。随着信创国产化的步伐加快,万物互联的大时代已经悄然开启。作为科技前沿的探索者,汇智知了堂始终站在行业的前沿,紧跟时代的发展脉搏。我们在4月9日走进西华师范大…

5. Django 探究CBV视图

5. 探究CBV视图 Web开发是一项无聊而且单调的工作, 特别是在视图功能编写方面更为显著. 为了减少这种痛苦, Django植入了视图类这一功能, 该功能封装了视图开发常用的代码, 无须编写大量代码即可快速完成数据视图的开发, 这种以类的形式实现响应与请求处理称为CBV(Class Base…

第一届AI Agent智能体现场开发大赛报名开启!8月上旬火热开赛~

由联想拯救者、AIGC开放社区、英特尔携手主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”已经正式启动,“2024 AI Agent极限挑战赛”作为特设专项赛道,也将同步于8月上旬开赛,参赛者将在更加紧张刺激的现场比赛中展现其技术与创造力。…

TypeScript 基础:接口、泛型和自定义类型在 Vue 3 中的应用

接口(Interfaces) 首先,我们定义一个接口 PersonInter 来描述一个人的信息,包括 id、name 和 age。 interface PersonInter {id: string;name: string;age: number; }自定义类型(Custom Types) 然后&…

如何在Windows 10中启用和使用上帝模式,这里有详细步骤

序言 上帝模式(God Mode)是一个特殊的文件夹,只在一个窗口中显示所有可用的操作设置。它可以节省搜索命令的时间,而无需知道通过“开始”菜单或“控制面板”查找命令的步骤。上帝模式默认情况下是隐藏的,所以我们需要…

世界500强:破解“智慧核能”数智化成功转型密码

近日,实在智能携手中国核能行业协会信息化专业委员会在中国人工智能小镇成功举办“基于大模型的RPA数字员工在核能行业实战应用案例专项培训”,中国核工业集团、中国广核集团、国家电力投资集团等企事业单位共同参加。中核集团作为我国核科技工业的主体&…

C++修炼之路之继承<二>

目录 一:子类的六大默认成员函数 二:继承与友元 三:继承与静态成员 四:复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

javaagent使用

Java Agent是什么? Java Agent是Java平台提供的一个强大工具,它可以在运行时修改或增强Java应用程序的行为。是在JDK1.5以后引入的,它能够在不影响正常编译的情况下修改字节码,相当于是在main方法执行之前的拦截器,也叫…

启明云端ESP32-S3+车载桥接器案例,能实现对车载产品集控

最近房车旅行很盛行,谁不想五一自驾游开车去外面玩?为了能提升用户体验,车企房车智能化升级越来越普遍,接下来小启给大家讲一个案例,启明云端ESP32-S3车载桥接器,感兴趣的可以看看。 一、ESP32-S3车载桥接器…

实验:使用FTP+yum实现自制yum仓库

实验准备 FTP服务器端:centos-1(IP:10.9.25.33) 客户端:centos-2 两台机器保证网络畅通,原yum仓库可用,已关闭防火墙和selinux FTP服务器端 ①安装vsftpd并运行,设定开机自启动 安装vsftpd…

免费ssl通配符证书申请教程

在互联网安全日益受到重视的今天,启用HTTPS已经成为网站运营的基本要求。它不仅保障用户数据传输的安全,提升搜索引擎排名,还能增强用户对网站的信任。通配符证书是一种SSL/TLS证书,用于同时保护一个域名及其所有下一级子域名的安…

​面试经典150题——对称二叉树

1. 题目描述 2. 题目分析与解析 2.1 思路一——递归 为了解决问题“检查一个二叉树是否是对称的”,我们需要判断树的左子树和右子树是否是彼此的镜像。这意味着树的左子树的左侧应该与右子树的右侧相同,左子树的右侧应该与右子树的左侧相同。 定义问题…

数字工厂管理系统的应用场景主要有哪些

随着信息技术的飞速发展,数字工厂管理系统逐渐成为了工业制造领域的一大亮点。这一系统集成了物联网、大数据、云计算、人工智能等先进技术,实现了对工厂生产流程的智能化、高效化管理。那么,数字工厂管理系统究竟在哪些应用场景中发挥着重要…

Unity 3D定点数物理引擎实战系列:BEPU物理引擎碰撞计算与碰撞规则的架构与设计

前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时,如何灵活的控制物理碰撞,本节給大家详细的讲解BEPUphysicsint 物理引擎内部是如何管理与控制碰撞规则的。本文主要讲解3个…
最新文章