汇编指令

X86汇编5.高级指令详解

╄→尐↘猪︶ㄣ 提交于 2020-02-26 04:08:14
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 转移指令 1.转移指令分类: (1)无条件转移指令,如: jmp (2)条件转移指令 (3)循环指令,如: loop (4)过程 (5)中断 操作符 1.offset 释义:由编译器处理的符号,功能是取得标号的偏移地址 start: mov ax,offset start ;相当于mov ax, 0 s: mov ax, offset s ;相当于mov ax, 3 高级指令 1.jmp指令 释义: 无条件转移指令,可以只修改IP,也可以同时修改CS和IP。 jmp指令要给出两种信息: (1)转移的目的地址 (2)转移的距离(段时间转移、段内短转移,段内近转移) 1)依据位移进行转移的jmp指令: jmp short 标号(转到标号处执行指令) 这种指令格式的jmp指令实现的是段内转移,它对IP的修改范围是:-128 ~ 127,也就是说,它向前转移时最多128字节,向后最多127. jmp near ptr 标号,功能为:(IP)= (IP)+ 16 2)转移的目的地址在指令中的jmp指令 jmp far ptr 标号,实现段间转移,又称远转移 (CS) =

X86汇编4.基本指令详解

故事扮演 提交于 2020-02-26 03:47:57
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 数据: [bx]:eg. mov ax,[bx],表示bx寄存器中的数据作为一个偏移地址EA,段地址SA默认在D中,将SA:EA内存单元中的数据存入AX x ptr: x表示:word、byte,eg. mov word ptr ds:[0],1 start标号:指定程序运行起始地址 伪指令: 1.segment...ends伪指令 格式: XXX segment ;定义一个一个段开始,名称为XXX XXX ends ;定义一个段结尾,名称为XXX 释义:segment...ends指令对,定义一个段XXX。 2.end 释义:end是一个汇编程序结束的标志。 3.assum 释义:表示假设,它假设某一段寄存器和程序中的某一个sgment...ends定义的段相关联,上面示例assume cs:codesg就是将代码段codesg和CPU中的段寄存器cs联系起来。 4.数据定义伪指令 dw:定义数据类型,定义字型数据,如:dw 0123H, 0456H, 0789H db:定义ASCII码数据,eg. db 'unix' dd:定义双字型数据 dup:数据复制,db 3

编程之路

孤街醉人 提交于 2020-02-26 02:59:49
一、什么是编程?为什么要编程? 编程既是编程序、写代码。编写程序既是让机器替代人工作,解放人的双手 二、有哪些编程编程语言? 机器语言: 计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称为机器指令,全部机器指令的集合构成计算机的机器语言,用机器语言编程的程序称为目标程序。只有目标程序才能被计算机直接识别和执行。 汇编语言: 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作。 高级语言: 不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。 高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行 总结 机器语言 优点是最底层,速度最快,缺点是最复杂,开发效率最低 汇编语言 优点是比较底层,速度最快,缺点是复杂,开发效率最低 高级语言 编译型语言执行速度快,不依赖语言环境运行,跨平台差;开发效率低,运行速率高 解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行;开发效率高,运行速率低 来源: https://www

X86汇编1.汇编语言基础

我与影子孤独终老i 提交于 2020-02-26 02:32:25
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 1.比特、字节、字、双字 在计算机中: 1比特:1位 1字节:8位 1字:16位 ,15-8(高字节)---> 7-0(低字节) 1双字:31-16(高字)---> 15-0(低字) 2.指令和指令集 机器指令就是一列二进制数字,计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。 机器语言就是机器指令的集合。 指令一般由操作码和操作数构成,也有些指令只有操作码,没有操作数。 小端序:或叫低端字节序,内存高字节存放在高地址,内存的低字节保存在低地址 大端序:与小端序相反 指令和数据为什么要分开存放: 因为指令和数据都是二进制数,是一模一样的,即:都是一些由高低电平组和,而处理器是自动按顺序提取指令并加以执行的,在指令中混杂数据会导致处理器不能正常工作,因此,指令和数据要分开存放。存放代码的区域叫代码区,存放数据的区叫数据区,联想一下:一个二进制程序的代码段和数据段也是分开存放的。 3.汇编语言 处理器都是依靠机器指令来工作的,但是机器指令是一些没有规律的数字,编写机器指令的程序,难以书写,难以阅读,难以理解,这样就发明了汇编语言。

