汇编程序基本指令集(代码片段)

她还会来吗 她还会来吗     2022-12-14     516

关键词:

指令概述

指令

指令是CPU操作的基本单位,每条指令执行一个特定的操作。可以理解为:指令通知CPU执行某种操作的“命令”。CPU全部指令的集合,称为指令集

指令分类

  1. 机器指令:二进制格式编码的序列(一串0,1代码书写)。注意:硬件只能识别,存储,运行机器指令
  2. 符号指令:用字符串形式的序列(包含字符串形式的操作码以及操作数助记符)

汇编语言基本指令集

总说明(所有的指令都要遵守的)

  1. 对于双操作数指令(如:MOV,ADD,CMP…)
  • 源,目操作数不可同为内存操作数
  • 源,目操作数属性一致(长度相同)
  • 当源操作数为立即数,目标操作数为非变量名直接寻址的内存操作数,则目标操作数必须用PTR说明类型
  1. 对于单操作指令(如:INC,DEC…)
  • 若操作数为非变量名直接寻址的内存操作数,则必须使用PTR说明类型

常用伪指令

数据定义伪指令

  1. DB:字节定义伪指令
功能:将数据存放到计算机中的内存单元时,负数按照补码存放,单引号中的字符翻译成ASCII码


2. DW:字定义伪指令

功能:通知汇编程序把DW后跟的双字节数,依次存入从变量名开始的单元,每一个数,占两个字节,存放时满足小端法规则,即:低字节->低地址单元,高字节->高地址单元。


3. DD:双字定义伪指令
变量名 DD 一串用逗号间隔的4字节数

功能:将数据存放到计算机中的内存单元时,负数按照补码存放,单引号中的字符翻译成ASCII码

符号定义伪指令

  1. EQU:等值伪指令
NUM EQU 33
MOV AL,NUM  ;该指令与下条指令等价
MOV AL,33
  1. =:等号伪指令
NUM = 33
功能:定义符号常数NUM的值为33

3.EQU和=区别

  • 用EQU定义的符号常数,其值在后句语句中不能更改
  • 用=定义的符号常数,其值在后继语句中可以重新定义

通用传送类指令

  • 数据传送指令
(1) 数据传送指令:
      MOV 目,源
    功能:把源操作数赋值(传送)给目的操作数,源操作数不变
    说明:  不能向段寄存器中写入立即数
           CS不能做目标寄存器
    注意:不能用一条指令实现以下传送:
         1. 存储单元之间的传送
         2. 立即数至段寄存器的传送(中间需要使用一个通用寄存器中转)
         3. 段寄存器之间的传送    
  • 符号扩展/零扩展传送指令
(2) 符号扩展/零扩展传送指令
      MOVSX 目标寄存器,源操作数
      MOVZX 目标寄存器,源操作数
    功能:把源操作数赋值(传送)给目的操作数,源操作数不变
    说明:  1.源操作数不变
           2.源操作数字长要小于或等于目标寄存器字长 
           3. MOVSX源操作数符号位向高位扩展,再送给目标
           4. MOVZX源操作数高位补零,再送给目标
  • 有效地址传送指令
(3) 有效地址传送指令
    LEA 目标寄存器,源操作数
    功能:计算内存单元的有效地址(不是其中的操作数)->目标
    说明:有效地址就是偏移地址,LEA指令等效于OFFSET运算符
  • 交换传送指令
(4) 交换传送指令
   XCHG 第一操作数,第二操作数
   功能:完成两个操作数互换
   说明: 1. 段寄存器,立即数不能参加互换
         2. 2个内存操作数不能互换,源,目的类型一致

堆栈操作类指令

堆栈的基本概念

堆栈————计算机中的堆栈是人为设置的一片连续内存区,用来存放数据,所存数据按先进后出规律存取
栈顶:栈区的低地址
栈底:栈区的高地址

  • 堆栈寄存器SS:存放堆栈段段基址
  • 堆栈指针(SP):存放栈顶单元的偏移地址
    堆栈指针SP的初值决定了堆栈的大小,SP始终指向栈顶的顶部,及始终指向最后压入堆栈的信息所在的单元

数据进出栈

  • 入栈PUSH
