反汇编语言常用指令
16位与32位汇编语言常用指令总结
![16位与32位汇编语言常用指令总结](https://img.taocdn.com/s3/m/49ee1963dc36a32d7375a417866fb84ae45cc3c5.png)
16位与32位汇编语言常用指令总结在计算机编程领域,汇编语言被广泛应用于底层程序设计,直接操作计算机硬件。
其中,16位和32位汇编语言是常见的两种类型。
本文将总结这两种汇编语言中常用的指令,帮助读者更好地理解和应用它们。
一、16位汇编语言常用指令1. 数据传送指令- MOV:将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
- XCHG:交换两个寄存器或内存位置的数据。
2. 算术运算指令- ADD/SUB:实现加法和减法运算。
- MUL/IMUL:实现无符号与有符号乘法运算。
- DIV/IDIV:实现无符号与有符号除法运算。
3. 逻辑运算指令- AND/OR/XOR:实现与、或、异或逻辑运算。
- NOT:对操作数进行按位取反操作。
4. 条件转移指令- JMP:无条件跳转到指定地址。
- JZ/JNZ:根据零标志位(ZF)的值进行跳转。
- JC/JNC:根据进位标志位(CF)的值进行跳转。
5. 循环指令- LOOP:根据计数器的值进行循环。
- JCXZ/JECXZ:根据CX/ECX寄存器的值进行循环。
二、32位汇编语言常用指令1. 数据传送指令- MOV:同16位汇编语言中的指令,用于数据传送。
- PUSH/POP:将数据推入栈或从栈中弹出。
2. 算术运算指令- ADD/SUB:同16位汇编语言中的指令,用于加法和减法运算。
- MUL/IMUL:同16位汇编语言中的指令,用于乘法运算。
- DIV/IDIV:同16位汇编语言中的指令,用于除法运算。
3. 逻辑运算指令- AND/OR/XOR:同16位汇编语言中的指令,用于逻辑运算。
- NOT:同16位汇编语言中的指令,用于按位取反。
4. 条件转移指令- JMP:同16位汇编语言中的指令,用于无条件跳转。
- JZ/JNZ:同16位汇编语言中的指令,根据零标志位(ZF)进行跳转。
- JB/JNB:根据低位借位标志位(CF)进行跳转。
5. 循环指令- LOOP:同16位汇编语言中的指令,用于循环操作。
OD反汇编语言解释
![OD反汇编语言解释](https://img.taocdn.com/s3/m/da2800035b8102d276a20029bd64783e09127d2e.png)
OD反汇编语言解释1000字OD反汇编语言是一种将机器语言指令转换为人类可读的汇编语言的工具,常用于逆向工程、软件分析和修改等领域。
在OD中,用户可以通过加载二进制文件并通过反汇编视图查看其汇编代码。
以下是关于OD反汇编语言的一些解释:1. 指令集:OD支持多种指令集,包括x86、x64、ARM、MIPS和PowerPC等。
每个指令集都有自己的特点和语法规则,用户需要事先了解并选择适合的指令集进行反汇编。
2. 寄存器:寄存器是CPU内部用于存储数据和地址的临时存储器。
在OD反汇编语言中,寄存器用来存储操作数和处理指令。
例如,EAX寄存器可用于存储累加器中的值,EBX可用于存储基址中的值,ECX可用于计数器中的值。
3. 操作码:操作码是汇编指令的核心部分,代表着具体的操作。
指令的操作码不同,具体操作也就不同。
例如,MOV指令是用来将数据从一个位置移动到另一个位置的指令,ADD指令是用于两个数值相加并保存结果的指令。
4. 操作数:操作数是指导致操作执行的位置或值。
在OD反汇编语言中,操作数可以是寄存器、内存地址或立即数。
例如,MOV AX,[BX]指令的操作数为[E]BX,表示复制寄存器BX中所存的数据到寄存器AX中。
5. 标志位:标志位是用来保存处理器状态的位。
在OD反汇编语言中,标志位记录着上一个操作的结果。
例如,ZF(零标志位)表示结果为零,CF(进位标志位)表示结果需要进位。
6. 流程控制:OD反汇编语言也支持流程控制指令,例如JMP、JE、JNE、JA、JB等。
这些指令用于实现条件跳转、循环、分支和函数调用等操作。
总之,OD反汇编语言是一种非常有用的工具,可用于逆向工程、软件分析和修改等领域。
理解OD反汇编语言的关键是掌握指令、寄存器、操作数、标志位和流程控制等概念。
汇编语言上机实验一DEBUG常用命令及8086指令使用
![汇编语言上机实验一DEBUG常用命令及8086指令使用](https://img.taocdn.com/s3/m/57a7e5c227fff705cc1755270722192e453658c9.png)
汇编语⾔上机实验⼀DEBUG常⽤命令及8086指令使⽤实验⼀DEBUG常⽤命令及8086指令使⽤实验⽬的:通过实验掌握下列知识:1、8086指令: M OV,ADD,SUB,XCHG等2、DEBUG命令: A,D,E,F,H,R,T,U。
3、ASCII码及⽤16进制数表⽰⼆进制码的⽅法。
内容及步骤:⼀、DEBUG 命令使⽤:1、打 DEBUG 进⼊ DEBUG 控制,显⽰提⽰符 '_ '。
2、⽤命令 F100 10F 'A' 将'A'的ASCII码填⼊内存。
3、⽤命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。
4、⽤命令F110 11F 41 重复上⼆项实验,观察结果并⽐较。
5、⽤命令 E100 30 31 32 …… 3F将30H-3FH写⼊地址为100开始的内存单元中,再⽤D命令观察结果,看键⼊的16进制数是什么字符的ASCII码?6、⽤H命令检查下列各组16进制数加减结果并和你的⼿算结果⽐较:(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758,347FH7、⽤R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
8、⽤R命令将AX,BX内容改写为1050H及23A8H。
⼆、8086常⽤指令练习1、传送指令1)⽤A命令在内存100H处键⼊下列内容: MOV AX,1234MOV BX,5678XCHG A X,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG A X,DX2)⽤U命令检查键⼊的程序并记录,特别注意左边的机器码。
3)⽤T命令逐条运⾏这些指令,每运⾏⼀⾏检查并记录有关寄存器及IP的变化情况。
并注意标志位有⽆变化。
2、加减法指令:1)⽤A命令在内存100H处键⼊下列内容:MOV AH,34MOV AL,22ADD AL,AHSUB AL,78MOV CX,1284MOV DX,5678ADD CX,DXSUB CX,AXSUB CX,CX图略。
elf反汇编成c语言
![elf反汇编成c语言](https://img.taocdn.com/s3/m/75b464137275a417866fb84ae45c3b3567ecdd90.png)
elf反汇编成c语言以ELF反汇编成C语言为标题的文章ELF(Executable and Linkable Format)是一种可执行文件和可链接文件的标准格式,常用于Linux和UNIX系统中。
在本文中,我们将探讨如何将一个已编译的ELF文件反汇编成C语言代码的过程。
反汇编是将机器码转换成人类可读的汇编代码的过程。
在这个过程中,我们可以推断出程序的逻辑结构并将其转化成C语言代码。
我们需要准备一个已编译的ELF文件,可以通过编译源代码得到。
为了遵守要求,我们不会输出任何涉及http地址的信息,也不会涉及公式或图片链接。
我们使用反汇编工具来分析ELF文件。
其中一个常用的工具是objdump。
我们可以使用以下命令来反汇编ELF文件并将结果保存到一个文本文件中:```objdump -d binary_file > disassembly.txt```接下来,我们打开disassembly.txt文件,查看反汇编结果。
我们将逐行分析代码,尽量用中文来描述每一行代码的作用。
我们看到了一些全局变量的定义。
这些变量会在程序的不同部分被使用。
例如,我们可以看到一个名为`counter`的变量,它可能在程序中被用于计数。
接下来,我们看到一些函数的定义。
这些函数是程序的核心逻辑。
例如,我们可以看到一个名为`add_numbers`的函数,它可能用于将两个数字相加并返回结果。
在函数定义的下方,我们可以看到函数被调用的地方。
这些调用指令告诉我们函数是如何在程序中被使用的。
例如,我们可以看到一个函数调用指令`call add_numbers`,它告诉我们在这个位置调用了`add_numbers`函数。
在反汇编结果中,我们还可以看到一些条件分支和循环的语句。
这些语句用于控制程序的流程。
例如,我们可以看到一个条件分支指令`jne`,它告诉程序根据条件是否相等来决定下一步的执行路径。
除了函数和流程控制语句,我们还可以看到一些与内存操作相关的指令。
汇编的基本常用指令
![汇编的基本常用指令](https://img.taocdn.com/s3/m/2abb471e0622192e453610661ed9ad51f01d54b4.png)
汇编的基本常用指令汇编语言是一种底层的程序设计语言,主要用于编写机器码指令。
以下是一些常用的汇编指令:1. MOV:将数据从一个位置复制到另一个位置。
2. ADD:将两个操作数相加,并将结果存储在目的操作数中。
3. SUB:将第二个操作数从第一个操作数中减去,并将结果存储在目的操作数中。
4. INC:将一个操作数的值增加1。
5. DEC:将一个操作数的值减少1。
6. CMP:比较两个操作数的值,并将结果影响到标志寄存器中。
7. JMP:无条件跳转到指定的代码位置。
8. JZ / JE:当指定的条件成立时,跳转到指定的代码位置(零标志或相等标志)。
9. JNZ / JNE:当指定的条件不成立时,跳转到指定的代码位置(非零标志或不相等标志)。
10. JL / JB:当源操作数小于目的操作数时,跳转到指定的代码位置(小于标志或借位标志)。
11. JG / JA:当源操作数大于目的操作数时,跳转到指定的代码位置(大于标志或进位标志)。
12. CALL:调用一个子程序或函数。
13. RET:返回子程序或函数的调用处。
14. NOP:空操作,用于占位或调整程序代码的位置。
15. HLT:停止运行程序,将CPU置于停机状态。
这里只列举了一些基本的汇编指令,实际上汇编语言有更多更复杂的指令,具体使用哪些指令取决于所使用的汇编语言和目标处理器的指令集架构。
继续列举一些常用的汇编指令:16. AND:将两个操作数进行按位与运算,并将结果存储在目的操作数中。
17. OR:将两个操作数进行按位或运算,并将结果存储在目的操作数中。
18. XOR:将两个操作数进行按位异或运算,并将结果存储在目的操作数中。
19. NOT:对一个操作数的每一位进行取反操作。
20. SHL / SAL:将一个操作数的每一位向左移动指定的位数。
对于无符号数,使用SHL指令;对于带符号数,使用SAL指令。
21. SHR:将一个操作数的每一位向右移动指定的位数,高位空出的位使用0填充。
使用objdump命令反汇编二进制文件
![使用objdump命令反汇编二进制文件](https://img.taocdn.com/s3/m/bef3d9540a4e767f5acfa1c7aa00b52acec79c50.png)
使用objdump命令反汇编二进制文件objdump 是 GNU Binutils 工具包中的一个工具,用于反汇编二进制文件。
它可以将二进制文件转换为汇编代码,帮助我们理解程序的内部细节和执行流程。
使用 objdump 命令反汇编二进制文件可以帮助开发人员进行调试、研究安全漏洞、逆向工程等操作。
以下是使用 objdump 命令反汇编二进制文件的具体步骤和使用示例。
步骤一:安装 GNU Binutils 工具包objdump 命令属于 GNU Binutils 工具包的一部分,因此首先需要安装 Binutils 工具包。
可以通过包管理器进行安装,例如在 Ubuntu 系统中,可以使用以下命令进行安装:```sudo apt-get install binutils```步骤二:反汇编二进制文件一旦安装完成 Binutils 工具包,就可以使用 objdump 命令来反汇编二进制文件。
下面是 objdump 命令的基本语法:```objdump [选项] <二进制文件>```以下是一些常用的选项:- `-d`:反汇编所有节 (sections) 的内容- `-S`:反汇编并显示源代码(如果可用)- `-t`:显示二进制文件中的符号表使用 objdump 命令进行反汇编可以提供更多有关二进制文件内部的信息。
例如,通过 objdump 命令可以查看可执行文件的代码段、数据段、符号表等信息。
以下是一个使用 objdump 命令反汇编可执行文件的示例:```objdump -d ./a.out```上述命令将会反汇编当前目录下的可执行文件 a.out,并输出其汇编代码。
步骤三:分析汇编代码一旦成功运行 objdump 命令并反汇编了目标二进制文件,就可以分析所得到的汇编代码了。
汇编代码可以让我们更深入了解程序的执行流程、指令的功能和数据的存储方式。
通过分析汇编代码,我们还可以判断程序是否存在漏洞或者进行程序优化。
objdump反汇编指令
![objdump反汇编指令](https://img.taocdn.com/s3/m/29c9c71dcdbff121dd36a32d7375a417866fc1f9.png)
objdump反汇编指令
objdump是一个反汇编工具,用于将一个二进制文件中的机器指令转化为汇编指令。
以下是objdump的一些常用选项以及对应的反汇编指令:
1. -d: 反汇编所有的代码段。
输出结果包括机器指令和对应的汇编指令。
2. -D: 类似于-d选项,但是输出结果还包括符号表、调试信息等。
3. -S: 反汇编代码段,并且将反汇编指令与源代码进行交替显示。
输出结果类似于源代码和对应的汇编指令的混合。
4. -M: 指定反汇编器的架构。
例如,使用-M x86-64选项可以指定反汇编目标为x86-64架构。
5. -m: 显示可执行文件的某一特定部分的反汇编结果。
6. -r: 显示重定位信息,包括重定位表和符号表。
7. -t: 显示BSS段的内容。
8. -j: 选择特定的代码段进行反汇编。
例如,-j .text可以只反汇编.text段。
9. -C: 还原由C++编译的函数名。
以上是一些常用的objdump选项和对应的反汇编指令。
使用objdump可以帮助我们查看二进制文件中的机器指令,以及对应的汇编指令,从而进行代码分析和调试。
反汇编 第二节 常用汇编指令
![反汇编 第二节 常用汇编指令](https://img.taocdn.com/s3/m/509d0c96daef5ef7ba0d3c76.png)
——啊冲第二节常用汇编指令说明:汇编语言也是一门语言,其指令相当的多,非常丰富,在此我只介绍几个常用的、简单的汇编指令,让大家与我一同入门。
其实在超多的计算机知识领域里我和大家一样只是个学生而已。
所以,我所要求的同学级别(本视频所针对的对象)是:有一点编程经验,对反汇编感兴趣、零基础的朋友。
堆栈操作指令PUSH和POP•格式: PUSH XXXX•POP XXXX•功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令.•加减法操作add和sub指令•格式: ADD XXXX1,XXXX2•功能: 两数相加•格式: SUB XXXX1,XXXXX2•功能: 两个操作数的相减,即从OPRD1中减去OPRD2,其结果放在OPDR1中.调用和返回函数CALL和RET(RETN)•过程调用指令CALL•格式: CALL XXXX•功能: 过程调用指令•返回指令RET•格式: RET•功能: 当调用的过程结束后实现从过程返回至原调用程序的下一条指令,本指令不影响标志位.•数据传送MOV 格式: MOV XXXX1,XXXX2•功能: 本指令将一个源操作数送到目的操作数中,即XXXX1<--XXXX2.•逻辑异或运算XOR•格式: XOR OPRD1,OPRD2•功能: 实现两个操作数按位‘异或’运算,结果送至目的操作数中.•逻辑或指令OR•格式: OR OPRD1,OPRD2•功能: OR指令完成对两个操作数按位的‘或’运算,结果送至目的操作数中,本指令可以进行字节或字的‘或’运算.有效地址传送指令LEA•格式: LEA OPRD1,OPRD2•功能: 将源操作数给出的有效地址传送到指定的的寄存器中.•实际上,有时候lea用来做mov同样的事情,比如赋值:•Lea edi,[ebp-0cch]•字符串存储指令STOS•格式: STOS OPRD•功能: 把AL(字节)或AX(字)中的数据存储到DI为目的串地址指针所寻址的存储器单元中去.指针DI将根据DF的值进行自动调整.•说明:在VC的DEBUG版里经常用来为局部变量空间写上cccccccc指令•比效指令CMP(CoMPare)•格式: CMP OPRD1,OPRD2•功能: 对两数进行相减,进行比较.•说明:经常与跳转指令相配合来形成循环或跳出操作•跳转指令JXX•JMP:无条件转移指令•JG/JNLE: 大于/不小于等于时转移•JL/JNGE: 小于/不大于等于时转移•JGE/JNL: 大于等于/不小于时转移•JLE/JNG:小于等于/不大于时转移•JE/JZ :等于时转移要求:对常见的汇编指令要达到熟悉,不常见的汇编指令也要有所了解(后附汇编指令表)每日一荐:我常去的两个论坛(原版视频下载)/编程爱好者的交流园地—广海/辅导教师---郁金香附:8088汇编指令表一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSW AP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个**作数为寄存器,段寄存器不可作为**作数) CMPXCHG 比较并交换**作数.( 第二个**作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个**作数里)XLAT 字节查表转换.──BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两**作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.两者相等为0,不等为1.NOT 取反.TEST 测试.(两**作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用**作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复**作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较**作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.就是搜索目标字符,只到找等或者串结束才退出比较ax/al 搜索数据es:di 目标串cx 串长度df 方向标志可以根据退出时的ZF位判断,是否在目标中REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空**作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.。
汇编常用指令
![汇编常用指令](https://img.taocdn.com/s3/m/1bd05a27773231126edb6f1aff00bed5b9f3731c.png)
汇编常用指令1. 前言汇编语言是一种低级别的计算机语言,它是由一些指令组成的。
指令是一条计算机执行的命令,从基本上讲,这些指令代表着标准的操作,例如加、减、乘、除、移位和比较等。
汇编语言可以通过编写程序来控制一个计算机的行为,这些程序通常被称为汇编程序。
本文将介绍汇编语言中一些常用的指令。
2. 数据传送指令数据传送指令是汇编语言中最基本的指令之一,它主要用来将数据从一个位置传送到另一个位置。
在汇编语言中,数据传送指令通常使用MOV语句来实现。
下面是一些常用的数据传送指令:- MOV AX, BX:将BX中存储的数据传送到AX中。
- MOV AX, [BX]:将BX中存储的地址所指向的数据传送到AX中。
- MOV [BX], AX:将AX中存储的数据传送到BX所指向的地址中。
3. 算术运算指令算术运算指令主要用来执行各种数学运算,例如加法、减法、乘法和除法等操作。
下面是一些常用的算术运算指令:- ADD AX, BX:将BX中存储的数据与AX中存储的数据相加,并将结果存储在AX中。
- SUB AX, BX:将BX中存储的数据从AX中存储的数据中减去,并将结果存储在AX中。
- MUL BX:将AX中存储的数据与BX中存储的数据相乘,并将结果存储在AX中。
- DIV BX:将AX中存储的数据除以BX中存储的数据,并将结果存储在AX和DX中。
4. 位运算指令位运算是一种在二进制数字级别上的运算,它可以执行各种位操作,例如AND、OR、XOR和NOT等操作。
下面是一些常用的位运算指令:- AND AX, BX:将BX中存储的数据与AX中存储的数据按位进行AND运算,并将结果存储在AX中。
- OR AX, BX:将BX中存储的数据与AX中存储的数据按位进行OR 运算,并将结果存储在AX中。
- XOR AX, BX:将BX中存储的数据与AX中存储的数据按位进行XOR运算,并将结果存储在AX中。
- NOT AX:将AX中存储的数据按位进行取反操作。
反汇编原理
![反汇编原理](https://img.taocdn.com/s3/m/64fde971777f5acfa1c7aa00b52acfc788eb9f7a.png)
反汇编原理在计算机科学领域中,反汇编是一种将机器码(即二进制代码)转换回可读性更强的汇编代码的过程。
反汇编的目的是帮助程序员理解和分析已编译的程序,以及进行逆向工程和漏洞研究等活动。
本文将介绍反汇编的原理和一些常用的工具和技术。
一、反汇编的原理反汇编的原理基于计算机体系结构和汇编语言。
在计算机中,程序由一系列指令组成,这些指令以二进制形式存储在计算机的内存中。
每个指令都有特定的操作码(opcode)和操作数(operand),用于执行特定的操作。
当计算机执行程序时,将逐条读取指令并执行相应的操作。
为了提高计算机的执行效率和节省存储空间,指令通常以二进制形式存储。
这样的二进制代码对于人来说很难理解和分析。
反汇编的目的是将这些二进制指令转换为易读的汇编语言。
汇编语言是一种与机器码对应的符号表示法,它使用助记符(mnemonic)和操作数来表示指令。
通过反汇编,程序员可以更容易地阅读和理解已编译的程序。
二、常用的反汇编工具1. IDA Pro:IDA Pro是一款功能强大的反汇编工具,广泛用于逆向工程和漏洞研究。
它可以自动识别并反汇编多种平台和架构的二进制代码,并提供高级分析和调试功能。
2. objdump:objdump是GNU工具链中的一个命令行工具,用于反汇编可执行文件和目标文件。
它支持多种架构和格式,并提供丰富的选项和输出格式。
3. Hopper:Hopper是一款适用于macOS的反汇编工具,具有直观的用户界面和强大的分析功能。
它支持多种体系结构和文件格式,并提供高级的反汇编和调试功能。
三、反汇编的技术1. 静态反汇编:静态反汇编是指在不执行程序的情况下进行反汇编。
它通过分析二进制文件的结构和指令流来推断程序的控制流和数据流。
静态反汇编常用于逆向工程和漏洞研究中。
2. 动态反汇编:动态反汇编是指在程序执行过程中进行反汇编。
它利用调试器或虚拟机监视器等工具,跟踪程序的执行并记录相应的汇编代码。
ida常用指令
![ida常用指令](https://img.taocdn.com/s3/m/61ae9b785b8102d276a20029bd64783e08127d42.png)
ida常用指令全文共四篇示例,供读者参考第一篇示例:IDA是一个非常强大的逆向工程工具,它支持多种平台和架构,并提供了丰富的功能和指令集。
在使用IDA进行逆向工程分析时,掌握一些常用的指令对于提高工作效率和准确性非常重要。
本文将介绍一些IDA常用指令,帮助大家更好地利用这个工具进行逆向分析。
我们来看一下IDA中一些常用的基本指令。
在IDA中,按键盘上的F1键可以打开帮助文档,查看各种指令的用法和含义。
常见的基本指令包括:1. 查看函数:在IDA中,按“P”键可以查看当前位置所属的函数,按“N”键可以跳转到下一个函数。
在函数视图中,按“U”键可以查看函数的调用者,按“C”键可以查看函数的被调用者。
2. 跳转指令:按“G”键可以跳转到指定地址,按Ctrl+E可以跳转到函数开头。
3. 查看变量:在IDA中,按“X”键可以查看当前位置的变量列表,按“L”键可以查看当前位置的局部变量,按“G”键可以查看全局变量。
4. 查看指令:在IDA中,按“D”键可以查看当前位置的指令,按“E”键可以查看指令的详细信息,比如寄存器的值、内存的值等。
除了以上基本的指令,还有一些高级功能和技巧可以帮助提高逆向分析的效率。
下面我们来介绍一些常用的高级指令和技巧:1. 动态分析:在IDA中,可以使用动态分析工具来辅助逆向分析。
IDA支持多种动态分析插件,比如IDA Prox、IDA Python等,可以帮助分析者实时监视程序的执行过程,跟踪变量的值变化,以及控制程序的执行流程。
2. 反编译:IDA支持将机器码转换为高级语言代码,这样可以帮助逆向分析者更容易地理解程序的逻辑和功能。
在IDA中,按F5键可以进入反编译模式,查看函数的高级语言代码。
3. 数据流分析:IDA可以对程序进行数据流分析,分析变量的定义和使用情况,帮助分析者更好地理解程序的逻辑和数据流动。
在IDA中,按“A”键可以查看数据流分析结果。
4. 寄存器窗口:在IDA中,按Ctrl+R可以打开寄存器窗口,显示当前的寄存器状态。
反汇编语言常用指令
![反汇编语言常用指令](https://img.taocdn.com/s3/m/b6935fdef5335a8103d22071.png)
内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
.4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
单片机汇编语言取反指令
![单片机汇编语言取反指令](https://img.taocdn.com/s3/m/99498535fe00bed5b9f3f90f76c66137ee064f93.png)
单片机汇编语言取反指令
单片机汇编语言中,取反指令是一种常用的操作指令,用于将寄存器
或内存中存储的数据按位取反。
取反指令是一种非常基础的操作指令,也是程序猿们经常使用的指令。
在单片机汇编语言中,取反指令有多种不同的形式,如NOT、XOR、COM、NEG等等。
这些指令都具有相同的功能,即将数据按位取反,但是实现的方式有所不同。
其中,NOT指令是最常见的一种取反指令,用于将寄存器或内存中存储的数据逐位取反。
例如,对于一个8位的寄存器,NOT指令会将其中的每一位都取反,即0变1,1变0。
这样,数据中的所有比特位都会发生改变,从而实现了取反的操作。
另外一种常见的取反指令是XOR指令,它也能够实现取反的功能。
XOR指令将两个操作数按位异或,结果就是这两个数按位取反的结果。
例如,对于一个寄存器A,执行“XOR A,FFH”指令就会将寄存器A 的所有比特位取反。
除了NOT和XOR指令之外,COM指令也是一种常用的取反指令。
COM指令会将操作数的每一位都取反,然后将结果存储到指定的目的
地。
例如,执行“COM A”指令会将寄存器A中的每一位都取反,然后将结果存储回寄存器A中。
最后,NEG指令也可以用于实现取反的操作。
NEG指令实际上是一种求负数的指令,但是当操作数是0时,NEG指令会将其按位取反。
总之,取反指令是单片机汇编语言中一种非常基础的指令,用于将数据中的所有比特位逐位取反。
虽然不同的取反指令实现的方式不同,但是它们都能够实现相同的功能。
在实际编程中,程序员可以根据需要选择不同的取反指令,以实现自己所需的功能。
反汇编语言常用指令
![反汇编语言常用指令](https://img.taocdn.com/s3/m/8a7feb2cc8d376eeafaa311e.png)
1 / 33内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介: 32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:2 / 33AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
ida常用指令
![ida常用指令](https://img.taocdn.com/s3/m/ea9e258dab00b52acfc789eb172ded630b1c98cd.png)
ida常用指令全文共四篇示例,供读者参考第一篇示例:IDA(Interactive DisAssembler),是一款强大的逆向分析工具,用于分析和逆向工程二进制文件。
它提供了许多常用的指令和功能,帮助用户进行更加高效和准确的逆向分析工作。
本文将介绍一些IDA 常用指令和功能,帮助读者更好地了解和使用IDA。
1. 打开二进制文件:使用IDA打开二进制文件是最基本的操作。
可以通过“File”菜单中的“Open”选项或直接拖放文件到IDA界面中来打开二进制文件。
2. 查看反汇编代码:在IDA中,可以通过双击函数或代码块来查看反汇编代码。
还可以使用快捷键“Space”来切换反汇编窗口显示的代码。
3. 查看交叉引用:在IDA中,可以查看函数、变量或常量的交叉引用,帮助用户理解程序的逻辑和数据流动。
4. 修改反汇编代码:在IDA中,用户可以修改反汇编代码来分析和测试程序。
修改后可以保存IDA数据库或生成新的可执行文件。
5. 根据函数名搜索:在IDA中,用户可以使用“Ctrl+F”快捷键来搜索指定的函数名,便于快速定位和查找相关函数。
8. 导出函数列表:在IDA中,用户可以将程序中的函数列表导出为文本文件,便于后续分析和研究。
9. 反编译代码:在IDA中,用户还可以对程序进行反编译操作,将汇编代码转换为高级语言代码,帮助理解程序逻辑和进行深入分析。
10. 调试功能:在IDA中,用户还可以使用调试功能进行程序的动态调试和分析,帮助理解程序执行流程和调试程序错误。
第二篇示例:IDA是一款用于反汇编和静态分析的工具,是逆向工程师和安全研究人员常用的利器。
在使用IDA进行逆向分析时,熟练掌握IDA的常用指令是至关重要的。
本文将介绍一些IDA常用指令,帮助读者更好地了解和使用IDA工具。
1. 切换视图在IDA中,可以通过按下“空格”键来切换不同的视图,包括文本视图、交叉引用视图、十六进制视图等。
这些视图可以帮助用户更方便地查看和分析反汇编结果。
C++反汇编基础 第1讲:基本概念
![C++反汇编基础 第1讲:基本概念](https://img.taocdn.com/s3/m/39678952312b3169a451a4ba.png)
C++ 入口函数
C/C++ 语法入口
◦ 控制台程序:main ◦ Windows程序:WinMain
C/C++ 代码入口
◦ 控制台程序 ◦ Windows程序
ASCII:mainCRTStartup UINCODE: wmainCRTStartup
ASCII:WinMainCRTStartup UINCODE: wWinMainCRTStartup
欢迎访问我们的官方网站
寻址方式
立即寻址
◦ 常量赋值 ◦ mov eax, 10h
寄存器相对寻址
◦ 访问数组和结构 ◦ mov eax, [esi+0Ch]
直接寻址
◦ 读写变量 ◦ mov eax, [00304C18h]
基址加变址寻址
◦ 访问数组 ◦ mov eax, [ebp+esi]
寄存器寻址
◦ 指针解引用 ◦ mov eax, [esi]
INC:加1指令 DEC:减1指令 ADD:加法指令 SUB:减法指令 MUL:无符号乘法 DIV:无符号除法 AND:逻辑与 OR:逻辑或 NOT:逻辑非 XOR:异或指令 SHL:逻辑左移 SHR:逻辑右移
C++ 内联汇编
C/C++ 代码中嵌入汇编语言
__asm {
;汇编指令
}
本课程学习地址: C++反汇编基础:Win32平台(逆向实例、动态调试实例) /goods-450.html
变址寄存器
ESI:源变址寄存器 EDI:目的变址寄存器
mov rep movs
反汇编教程
![反汇编教程](https://img.taocdn.com/s3/m/254b88921a37f111f1855b57.png)
◆高级语言特性的识别
§ 浮点处理
浮点数的处理与整数不一样,它是由
FPU完成的。float用4个字节表示,double 则用8个。常用的浮点指令:
fld 压栈
fst弹栈
fcom 比较
fadd 加法
fdiv除法
fmul 乘法
fsub 减法
◆高级语言特性的识别
§ 浮点处理
浮点处理时,先把操作数压到浮点堆栈中,比 如:
◆高级语言特性的识别
§ 参数的传递规范
2、Pascal规范 函数参数由左往右压入堆栈,由被调用的函数负责清
栈。如: int __pascal swap(int a, int b); push a push b call swap
在swap内部: 由 retn 8 来清理堆栈。
注:在VC++中已不再支持,用相似的WINAPI来代替,也就 是说普通代码是不能编出Pascal调用类型。
var_4 = dword ptr -4
在用的时候:
mov [esp + var_4], 5555
5555
生长方向
-8 -4 0 4 8 c
◆高级语言特性的识别
§ 结构体
如果定义一个局部变量的结构体实例:
struct person{ int a;
Var_8
int b; };
Var_4
Void test(void){
retn 4 可以轻松的看出ecx 是一个结构体(或类)的指针,并
访问了它的偏移为0、4的两个成员。 看一个例子: struct.idb
◆高级语言特性的识别
§ 类 (this指针)
类的成员变量和结构类似,但是它在调 用成员函数的时候会准备this指针的传递。
ida常用指令
![ida常用指令](https://img.taocdn.com/s3/m/d059dc4abfd5b9f3f90f76c66137ee06eff94edc.png)
IDA Pro(Interactive Disassembler)是一款流行的逆向工程工具,它广泛用于软件分析,尤其是在安全研究、病毒分析、软件破解和逆向工程领域。
IDA Pro提供了大量的指令和功能,以支持对其分析的软件进行细致的检查。
以下是一些在IDA Pro中常用的指令和功能:1. 汇编指令:IDA Pro主要用于汇编语言级别的分析,因此它支持所有的标准汇编指令,如ADD、SUB、MOV、JMP、JZ、JNZ等。
2. 寄存器:IDA Pro允许查看和修改处理器寄存器的值,如EAX、EBX、ECX、EDX等。
3. 内存访问:可以查看和修改内存中的数据,IDA Pro提供了丰富的功能来处理内存中的数据。
4. 堆栈操作:IDA Pro支持对堆栈的查看和操作,包括压栈(PUSH)、出栈(POP)等指令。
5. 函数调用和返回:IDA Pro可以分析函数调用和返回序列,包括调用约定和堆栈清理。
6. 结构体和联合体:IDA Pro允许用户定义和分析数据结构,如结构体、联合体和类。
7. 交叉引用:IDA Pro可以显示函数之间的调用关系,以及变量和函数之间的引用。
8. 字符串分析:IDA Pro有强大的字符串分析功能,可以识别和显示字符串常量。
9. 插件和支持:IDA Pro支持大量的插件,这些插件提供了额外的功能,如自动化分析、脚本支持等。
10. 反汇编和重汇编:IDA Pro可以将机器码反汇编成汇编语言,并且有重汇编功能,将汇编代码转换成更易于阅读的伪代码。
11. 断点和跟踪:IDA Pro允许设置断点来停止执行,并跟踪程序的执行流程。
12. 插桩:IDA Pro可以插入代码来修改程序的行为,或者收集执行过程中的信息。
13. 代码浏览器:IDA Pro有一个代码浏览器,可以以高级视图查看代码,如源代码、十六进制、字符串等。
14. 脚本支持:IDA Pro支持脚本,可以使用Python等语言编写脚本来自动化常见的任务。
C语言反汇编-数据类型与常量
![C语言反汇编-数据类型与常量](https://img.taocdn.com/s3/m/3e51b800cd7931b765ce0508763231126edb7768.png)
C语⾔反汇编-数据类型与常量反汇编(Disassembly) 即把⽬标⼆进制机器码转为汇编代码的过程,该技术常⽤于软件破解、外挂技术、病毒分析、逆向⼯程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解⾼级语⾔代码都有相当⼤的帮助,软件⼀切神秘的运⾏机制全在反汇编代码⾥⾯。
寻找OEP1.使⽤编译器 VS 2013 Express 版本,写代码,并关闭基地址随机化,编译采⽤debug版。
2.寻找OEP,x64dbg 载⼊,默认停在,回车跟进。
call <__tmainCRTStartup> 再次回车跟进。
下⽅看到⼀个安全cookie检测,主要防⽌在⽬标堆栈中瞎搞,⽽设计的安全机制。
编译器开启后,每次运⾏都会⽣成随机cookie,结束时会验证是否⼀致,防⽌瞎搞,⽼版本编译器中不存在这个选项,⼀开始开发⼈员也没想那么多,后来瞎搞的⼈多了,才加上的,主要是害怕⾃⼰的windows被玩坏。
继续向下看代码,看到以下代码就到家了,call 0x0041113B 跟进去就是main.数值类型变量:数值类型默认在32位编译器上是4字节存储的。
#include <stdio.h>int main(int argc, char* argv[]){int x = 10, y = 20, z = 0;printf("%d\n", x + y);return 0;}反汇编结果如下,如果在vc6下mov ecx,0xC 原因 int=4 3*4=0xC004113CC | 8DBD 1CFFFFFF | lea edi,dword ptr ss:[ebp-0xE4] | 取出内存地址004113D2 | B9 39000000 | mov ecx,0x39 | 指定要填充的字节数004113D7 | B8 CCCCCCCC | mov eax,0xCCCCCCCC | 将内存填充为0xcccccc004113DC | F3:AB | rep stosd | 调⽤rep指令,对内存进⾏初始化004113DE | C745 F8 0A000000 | mov dword ptr ss:[ebp-0x8],0xA | 对变量x初始化为10004113E5 | C745 EC 14000000 | mov dword ptr ss:[ebp-0x14],0x14 | 对变量y初始化为20004113EC | C745 E0 00000000 | mov dword ptr ss:[ebp-0x20],0x0 | 对变量c初始化为0004113F3 | 8B45 F8 | mov eax,dword ptr ss:[ebp-0x8] | 取出10并放⼊eax004113F6 | 0345 EC | add eax,dword ptr ss:[ebp-0x14] | 与20相加得到结果付给eax004113F9 | 8BF4 | mov esi,esp | 保存当前栈帧004113FB | 50 | push eax |004113FC | 68 58584100 | push consoleapplication1.415858 | 415858:"%d\n"00411401 | FF15 14914100 | call dword ptr ds:[<&printf>] |00411407 | 83C4 08 | add esp,0x8 |除了整数类型外,浮点数也是⼀种数值运算⽅式,将上⽅代码稍微修改后,编译并查看其反汇编代码.#include <stdio.h>int main(int argc, char* argv[]){double x = 1.05, y = 20.56, z = 0;z = x + y;printf("%f\n", z);return 0;}观察以下汇编代码,会发现前⾯的初始化部分完全⼀致,但后⾯则使⽤了xmm0寄存器,该寄存器是专门⽤于运算浮点数⽽设计的浮点运算模块默认⼤⼩就是64位,其将内存中的值取出来并放⼊xmm0中进⾏中转,然后复制到堆栈中,等待最后调⽤addsd命令完成对浮点数的加法运算,并将运算结果回写到缓冲区,最后调⽤打印函数实现输出.004113CC | 8DBD 10FFFFFF | lea edi,dword ptr ss:[ebp-0xF0] |004113D2 | B9 3C000000 | mov ecx,0x3C |004113D7 | B8 CCCCCCCC | mov eax,0xCCCCCCCC |004113DC | F3:AB | rep stosd |004113DE | F2:0F1005 70584100 | movsd xmm0,qword ptr ds:[<__real@3ff0cccccccccccd>] | 将内存地址中的值取出并放⼊xmm0中004113E6 | F2:0F1145 F4 | movsd qword ptr ss:[ebp-0xC],xmm0 | 将数据放⼊堆栈中存储004113EB | F2:0F1005 80584100 | movsd xmm0,qword ptr ds:[<__real@40348f5c28f5c28f>] |004113F3 | F2:0F1145 E4 | movsd qword ptr ss:[ebp-0x1C],xmm0 |004113F8 | F2:0F1005 60584100 | movsd xmm0,qword ptr ds:[<__real@0000000000000000>] |00411400 | F2:0F1145 D4 | movsd qword ptr ss:[ebp-0x2C],xmm0 |00411405 | F2:0F1045 F4 | movsd xmm0,qword ptr ss:[ebp-0xC] | main.c:60041140A | F2:0F5845 E4 | addsd xmm0,qword ptr ss:[ebp-0x1C] | 对浮点数进⾏相加操作0041140F | F2:0F1145 D4 | movsd qword ptr ss:[ebp-0x2C],xmm0 | 结果放⼊堆栈等待被打印00411414 | 8BF4 | mov esi,esp |00411416 | 83EC 08 | sub esp,0x8 |00411419 | F2:0F1045 D4 | movsd xmm0,qword ptr ss:[ebp-0x2C] |0041141E | F2:0F110424 | movsd qword ptr ss:[esp],xmm0 |00411423 | 68 58584100 | push consoleapplication1.415858 | 415858:"%f\n"==L"春\n"00411428 | FF15 14914100 | call dword ptr ds:[<&printf>] |0041142E | 83C4 0C | add esp,0xC |字符与字符串变量:#include <stdio.h>int main(int argc, char* argv[]){char x = 'a', y = 'b',z = 'c';printf("x = %d --> y = %d --> z = %d", x,y,z);return 0;}反汇编结果如下,观察发现字符型的表现形式与整数类型基本⼀致,只是在数据位⼤⼩⽅⾯有所区别,如上int类型使⽤dword作为存储单位,⽽字符类型则默认使⽤byte形式存储。
单片机汇编语言取反指令
![单片机汇编语言取反指令](https://img.taocdn.com/s3/m/9d9997080a4c2e3f5727a5e9856a561252d32195.png)
单片机汇编语言取反指令一、概述在单片机汇编语言中,取反指令是一种常用的指令,用于将数据的每一位取反。
通过取反指令,我们可以实现逻辑运算、位操作等各种功能。
本文将详细介绍单片机汇编语言中的取反指令。
二、取反指令的基本语法取反指令的基本语法如下:NOT 目的操作数其中,目的操作数可以是寄存器、内存单元或立即数。
执行该指令后,目的操作数的每一位都会被取反。
三、取反指令的应用场景取反指令在单片机汇编语言中有广泛的应用场景,以下是一些常见的应用场景:1. 逻辑运算通过取反指令,我们可以实现逻辑非运算。
例如,如果某个寄存器存储了一个值,我们可以使用取反指令将其值取反,从而得到逻辑非的结果。
2. 位操作在单片机编程中,常常需要对数据的某一位进行操作,例如设置某一位为1或将某一位置0。
通过取反指令,我们可以很方便地实现这些位操作。
3. 数据处理在某些应用中,需要对存储的数据进行处理。
通过取反指令,我们可以对数据进行独特的处理,达到特定的效果。
四、常用的取反指令1. NOT A该指令将寄存器A中的值取反,即每一位的值都会被反转。
2. NOT C该指令将寄存器C中的值取反,即每一位的值都会被反转。
3. NOT x该指令将内存单元x中的值取反,即每一位的值都会被反转。
4. NOT #n该指令将立即数n取反,即每一位的值都会被反转。
立即数n的取值范围取决于单片机的架构和指令集。
五、示例代码以下是一个使用取反指令的示例代码:; 将寄存器A的值取反后存储到寄存器B中MOV B, A ; 将寄存器A的值复制到寄存器BNOT B ; 将寄存器B的值取反; 将内存单元x中的值取反MOV ACC, x ; 将内存单元x的值加载到累加器ACC中NOT ACC ; 将累加器ACC的值取反MOV x, ACC ; 将累加器ACC中的值保存回内存单元x六、总结通过本文的介绍,我们了解了单片机汇编语言中取反指令的基本语法和应用场景。
取反指令在逻辑运算、位操作和数据处理等方面都有广泛的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。
在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器段寄存器是根据内存分段的管理模式而设臵的。
内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。
在每种方式下,段寄存器的作用是不同的。
有关规定简单描述如下:实方式:前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。
为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。
5、指令指针寄存器32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。
如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
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)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位1、I/O特权标志IOPL(I/O Privilege Level)I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。
该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
2、嵌套任务标志NT(Nested Task)嵌套任务标志NT用来控制中断返回指令IRET的执行。
具体规定如下:(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;(2)、当NT=1,通过任务转换实现中断返回。
3、重启动标志RF(Restart Flag)重启动标志RF用来控制是否接受调试故障。
规定:RF=0时,表示“接受”调试故障,否则拒绝之。
在成功执行完一条指令后,处理机把RF臵为0,当接受到一个非调试故障时,处理机就把它臵为1。
4、虚拟8086方式标志VM(Virtual 8086 Mode)如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
计算机寄存器常用指令一、常用指令1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果.( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ESDI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FSD.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GSDI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SSDI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES I 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX0时重复. REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX0时重复. REPC 当CF=1且CX/ECX0时重复.REPNC 当CF=0且CX/ECX0时重复.五、程序转移指令1.简单的条件转移指令JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0JS OPR----------------------结果为负转移, 测试条件SF=1JNS OPR---------------------结果为正转移, 测试条件SF=0JO OPR--------------------- 溢出转移, 测试条件OF=JNO OPR --------------------不溢出转移, 测试条件SF=0JP OPR ---------------------结果为偶转移, 测试条件SF=1JNP OPR --------------------结果为奇转移, 测试条件SF=0JC OPR -------------------- 有进位转移, 测试条件SF=1JNC OPR --------------------无进位转移, 测试条件SF=02.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移) JB(或JNAE) opd --------------小于或者不大于等于则转移JNB(或JAE) opd---------------不小于或者大于等于则转移JA(或NJBE) OPD---------------大于或者不小于等于则转移JNA(或JBE) OPD---------------不大于或者小于等于则转移3.带符号比较条件转移指令JL(或JNGE) --------------小于或者不大于等于则转移JNL(或JGE)--------------不小于或者大于等于则转移JG(或NJLE)---------------大于或者不小于等于则转移JNG(或JLE)---------------不大于或者小于等于则转移六、调用子程序与返回指令CALL 子程序调用指令RET 子程序返回指令六、其它指令OFFSET -------------------- 返回偏移地址SEG -------------------- 返回段地址EQU(=) -------------------- 等值语句PURGE -------------------- 解除语句DUP -------------------- 操作数字段用复制操作符SEGMENT,ENDS -------------------- 段定义指令ASSUME -------------------- 段地址分配指令ORG -------------------- 起始偏移地址设臵指令$ --------------------地址计数器的当前值PROC,ENDP -------------------- 过程定义语句NAME,TITLE,END -------------------- 程序开始结束语句MACRO,七、条件标志ZF 零标志-- 当结果为负时,SF=1,否则,SF=0.AF 辅助进位标志---运算过程中第三位有进位值,臵AF=1,否则,AF=0PF 奇偶标志------当结果操作数中偶数个"1",臵PF=1,否则,PF=0SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,臵CF=1;否则,CF=0. OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,臵OF=1,否则,OF=0 OllyICE反汇编教程及汇编命令详解内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。