Linux添加自定义系统调用

Deadly 提交于 2020-02-24 06:56:07
一、 什么是系统调用 在 Linux 的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门 (gate) 陷入 (trap) 实现。系统调用就是用户空间应用程序和内核提供的服务之间的一个接口。由于服务是在内核中提供的,因此无法执行直接调用;相反,您必须使用一个进程来跨越用户空间与内核之间的界限。在特定架构中实现此功能的方法会有所不同。因此,本文将着眼于最通用的架构 —— i386 。 二、 系统调用的作用 系统调用在 Linux 系统中发挥着巨大的作用,如果没有系统调用,那么应用程序就失去了内核的支持。我们在编程时用到的很多函数,如 fork 、 open 等这些函数最终都是在系统调用里实现的,这里我们说到了两个函数,即 fork 和 exit, 这两函数都是 glibc 中的函数,但是如果我们跟踪函数的执行过程,看看 glibc 对 fork 和 exit 函数的实现就可以发现在 glibc 的实现代码里都是采用软中断的方式陷入到内核中再通过系统调用实现函数的功能的。具体过程我们在系统调用的实现过程会详细的讲到。 由此可见,系统调用是用户接口在内核中的实现,如果没有系统调用,用户就不能利用内核。 三、 系统调用的现实及调用过程 详细讲述系统调用的之前也讲一下

C语言的编译过程

柔情痞子 提交于 2020-02-23 09:22:22
C语言的编译过程 c语言的过程是:预处理->编译->汇编->链接 预处理 预处理主要是将宏定义,条件预编译指令,注释和头文件处理掉。 其中主要步骤包括: 将所有的#define删除,保留他所定义的内容; 处理条件预编辑指令,如#if,#ifed,#if,#elif,#endif 处理"#include"预编译指令,将包含文件插入到预编译指令,用递归方法进行,文件内可能包含其他文件。 删除所有注释。 添加行号和文件标识,以便编译时产生调试时使用的行号和编译错误警告行号。 保留#pragma编译指令,编译器需要使用它们。 预处理的使用: 首先创建一个名字为hello.c的文件 #include<stdio.h> int main() { printf("hello,world!\n"); return 0; } 以下代码用在Liunx系统中使用 预处理命令: gcc -E hello.c -o hello.i gcc -E -P hello.c -o hello.i 可以使用cat hello.i来查看预处理后的代码。 编译 主要作用:扫描,语法分析,语义分析,源代码优化,代码生成,目标代码优化。 编译就是通过词法分析和语法分析,在确认所有资料指令都符合语法规则之后,将其翻译成等价的中间代码或者汇编代码。 编译阶段会对代码进行优化处理,不仅涉及到编译技术本身,还涉及到机器的硬件环境

计算机基础

只愿长相守 提交于 2020-02-23 03:34:33
1、基础概念 寄存器:嵌入到CPU中的内存,也可以理解为CPU里面的存储器,一个CPU有多个寄存器; 总线:连接CPU和其它芯片的导线; 总线在物理上:是一根根导线的集合;逻辑上分为:地址总线、数据总线、控制总线 地址总线:CPU通过地址总线来指定存储单元的。根据地址总线的根数来确定最大的寻址; 数据总线:CPU与内存或其它器件的数据传送;数据总线的宽度决定了CPU和外界数据的传送速度; 控制总线:用来控制外部器件;无非就是读/写; CPU可以直接使用的信息在存储器中存放; 总结:地址总线决定CPU的寻址能力;数据总线决定一次数据传送量;控制总线决定CPU对其它器件的控制能力; 主板上有核心器件和主要器件(他们通过地址、数据、控制)总线来连接;接口卡; 存储器:(1)、读写属性分:随机存储器(RAM)、只读存储器(ROM); (2)、功能上分类:随机存储器(RAM)、装有BIOS的ROM、接口卡上的RAM; BIOS:主板、网卡、显卡、接口卡上都有的软件系统,通过这个可以对该硬件设备进行最基本的输入输出, 内存地址空间:最终运行程序的是CPU,所以用汇编编程的时候,必须要从CPU的角度来考虑问题; 计算机内部都是从0开始的; 任何的指令、命令、数据,在计算机中都为二进制; 2、CPU的内部工作原理 CPU由运算器、控制器、寄存器等组成; 8086CPU有14个寄存器:AX、BX

