汇编常用指令

article/2025/10/11 22:44:05

通用寄存器及使用

IA-32系列有8个32位通用寄存器,名称分别为:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI,如图:

image-20181005131233985

简单传送指令

指令中文名格式解释备注
MOV传送指令MOV DEST,SRCDEST<=SRC
XCHG交换指令XCHG OPER1,OPER2把操作数oper1的内容与操作数oper2的内容交换oper1和oper2可以是通用寄存器或存储单元,但不能同时是操作单元,也不能是立即数。

简单加减指令

指令中文名格式解释备注
ADD加法指令ADD DEST,SRCDEST<=DEST SRC两数相加
SUB减法指令SUB DEST,SRCDEST<=DEST-SRC两数相减
INC加1指令INC DESTDEST<=DEST 1
DEC减1指令DEC DESTDEST<=DEST-1
NEG取补指令NEG OPRDOPRD=0-OPRD对操作数取补(相反数)

标志寄存器及其使用

状态标志

标志中文名解释
CF(carry flag)进位标志主要反映算术运算是否产生进位或借位,若产生,则CF=1,否则CF=0
ZF零标志反映运算结果是否为0
SF(sign flag)符号标志根据运算结果的最高位,若最高位为1则SF为1,否则为0,反映了有符号数运算结果的正负(0正1负)
OF(overflow flag)溢出标志反映有符号数运算结果是否产生溢出,是置1,否置0
PF(parity flag)奇偶标志偶数置1奇数置0
AF辅助进位标志

状态标志操作指令

指令中文名格式解释
CLC(clear carry flag)清进位标志指令CLC使进位标志CF为0
STC(set carry flag)置进位标志指令STC使进位标志CF为1
CMC(complement carry flag)进位标志取反指令CMC使进位标志CF取反
LAHF(load status flags into AH register)获取状态标志操作指令LAHF把位于标志寄存器低端的5个状态标志位(p26图2.3)信息同时送到寄存器AH的对应位
SAHF(store AH into Flags)设置状态标志操作指令SAHF对标志寄存器中的低8位产生影响,使得状态标志位SF、ZF、AF、PF和CF分别成为来自寄存器AH中对应位的值,但保留位(位1、位3、位5)不受影响

带进位加减指令

指令中文名格式解释备注
ADC(add with carry)带进位加法指令ADC DEST,SRCDEST<=DEST SRC CF与add指令不同之处是要再加上进位标志cf的值
SBB(substraction with borrow)带借位减法SBB DEST,SRCDEST<=DEST-(SRC CF)与sub指令不同之处是要再减上借位标志cf的值

取有效地址指令

指令中文名格式解释备注
LEA(load effective address)取有效地址指令LEA REC,OPRD把操作数oprd的有效地址传送到操作数rec,源操作数oprd必须是一个存储器操作数,目的操作数rec必须是一个16位或32位的通用寄存器与mov指令的区别:mov:移动地址中的值lea:将地址进行移动

指令指针寄存器和简单控制转移指令

常用条件转移指令

location:p45

image-20181005201637040

指令中文名格式解释备注
CMP比较指令CMP DEST,SRC根据dest-src的差影响各状态标志寄存器不把dest-src的结果送入dest
JMP无条件段内直接转移指令JMP LABEL使控制无条件地转移到标号为label的位置无条件转移指令本身不影响标志

堆栈和堆栈操作

指令中文名格式解释备注
PUSH进栈指令PUSH SRC把源操作数src压入堆栈源操作数src可以是32位通用寄存器、16位通用寄存器和段寄存器,也可以是双字存储单元或者字符存储单元,还可以是立即数
POP出栈指令POP DEST从栈顶弹出一个双字或字数据到目的操作数如果目的操作数是双字的,那么就从栈顶弹出一个双字数据,否则,从栈顶弹出一个字数据,出栈至少弹出一个字(16位)
PUSHA16位通用寄存器全进栈指令PUSHA将所有8个16位通用寄存器的内容压入堆栈压入顺序是AX CX DX BX SP BP SI DI,然后对战指针寄存器SP的值减16,所以SP进栈的内容是PUSHA指令执行之前的值
POPA16位通用寄存器全出栈指令POPA以PUSHA相反的顺序从堆栈中弹出内容,从而恢复PUSHA之前的寄存器状态SP的值不是由堆栈弹出的,而是通过增加16来恢复
PUSHAD32位通用寄存器全进栈指令PUSHAD将所有8个32位通用寄存器的内容压入堆栈压入顺序是EAX ECX EDX EBX ESP EBP ESI EDI,然后对战指针寄存器SP的值减32,所以SP进栈的内容是PUSHAD指令执行之前的值
POPAD32位通用寄存器全出栈指令POPAD以PUSHAD相反的顺序从堆栈中弹出内容,从而恢复PUSHAD之前的寄存器状态ESP的值不是由堆栈弹出的,而是通过增加32来恢复