PUSH src;(先移后入)
一个字进栈,系统自动完成两步操作:SP←SP-2,(SP)←操作数;
一个双字进栈,系统自动完成两步操作:ESP←ESP-4,(ESP)←操作数。
  • 出栈POP
POP dst;(先出后移)
弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP+2;
弹出一个双字,系统自动完成两步操作:操作数←(ESP),ESP←ESP+4。

注意:堆栈操作指令中的操作数类型必须是字操作数,即16位操作数

算数运算类指令

  • 二进制加法
  1. ADD:不带进位加法指令
    ADD 目标操作数(dst),源操作数(src) ;dst <- dst+src
    功能:将目的操作数与源操作数相加,并将结果送给目的操作数
  1. ADC:带进位加法指令
    ADC 目标操作数(dst),源操作数(src)  ;dst <- dst+src+CF
    功能:将目的操作数与源操作数相加,再加上进位标志CF的内容,然后将结果送给目的操作数
  1. INC:加一指令
   INC 目标操作数(dst)  ;dst <- dst+1
   功能:将目的操作数加一,并将结果送回目的操作数。
  • 二进制减法
    1.SUB:不带借位减法指令
 SUB 目标操作数(dst),源操作数(src) ;dst <- dst-src;
 功能:将目的操作数减源操作数,结果送回目的操作数。

2.SBB:带借位减法指令

 SBB 目标操作数(dst),源操作数(src) ;dst <- dst-src-CF;
 功能:将目的操作数减源操作数,然后再减进位标志CF,并将结果送回目的操作数。
  1. DEC:减一指令
  DEC 目标操作数(dst)  ;dst <- dst-1
  功能:将目的操作数减一,结果送回目的操作数。
  • 求补指令
    NEG:求补指令
  NEG 目标操作数(dst) ; dst <- 0-dst
  功能:用0减去目的操作数,结果送回原来的目的操作数。
  • 比较指令
    CMP:比较指令
  CMP 目标操作数(dst),源操作数(src) ;dst-src
  功能:将目的操作数减源操作数,但结果不送回目的操作数。
  • 乘法指令
  1. MUL:无符号数乘法指令
  MUL src ;(AX)<-(src)*(AL)
  功能:将源操作数与默认的目的操作数(AX或AL)相乘,结果保存在AX或DX,AX中。
  1. IMUL:带符号数乘法指令
  IMUL src ;
  功能:将源操作数与默认的目的操作数(AX或AL)相乘,结果保存在AX或DX,AX中。
  说明:运算结果只影响状态标志CF,OF;
  • 除法指令
  1. DIV:无符号数除法指令
  DIV src ;(AL)<-(AX)*(src) (商)  (AH) <- 余数
  功能:将两个无符号数做除法运算,商和余数分别保存在指定位置。
  1. IDIV:带符号数除法指令
  IDIV src 
  功能:将两个带符号数做除法运算,商和余数分别保存在指定位置。
  说明:当被除数位不够时,需要进行扩展。
  • 字节扩展指令
 CBW
 功能:把AL中的带符号数扩展为16位字长(符号位扩展到AH中)。
  • 字扩展指令
 CWD
 功能:将AX中的符号位扩展到DX中

转移类指令

  1. 按照转移条件分:无条件转移和有条件转移
  • 有符号条件转移
  • 循环控制转移
  1. 按照转移范围分:段内转移和段间转移
  2. 按照获取转移地址的方法分:直接转移和间接转移

调用类指令

  • 子程序调用与返回指令
  CALL   <调用地址>
  RET  ;返回断点

子程序:能完成一定功能的相对独立的程序段
调用:调用子程序,即无条件转到子程序的第一条指令
返回:返回断点,即返回到CALL的后继指令

  • 段内调用CALL指令
  1. 段内直接调用:主程序和子程序待在同一代码段中
  CALL  过程名
  1. 段内间接调用
  CALL  寄存器操作数
  CALL  内存操作数
  • 子程序(汇编语言)的过程定义语句
  过程名   PROC  属性
           子程序实体
          RET
  过程名  ENDP