记我做的一道关于ida+od动静态调试的题

自闭症网瘾萝莉.ら 提交于 2020-02-23 01:29:26
这是一道打开程序会出现flag的题,但是一打开出现程序框出现乱码 首先先拖入ida里面进行静态调试。按F5查看伪代码,发现了一个重要的函数,sub401000,有一个if判断意味着如果直接跳过函数直接输出flag,flag就会是乱码。 接着我们查看汇编,看到这个loc_401096,这里有一个int3点,所以接下来我们要进行动态调试,修改程序使得程序能够经过sub401000。 将程序拖进od中,首先我们要先找到int3中断点,这时我们查看周围,发现上面有一个跳转指令会直接无视int3下面函数跳到00DB1089,这个也正是直接跳到弹窗显示乱码,我们要将它的跳转指令无法实现,这是JE指令,当ZF=0时就不会跳转,所以我们要将ZF改为0;此时我们按f7进行下一步。将int3改为nop。 这时我们发现int3下还有一个跳转指令,大意了,一不小心跳进陷阱了,直接跳转到00DB10EF。没关系,我们重新来,这时我们将00DB10A3的指令修改,修改到弹窗的地址。这时我们按f9运行。flag就出来了。 来源: CSDN 作者: inryyy 链接: https://blog.csdn.net/inryyy/article/details/104445439

恶意代码入门知识汇总

南笙酒味 提交于 2020-02-22 12:24:26
前言 该文章是 恶意代码领域入门知识 的资料汇总。 PE文件结构 PE文件结构🔗 花指令 逆向-花指令🔗 自写保护壳交流——指令的膨胀和花指令的插入🔗 一些简单的花指令的解析(含Intel指令集)🔗 16位汇编第九讲汇编指令以及逆向中的花指令🔗 壳 脱壳入门初级教学-看雪🔗 代码保护-- 几款加壳工具🔗 常见脱壳方法总结🔗 路径混淆 基于二进制代码的代码混淆研究🔗 在程序中插入新的代码 用程序在代码节空白处加代码🔗 利用pe添加节的方法添加代码实现简单的加壳🔗 反病毒攻防研究第003篇:添加节区实现代码的植入🔗 另外: 新手入门必读-看雪🔗 来源: CSDN 作者: 猫咪钓鱼 链接: https://blog.csdn.net/weixin_43655282/article/details/104439328

语言处理程序

房东的猫 提交于 2020-02-22 09:09:31
什么是语言处理程序? 它是一类系统软件的总称。还是不懂?那好吧,我们把它给拆了? 拆完后 =“ 语言 ”+“ 处理 ”+“ 程序 ” 首先。是什么类型的语言呢?是编程语言;处理即操作。程序 就不用说了吧。 这里事实上是给大家买了一个关子。简单的说语言处理程序就是:用来对编程语言进行处理的一类程序。 那么为什么要对编程语言进行操作呢?这不得不说到编程语言的 发展 了。 一、编程语言的发展 机器语言 :一開始,人类和计算机打交道用的是机器指令(机器语言),我们都知道机器指令太“简单”了,简单到仅仅剩下“ 0 ”和“ 1 ”。 汇编语言 :为了符合人类的编程思维习惯,我们開始用一些简单的。常识符号来当作指令进行编程,即汇编语言,汇编语言包括:指令语句,伪指令语句,和宏指令语句。 指令和伪指令的差别:指令进过解释后能够直接变成机器指令,而伪指令即为指令语句的运行提供服务,比如分配内存空间等操作。宏指令即批处理指令。 高级语言 :为了是编程变得简单,符合人们的理解习惯。接着发展到了第三个大阶段。高级语言阶段。这时候的编程语言层出不穷, c,c++ 。 java 等被我们熟知了。 高级语言极大的方便了编程。可是机器还是比較“简单”的,它识别不了复杂的人类社会,所以高级语言和机器之间的沟通这个时候须要有人来解决——语言处理程序。 语言处理程序的主要目的就是将汇编语言和高级编程语言翻译成机器语言