嵌入式硬件篇---常用的汇编语言指令

news/2025/2/28 12:13:49/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • 前言
  • 汇编语言简介
  • 1. 数据传送指令
    • MOV
    • PUSH
    • POP
    • XCHG
  • 2. 算术运算指令
    • ADD
    • SUB
    • MUL
    • DIV
    • INC
    • DEC
  • 3. 逻辑运算指令
    • AND
    • OR
    • XOR
    • NOT
    • SHL/SHR
  • 4. 控制转移指令
    • JMP
    • CALL
    • RET
    • JE/JZ
    • JNE/JNZ
    • JG/JNLE
    • JL/JNGE
  • 5. 比较与测试指令
    • CMP
    • TEST
  • 6. 标志寄存器操作指令
    • STC
    • CLC
    • STD
    • CLD
  • 7. 字符串操作指令
    • MOVS
    • LODS
    • STOSB
    • REP
  • 8. 输入输出指令
    • IN
    • OUT
  • 9. 处理器控制指令
    • NOP
    • HLT
    • INT
    • IRET
  • 10. 其他常用指令
    • LEA
    • NEG
  • 总结
  • 总结


前言

本文仅仅简单介绍了汇编语言中常用的指令。


汇编语言简介

汇编语言是一种低级编程语言c;与机器语言非常接近࿰c;通常用于编写底层系统软件或优化性能关键代码汇编语言指令与CPU架构密切相关࿰c;不同架构(如x86、ARM、MIPS等)的指令集不同。以下是常见的汇编语言指令分类及其功能介绍:

1. 数据传送指令

用于在寄存器、内存和I/O端口之间传输数据。

MOV

ckquote>

MOV:将数据从源操作数复制到目标操作数。
MOV AX, BX ; 将BX的值复制到AX

ckquote>

PUSH

ckquote>

PUSH:将数据压入栈。
PUSH AX ; 将AX的值压入栈

ckquote>

POP

ckquote>

POP:从栈中弹出数据。
POP BX ; 将栈顶数据弹出到BX

ckquote>

XCHG

ckquote>

XCHG:交换两个操作数的值。
XCHG AX, BX ; 交换AX和BX的值

ckquote>

2. 算术运算指令

用于执行基本的算术运算

ADD

ckquote>

ADD:将两个操作数相加。
ADD AX, BX ; AX = AX + BX

ckquote>

SUB

ckquote>

SUB:将两个操作数相减。
SUB AX, BX ; AX = AX - BX

ckquote>

MUL

ckquote>

MUL:无符号乘法。
MUL BX ; AX = AX * BX(结果存储在DX:AX中)

ckquote>

DIV

ckquote>

DIV:无符号除法。
DIV BX ; AX = AX / BX(商在AX࿰c;余数在DX)

ckquote>

INC

ckquote>

INC:将操作数加1。
INC AX ; AX = AX + 1

ckquote>

DEC

ckquote>

DEC:将操作数减1。
DEC AX ; AX = AX - 1

ckquote>

3. 逻辑运算指令

用于执行逻辑操作。

AND

ckquote>

AND:按位与操作。
AND AX, BX ; AX = AX & BX

ckquote>

OR

ckquote>

OR:按位或操作。
OR AX, BX ; AX = AX | BX

ckquote>

XOR

ckquote>

XOR:按位异或操作。
XOR AX, BX ; AX = AX ^ BX

ckquote>

NOT

ckquote>

NOT:按位取反操作。
NOT AX ; AX = ~AX

ckquote>

SHL/SHR

ckquote>

SHL/SHR:逻辑左移/右移。
SHL AX, 1 ; 将AX左移1位
SHR AX, 1 ; 将AX右移1位

ckquote>

4. 控制转移指令

用于改变程序的执行流程

JMP

ckquote>

JMP:无条件跳转。
JMP label ; 跳转到label处

ckquote>

CALL

ckquote>

CALL:调用子程序。
CALL func ; 调用func函数

ckquote>

RET

ckquote>

RET:从子程序返回。
RET ; 返回到调用者
条件跳转指令:根据标志寄存器状态跳转。

ckquote>

JE/JZ

ckquote>

JE/JZ:等于/为零时跳转。
JE label ; 如果ZF=1࿰c;跳转到label

ckquote>

JNE/JNZ

ckquote>

JNE/JNZ:不等于/不为零时跳转。
JNE label ; 如果ZF=0࿰c;跳转到label

ckquote>

JG/JNLE

ckquote>

JG/JNLE:大于时跳转。
JG label ; 如果ZF=0且SF=OF࿰c;跳转到label

ckquote>

JL/JNGE

ckquote>

JL/JNGE:小于时跳转。
JL label ; 如果SF≠OF࿰c;跳转到label

ckquote>

5. 比较与测试指令

用于比较或测试操作数的值。

CMP

ckquote>

CMP:比较两个操作数(相当于SUB࿰c;但不保存结果)。
CMP AX, BX ; 比较AX和BX࿰c;设置标志寄存器

ckquote>

TEST

ckquote>

TEST:按位与操作(不保存结果)。
TEST AX, BX ; AX & BX࿰c;设置标志寄存器

ckquote>

6. 标志寄存器操作指令

用于操作标志寄存器。

STC