过程名:子程序名,以字母开头,经汇编之后,过程名就是子程序的第一条指令
PROC/ENDP:是子程序的定界语句
属性: NEAR(或缺省)代表近过程,即该子程序和调用它的那条指令在同一个代码段。
FAR代表远过程,即该子程序和调用它的那条指令不在同一个代码段。
RET:RET子程序返回指令

逻辑运算类指令

  • NOT:取反
  NOT 目的操作数(dst)  
  功能:实现操作数的按位取反运算,把取反的结果送给目标操作数
  说明:NOT用于使所有位取反

  • AND:与指令
  AND 目的操作数(dst),源操作数(src)  
  功能:实现两个操作数的按位与运算,将两个操作数与之后的结果送给目标操作数
  说明:AND通常用于使某些位置0,其他位不变的情况

  • OR:或运算
  OR 目的操作数(dst),源操作数(src)    
  功能:实现操作数的按位或运算,把或的结果送给目标操作数
  说明:OR通常用于将某些位置1

  • XOR:异或运算
  XOR 目的操作数(dst),源操作数(src)  
  功能:实现操作数的按位异或运算,把异或的结果送给目标操作数
  说明:XOR通常用于将某些位取反,某些位保持不变

  • TEST:测试
  TEST 目的操作数(dst),源操作数(src) 
  功能:实现两个操作数的按位与运算,结果不保存,只影响标志位

移位指令

开环移位指令

  • 算数左移
  SAL 操作数,移位次数
  说明:操作数向左移位,最高位被挤入进位位中,用0来补充最低位
  • 算数右移
  SAR 操作数,移位次数
  说明:操作数向右移位,最低位被挤入进位位中,用原来操作数的最高位来补充最高位
  • 逻辑左移
  SHL 操作数,移位次数
  说明:操作数向左移位,最高位被挤入进位位中,用0来补充最低位
  • 逻辑右移
  SHR 操作数,移位次数
  说明:操作数向右移位,最低位被挤入进位位中,用0来补充最高位

闭环移位指令

  • 含进位的循环左移
  RCL 操作数,移位次数
  说明:操作数向左移位,最高位被挤入进位位中,用原来的进位位来补充最低位
  • 含进位的循环右移
  RCR 操作数,移位次数
  说明:操作数向右移位,最低位被挤入进位位中,用原来进位位来补充最高位
  • 不含进位的循环左移
  ROL 操作数,移位次数
  说明:操作数向左移位,最高位被挤入操作数的最低位,同时最高位进入进位位,用操作数的次高位补充最高位
  • 不含进位的循环右移
  ROR 操作数,移位次数
  说明:操作数向右移位,最低位被挤入操作数的最高位,同时最低位进入进位位,用操作数的次低位补充最低位。

计基2—riscv指令集介绍与汇编(代码片段)

...够更好地理解如何搭建CPU,首先需要对RISC-V指令集有基本的了解。该文章大部分图片来自彭东老师的计算机基础实战。什么是指令集?先来看一个问题,什么是指令集?或者说,什么是指令?我们都知道&#x... 查看详情

mips汇编指令集(代码片段)

MIPS汇编MIPS指令集MIPS指令集属于精简指令集MIPS的所有指令都是32位,指令格式简单,而X86的指令长度不是固定的。简单的指令和格式易于译码和流水线操作,但是代码密度不高,导致二进制文件大MIPS有32个通用寄... 查看详情

thumb指令集程序示例(代码片段)

...ARM状态,一种Thumb状态。 本节课主要介绍Thumb状态及Thumb指令集。在012_relocate的程序基础上修改,创建013_thumb_014_003程序,并打开start.S和Makefile代码。1.对Makefile文件进行如下修改。 1all:led_on2.ouart.oinit.omain.ostart.o23#arm 查看详情

idaproarm指令集和thumb指令集的切换(代码片段)

... 类似下面这样: B6FC7DD0明显反汇编错了,成SVCMI指令了,解决方法也很简单,这里记录一下!在IDA中可以Edit->segments->ch 查看详情

指令集基本原理

指令集体系结构----程序员或编译器编写人员能够看到的计算机部分。指令集体系结构包括:1.对各种指令集进行了分类,并对各种方法的优势和劣势进行某种量化评估。2.对一些指令集测量数据进行分析。3.语言与编译器问题以... 查看详情

节:区分栈的指令集架构和寄存器的指令集架构(代码片段)