过程调用和返回指令

指令中文名格式解释备注
CALL过程调用指令CALL LABEL段内直接调用LABEL与jmp的区别在于call指令会在调用label之前保存返回地址(call 中return之后主程序还可以继续执行,jmp 当label执行完毕后不能返回主程序继续执行)
RET段内过程返回指令RET使子程序结束,继续执行主程序

算术逻辑运算指令

指令中文名
MUL无符号数乘法指令
IMUL有符号数乘法指令
IMUL DEST,SRC有符号数乘法指令
IMUL DEST,SRC1,SRC2有符号数乘法指令
DIV无符号数除法指令
IDIV OPRD有符号数除法指令

符号拓展指令

指令中文名格式解释
CBW字节转化为字指令CBW把寄存器AL中的值符号拓展到寄存器AH
CWD字转化为双字指令CWD把寄存器AX中的值符号拓展到寄存器DX
CDQ双字转化为四字指令CDQ把寄存器EAX中的值符号拓展到EDX
CWDE字转化为双字指令CWDE把AX中的值符号拓展到EAX的高16位

拓展传送指令

指令中文名格式解释备注
MOVSX符号拓展传送指令MOVSX DEST,SRC把源操作数SRC符号拓展后送至目的操作数DESTsrc可以是通用寄存器或者存储单元,但是dest只能是通用寄存器(零拓展传送指令不会改变源操作数,也不影响标志寄存器的状态)
MOVZXMOVZX DEST,SRC把源操作数SRC零拓展后送至目的操作数DEST零拓展传送指令不会改变源操作数,也不影响标志寄存器的状态

逻辑运算指令

指令中文名格式解释备注
NOT否运算指令NOT OPRD把操作数OPRD按位取反,然后送回OPRD
AND与运算指令AND DEST,SRC把两个操作数进行与运算之后结果送回DEST同1得1,否则得0
OR或运算指令OR DEST,SRC把两个操作数进行或运算之后结果送回DEST同0得0,否则得1
XOR异或运算XOR DEST,SRC把两个操作数进行异或运算之后结果送回DEST相同得0不同得1
TEST测试指令TEST DEST,SRC与AND指令类似,将各位相与,但是结果不送回DEST,仅影响状态位标志,指令执行后,ZF、PF、SF反映运算结果,CF和OF被清零通常用于检测某些位是否为1,但又不希望改变操作数的值

移位指令

一般移位指令

指令中文名格式解释备注
SAL算术左移SAL OPRD,count把操作数oprd左移count位,右边补0与shl指令一样
通过截取count的低5位,实际的移位数被限于0到31之间。
SHL逻辑左移SHL OPRD,count把操作数oprd左移count位,右边补0与sal指令一样
通过截取count的低5位,实际的移位数被限于0到31之间。
SAR算术右移SAR OPRD,count把操作数oprd右移count位,同时每右移一位,左边补符号位,移出的最低位进入标志位CF通过截取count的低5位,实际的移位数被限于0到31之间。
SHR逻辑右移SHR OPRD,count把操作数oprd右移count位,左边补0,移出的最低位进入标志位CF通过截取count的低5位,实际的移位数被限于0到31之间。

循环移位指令

指令中文名格式解释备注
ROL左循环移位指令ROL OPRD,count通过截取count的低5位,实际的移位数被限于0到31之间。
ROR右循环移位指令ROR OPRD,count通过截取count的低5位,实际的移位数被限于0到31之间。
RCL带进位左循环移位RCL OPRD,count相当于CF在最高位参与循环移位大循环左移
通过截取count的低5位,实际的移位数被限于0到31之间。
RCR带进位右循环移位RCR OPRD,count相当于CF在最高位参与循环移位大循环右移
通过截取count的低5位,实际的移位数被限于0到31之间。

循环指令