ckquote>

STC:设置进位标志(CF=1)。
STC ; CF = 1

ckquote>

CLC

ckquote>

CLC:清除进位标志(CF=0)。
CLC ; CF = 0

ckquote>

STD

ckquote>

STD:设置方向标志(DF=1࿰c;字符串操作从高地址向低地址)。
STD ; DF = 1

ckquote>

CLD

ckquote>

CLD:清除方向标志(DF=0࿰c;字符串操作从低地址向高地址)。
CLD ; DF = 0

ckquote>

7. 字符串操作指令

用于处理字符串或数据块。

MOVS

ckquote>

MOVS:移动字符串(从源地址复制到目标地址)。
MOVSB ; 复制一个字节
MOVSW ; 复制一个字

ckquote>

LODS

ckquote>

LODS:加载字符串到累加器。
LODSB ; 加载一个字节到AL

ckquote>

STOSB

ckquote>

STOS:将累加器的值存储到字符串。
STOSB ; 将AL的值存储到目标地址

ckquote>

REP

ckquote>

REP:重复执行指令(通常与MOVS、LODS、STOS等配合使用)。
REP MOVSB ; 重复复制字节࿰c;直到CX=0

ckquote>

8. 输入输出指令

用于与I/O端口通信。

IN

ckquote>

IN:从I/O端口读取数据。
IN AL, 60h ; 从端口60h读取一个字节到AL

ckquote>

OUT

ckquote>

OUT:向I/O端口写入数据。
OUT 60h, AL ; 将AL的值写入端口60h

ckquote>

9. 处理器控制指令

用于控制CPU行为

NOP

ckquote>

NOP:空操作(用于延时或占位)。
NOP ; 无操作

ckquote>

HLT

ckquote>

HLT:暂停CPU。
HLT ; 暂停CPU

ckquote>

INT

ckquote>

INT:触发软中断。
INT 21h ; 触发中断21h

ckquote>

IRET

ckquote>

IRET:从中断返回。
IRET ; 返回到中断前的状态

ckquote>

10. 其他常用指令

LEA

ckquote>

LEA:加载有效地址。
LEA AX, [BX+SI+10] ; 将BX+SI+10的地址加载到AX

ckquote>

NEG

ckquote>

NEG:取反操作。
NEG AX ; AX = -AX

ckquote>

总结

汇编语言指令直接操作硬件c;因此需要熟悉目标CPU的指令集和寄存器结构。常用的指令包括数据传送、算术运算、逻辑运算、控制转移、字符串操作等。掌握这些指令是编写高效汇编代码的基础。


总结

以上就是今天要讲的内容࿰c;本文仅仅简单介绍了汇编语言中常用的指令。


http://www.ppmy.cn/news/1575499.html

相关文章

微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型

微信小程序的轻量化特性与DeepSeek大模型的AI能力结合,可快速构建智能问答、内容生成等场景化服务。通过火山方舟平台提供的标准化接口,开发者无需深入算法细节即可调用模型能力。 一、注册火山引擎账号,创建API Key和model(接入…

Protobuf原理与序列化

本文目录 1. Protobuf介绍2. Protobuf的优势3. 编写Protobuf头部全局定义消息结构具体定义字段类型定义标签号Base128编码 4. TLVProtobuf的TLV编码如何通过Varint表示300? 5. 编译Protobuf6. 构造消息对象 前言:之前写项目的时候只是简单用了下Protobuf…

sql时间函数

1、adddate—将时间/日期间隔添加到日期 adddate("2015-01-03",INTERVAL 1 day) #2015-01-042、date_add,date_sub—增加/减去指定的时间间隔 date_add("2025-02-27",interval 1 day) #2025-02-28 date_sub("2025-02-27",interval 1 day) #202…

DeepSeek-R1 蒸馏

蒸馏的概念 简介 蒸馏(Distillation,又称模型蒸馏、数据蒸馏、知识蒸馏等)是一种通过大模型(教师模型)生成或优化训练数据,使小模型(学生模型)能够高效学习的技术,其核…

11、ubuntu-22.04安装go的最新版本

卸载 apt 版(防止冲突): sudo apt remove golang-go删除旧的 Go 安装目录(假设安装在 /usr/local/go): sudo rm -rf /usr/local/go sudo apt autoremove下载最新版本 Go 1.24 压缩包: wget h…

解决单元测试 mock final类报错

文章目录 前言解决单元测试 mock final类报错1. 报错原因2. 解决方案3. 示例demo4. 扩展 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0…

C++ 设计模式 十二:责任链模式 (读书 现代c++设计模式)

责任链 文章目录 责任链场景指针链代理链总结**责任链模式的核心思想****何时需要使用责任链模式?****责任链模式解决的核心问题****与其他设计模式的协同使用****与其他模式的对比****经典应用场景****实现步骤与关键点****注意事项****总结** 今天是第十二种设计模…

Android 布局系列(二):FrameLayout 布局的应用

引言 在安卓开发中,布局管理是构建用户界面的核心之一。对于简单的界面或是需要叠加多个视图的场景,FrameLayout 是一个非常实用的布局容器。它是安卓中最基础的布局之一,能够帮助我们轻松管理多个视图的叠加。尽管它没有复杂的排版功能&…