...,大家要知道一点,就是Java编译器输入的指令流基本上是一种基于栈的指令集架构,而另外一种指令集架构则是基于寄存器的指令集架构。从这点也能看出,指令集的架构模型一共分为两种,一种是基于栈的... 查看详情

基于栈的指令集与基于寄存器的指令集(代码片段)

Java编译器输出的指令流,基本上[1]是一种基于栈的指令集架构,它们依赖操作数栈进行工作与之相对的另外一套常用的指令集架构是基于寄存器的指令集举个最简单的例子,分别使用这两种指令集计算“1+1”的结果,基于... 查看详情

arm体系结构和汇编指令(代码片段)

...是一款CPU的本质特征不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU之间相互移植使用汇编编程可以充分发挥CPU的设计特点,所以汇编编 查看详情

stm32学习-嵌入式微处理器指令集架构(代码片段)

...中与程序设计相关的一部分,包含了一系列的机器指令,基本数据类型,寄存器,寻址模式,存储体系,终端和异常处理等。是计算机软硬件之间的接口,整个计算机系统建立在指令集架构之上。每个指令集架构都有各自的开发... 查看详情

arm汇编基础上(代码片段)

ARM是一个精简指令集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU... 查看详情

8086汇编第一部分:基本概念(代码片段)

...1.1本节内容本节主要内容是有关8086汇编语言程序设计的基本概念。 二8086CPU的基本知识2.1汇编语言机器语言的晦涩和难以阅读催生了汇编语言。汇编语言使用助记符来表示各种二进制指令,便于人们的阅读。因为机器只能够... 查看详情

第四周学习总结(代码片段)

第四周学习总结Y86-64指令集体系结构可见状态:程序寄存器、条件码、程序状态、程序计数器和内存比如条件码ZF——零标志,SF——符号,OF——有符号Y86-64指令整数操作指令:addq、subq、andq、xorq跳转指令:jmp、jle、jl、je、jne、... 查看详情

指令系统的性能决定了计算机的基本功能(代码片段)

指令系统的性能决定了计算机的基本功能,它的设计直接关系到计算机的硬件结构和用户的需要。一个完善的指令系统应满足如下四方面的要求:完备性指用汇编语言编写各种程序时,指令系统直接提供的指令足够使用,而不必... 查看详情

lc-3汇编语言指令集(代码片段)

LC-3汇编语言指令集LC-3汇编语言运算类指令ADD(addition)AND(Bit-wiselogicalAND)NOT(Bit-wisecomplement)LD(load)ST(store)LDI(loadindirect)STI(storeindirect)LDR(loadbase+offset)STR(storebase+offset)LEA(loadeffectiveaddress)BR(conditionalbranch)JMP(jump)RET(return)JSR(jumptos... 查看详情

精简指令集和复杂指令集及指令格式(代码片段)

5.1介绍CISC:复杂指令集RISC:精简指令集5.1.1CPU模型复杂指令集和精简指令集取决于CPU中的控制器的NN=111(8051)复杂指令集N=34(ARM)精简指令集SWAP(1)<--->MOV(3)2/8定律5.1.2编程语言编程语言分为编译型和解释行编译型:... 查看详情

linux常用的基本命令(java程序员入门必备)(代码片段)

文章目录如何创建用户🚩ls指令🚩pwd指令🚩cd指令🚩touch指令🚩mkdir指令🚩cat指令🚩rm指令(谨慎)🚩cp指令🚩mv指令🚩man指令🚩常用查看文件指令less指令🚩head指令🚩 查看详情

android逆向之--------常见davlik字节码解释(代码片段)

破解流程破解流程相关知识寄存器复杂指令集和精简指令集jvm和davlik的一些区别常见Davlik字节码解释破解程序分析修改smail文件重新签名破解流程破解Android程序流程:反编译—>分析–>修改–>回编译–>签名,这... 查看详情

airsim图像数据集收集(代码片段)

...m图像数据集收集前言一、本文实现的效果二、环境依赖1.基本说明2.安装依赖三、程序实现1.基本说明2.implementation总结下篇预告前言从该文开始为视觉目标检测做准备,本文介绍一种半自动收集数据集的方法。一、本文实现... 查看详情