指令中文名格式解释备注
LOOP计数循环指令LOOP LABEL使ECX的值减1,当ECX的值不为0的时候跳转至LABEL,否则执行LOOP之后的语句
LOOPE等于循环指令LOOPE LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于1(表示相等),那么就转移到LABEL,否则执行LOOPE之后的语句
LOOPZ零循环指令LOOPZ LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于1(表示相等),那么就转移到LABEL,否则执行LOOPZ之后的语句
LOOPNE不等于循环指令LOOPE LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于0(表示不相等),那么就转移到LABEL,否则执行LOOPNE之后的语句
LOOPNZ非零循环指令LOOPNZ LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于0(表示不相等),那么9就转移到LABEL,否则执行LOOPNZ之后的语句
JECXZ计数转移指令JECXZ LABEL当寄存器ECX的值为0时转移到LABEL,否则顺序执行通常在循环开始之前使用该指令,所以循环次数为0时,就可以跳过循环体

http://chatgpt.dhexx.cn/article/5WVVioq1.shtml

相关文章

第一章 汇编语言和汇编指令

【用最少的指令来实现功能】 自用 文章基于《计算机体系结构新讲》&#xff08;中国地质大学出版社&#xff09; 目录 一、汇编指令 &#xff08;1&#xff09;MIPS汇编指令示例解析 &#xff08;2&#xff09;MIPS指令集 二、汇编指令中的操作数 &#xff08;1&#xff0…

pic单片机汇编 c语言,PIC单片机汇编语言指令详解

PIC单片机汇编语言指令详解 pic单片机为最常用单片机之一&#xff0c;许多程序均基于pic单片机进行开发。因此&#xff0c;熟练pic单片机编程尤为重要。为保证大家能准确、熟练掌握pic单片机的使用&#xff0c;本文特带来pic单片机的各种汇编语言指令的讲解。 一、pic的指令系统…

汇编:汇编指令分类

文章目录 一、指令分类二、伪指令1、assume2、segment、ends3、end 三、汇编指令1、退出程序指令2、中断2.1、概念2.2、中断的分类2.3、本质2.4、中断指令 3、call、ret 四、指令处理的数据长度 使用汇编语言编写一个完整的程序&#xff0c;步骤大致如下&#xff1a; 1、编写源…

汇编语言指令及七种寻址方式指令实现

指令讲解 进入debug模式后&#xff1a;&#xff08;进入debug模式之前的讲解 可以参考我的另一篇博文&#xff1a;masm5.0运行 -u::显示机器指令和汇编指令 -d:显示的具体数据 内存单元内容查看 -r:查看寄存器内容 -r&#xff1a;修改寄存器的内容 如修改ax寄存器的值为12…

微机原理之汇编语言指令集

汇编语言指令集 1.1 概述1.1.1 指令集体系结构、机器指令和符号指令1.1.2 符号指令的书写格式 1.2 操作数1.2.1 通用寄存器中的操作数1.2.2 段寄存器和指令指针寄存器1.2.3 标志寄存器 1.3 寻址方式1.3.1 立即寻址1.3.2 寄存器寻址1.3.3存储器操作数寻址1.3.3.1 直接寻址1.3.3.…

MIPS汇编语言指令

MIPS汇编语言指令 寄存器指令集指令格式R型指令I型指令J型指令 寄存器 寄存器在MIPS体系结构中有32个通用寄存器&#xff0c;在汇编程序中可以用编号表示&#xff0c;$0~31 &#xff0c; 也 可 以 用 名 称 表 示 &#xff0c; 如31&#xff0c;也可以用名称表示&#xff0c;如…

汇编常见指令

文章目录 常见的运算类汇编指令add指令sub指令mul乘法指令div除法指令inc&#xff08;自增&#xff09;&#xff08;即C语言&#xff09;dec&#xff08;自减&#xff09;&#xff08;即–&#xff09;push&#xff08;入栈&#xff09;pop&#xff08;出栈&#xff09;and&…

log4j的ConversionPattern

log4j的ConversionPattern参数的意义 http://lizhou.iteye.com/blog/939154 博客分类&#xff1a; java log4j 多线程 Apache Tomcat F# &#xff0d;X: X信息输出时左对齐 %p: 输出日志信息优先级&#xff0c;即DEBUG&#xff0c;INFO&#xff0c;WARN&#xff0c;ERROR&am…

log4j的ConversionPattern参数的意义

1、常用标志&#xff1a; &#xff0d;X: X信息输出时左对齐 %p: 输出日志信息优先级&#xff0c;即DEBUG&#xff0c;INFO&#xff0c;WARN&#xff0c;ERROR&#xff0c;FATAL, %d: 输出日志时间点的日期或时间&#xff0c;默认格式为ISO8601&#xff0c;也可以在其后指定…

conversionpattern(conversionpattern 自定义字段)

请教以下log4j 日志文件不会弄啊。 直接在Myeclipse中编辑properties 文件的时候不能使用中文的。你可以下载个插件&#xff0c;或者干脆在外边编辑~~你用一个类去读&#xff0c;然后在里面用logger去执行&#xff0c;在log4j的配置文件里面针对这个类配置一个把日志写到文件里…

log4j的配置ConversionPattern详细讲解

原文来自https://blog.csdn.net/reserved_person/article/details/52849505感谢大佬 先写下我一直没找到的ConversionPattern里面参数代表的详细含义 参数说明例子%c列出logger名字空间的全称&#xff0c;如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间log…

零阶保持器(ZOH)与一阶低通滤波器频率特性分析

1.零阶保持器&#xff08;ZOH&#xff09;频率特性分析 零阶保持器传递函数&#xff1a; 画 Bode 图进行频率分析&#xff1a; stf(s); T0.0002; %采样周期0.0002s G(1-exp(-T*s))/s; bode(G); 从图中可以看出&#xff1a;随着频率 ω 的的增加&#xff0c;当 ω 在 10000 附…

一阶低通滤波器、功能触发、周期性触发的simulink模型

01--概述 主要简单叙述在基于模型的过程中比较常用的一些算法&#xff0c;一个是一阶低通滤波器&#xff0c;一个是功能触发&#xff0c;另外一个是周期性触发。会简单介绍下这些算法的应用。 02--一阶低通滤波器 其计算公式为&#xff1a;Y(n) A*X(n) (1−A)*Y(n-1) A滤…

一阶低通滤波器的传递函数分析

一、无源一阶低通滤波器分析 由图可以知道&#xff0c;输入信号为Vi,输出函数为Vo&#xff0c; 电阻R的阻抗为R&#xff0c;C电容C阻抗为1/jwC&#xff0c;Vo实际上是Vi在电容C上的分压&#xff0c;则有&#xff1a; 则有&#xff1a; 将jwS变换得到&#xff1a; 再令Vo/Vin 表…

数字 一阶低通滤波器 详细分析 冰三点水

数字 一阶低通滤波器 详细分析 作者&#xff1a;冰三点水 原创内容&#xff0c;转帖请注明出处&#xff1a; http://blog.csdn.net/u013608300/article/details/78814693 微信公众号&#xff1a;工程师看海 事件的起因是下图1&#xff0c;朋友偶然说到一阶低通滤波器&#x…

一阶低通滤波器的数字实现

关于一阶低通滤波器这里就不再赘述了&#xff0c;讲的帖子也挺多&#xff0c;这里记录一下一阶低通滤波器的传递函数与数字实现之间的系数转换。 一阶低通滤波器的传递函数常见为&#xff1a; 其中Tf为RC&#xff0c;并且有&#xff1a; 其中fwres为截止频率。 常用的数字滤波…

了解一阶低通滤波器传递函数

自动控制原理的内容很高深要逐步地学习 一阶RC滤波器的算法实现&#xff08;低通和高通&#xff09; https://blog.csdn.net/qq_27158179/article/details/82661297 了解一阶低通滤波器传递函数 https://blog.csdn.net/qq_27334499/article/details/52186336 最近&#xf…

一阶低通滤波器在stm32中的简单应用

首先来看一个最简单的一阶低通滤波器的电路模型&#xff1a; 不难推出它的传递函数&#xff1a; Tf与滤波器截止频率有关&#xff0c;但是实际程序中会变成一个参数&#xff0c;此时我们可以忽略它。 然而&#xff01;我们的stm32接收到的信号是一串序列&#xff08;离散信号&a…

数字一阶低通滤波器simulink仿真

数字一阶低通滤波器simulink仿真 原理程序所用公式滤波系数计算方法 仿真根据公式搭建使用simulink自带模型 原理 程序所用公式 y(n) q*x(n) (1-q)*y(n-1) 其中&#xff0c;y(n)表示当前的输出&#xff0c;x(n)表示当前的输入&#xff0c;y(n-1)表示上一次的输出&#xff0…