常用的汇编指令

本文详细介绍了汇编语言中的基本指令集,包括逻辑运算、算术运算、数据传输及标志位操作等核心内容。此外,还介绍了不同类型的传送指令及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



and 与运算

or 或运算

xor 异或运算

not 取反

test 测试(两操作数作与运算,仅修改标志位,不回送结果)

shl 逻辑左移

sal 算术左移(=shl)

shr 逻辑右移

sar 算术右移(=shr)

rol 循环左移

ror 循环右移

rol 通过进位的循环左移

rcr 通过进位的循环右移

以上八种移位指令,其移位次数可达255次。

移位一次时,可直接用操作码,如shl ax,1

移位>1次时,则由寄存器cl给出移位次数

如mov cl,04

     shl ax,cl

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中去)


数据传输指令:它们在存储器和寄存器、寄存器和输入输出端口之间传送数据。

1,通用数据传送指令

mov传送字或字节

movsx先符号扩展,在传送

movzx 先0扩展,再传送

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,输入输出端口传送指令

inI/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:dl

lfs传送目标指针,把指针内容装入fs
例:lfs di,string; 把段地址:偏移地址存到fs:dl

lgs传送目标指针,把指针内容装入gs
例:lgs di,string; 把段地址:偏移地址存到gs:dl

lss传送目标指针,把指针内容装入ss
例:lss di,string; 把段地址:偏移地址存到ss:dl



4,标志传送指令

lahf标志寄存器传送,把标志装入ah

sahf标志寄存器传送,把ah内容装入标志寄存器

pushf标志入栈

popf标志出栈

pushd32位标志入栈

popd32位标志出栈


<think>首先,用户的问题是:“我想获取STM32常用汇编指令列表或相关参考资料 请问STM32微控制器常用汇编指令大全”。这是一个关于STM32微控制器汇编指令的查询。 根据系统级指令,我需要: 1. 所有行内数学表达式使用$...$格式。 2. 独立公式使用$$...$$格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考提供的引用: - 引用[1]: 关于STM32微控制器简介,包括特点、开发流程等。[^1] - 引用[2]: 关于STM32下的LibUSB集成,提到启动文件和系统初始化。[^2] - 引用[3]: 关于STM32 Cortex微控制器的程序调试和下载接口,提到Bootloader。[^3] - 引用[4]: 关于STM32单片机的汇编指令示例,提供了一些汇编代码片段。[^4] 用户的问题集中在汇编指令上,所以引用[4]最相关,因为它直接提到了汇编指令。其他引用提供了一些背景信息,但可能不直接相关。 我的回答应该结构清晰,逐步解决问题: 1. **理解问题**:用户想要STM32常用汇编指令列表或参考资料。 2. **提供信息**:基于引用[4],它给出了一个汇编代码片段,包括指令如ldr, str, sub, cmp, bgt, b。我可以扩展这个列表。 - 常见的ARM汇编指令(因为STM32基于ARM Cortex-M架构)包括:LDR, STR, MOV, ADD, SUB, CMP, B, BL, BX, PUSH, POP, 等。 - 引用[4]中的例子:ldr r3, [r9],#4 ; str r3, [r7], #4 ; sub r8, r8, #4 ; ldrb r3, [r9], #1 ; strb r3, [r7], #1 ; sub r8, r8, #1 ; cmp r8, #0 ; bgt __CopyFromStart ; b __JumpToBootImage 3. **组织回答**: - 介绍STM32汇编指令的背景:STM32使用ARM指令集,具体是Thumb-2指令集。 - 列出常用指令:提供一些常见的汇编指令列表。 - 提供参考资料:建议官方文档或在线资源。 - 添加引用:在相关部分末尾添加引用标识。 4. **生成相关问题**:在回答后添加相关问题部分。 5. **格式**: - 行内数学:如果有数学表达式,用$...$,但汇编指令不是数学,所以可能不需要。 - 独立公式:可能没有需要。 - 使用中文:整个回答用中文。 - 引用:在引用内容末尾加[^数字]。 参考引用[4],它说:“对于arm汇编指令,可以参考linux内核的arch/arm目录,那里的汇编指令很丰富[gliethttp_20080603]”,并提供了代码片段。所以,我可以基于这个建议。 真实可靠的回答:我应该确保信息准确。STM32使用ARM Cortex-M架构,其汇编指令基于Thumb-2指令集。常见指令包括数据传送、算术、逻辑、分支等。 回答结构: 1. **引言**:简要解释STM32汇编指令的背景。 2. **常用指令列表**:列出一些常见的ARM汇编指令,并解释。 3. **参考资料**:提供获取更多信息的资源。 4. **相关问题**:生成相关问题。 在引用内容末尾加引用标识。例如,如果提到引用中的信息,加[^4]。 最终回答应结束于相关问题部分。</think>### STM32微控制器常用汇编指令详解 STM32微控制器基于ARM Cortex-M处理器架构,其汇编语言使用Thumb-2指令集(一种16位/32位混合指令集)。汇编指令在底层开发、启动文件优化或性能关键场景中非常重要。以下我将基于可靠参考资料,逐步介绍STM32常用汇编指令列表、示例和相关资源。汇编指令主要用于寄存器操作、内存访问和控制流,核心指令集由ARM架构定义。 #### 1. **常用汇编指令列表** Thumb-2指令集包括数据传送、算术运算、逻辑运算、分支控制等类别。以下是STM32开发中最常用汇编指令(以ARM汇编语法为准): - **数据传送指令**: - `LDR`:从内存加载数据到寄存器,例如:`LDR R0, [R1]`(将R1指向的内存值加载到R0)。 - `STR`:将寄存器值存储到内存,例如:`STR R0, [R1]`(将R0的值存储到R1指向的内存)。 - `MOV`:在寄存器间移动数据,例如:`MOV R0, R1`(将R1的值复制到R0)。 - `PUSH`/`POP`:压栈和出栈操作,用于函数调用上下文保存,例如:`PUSH {R0, R1}`(将R0和R1压入栈)。 - **算术运算指令**: - `ADD`:加法,例如:`ADD R0, R1, R2`(R0 = R1 + R2)。 - `SUB`:减法,例如:`SUB R0, R1, #4`(R0 = R1 - 4)。 - `MUL`:乘法,例如:`MUL R0, R1, R2`(R0 = R1 * R2)。 - **逻辑运算指令**: - `AND`:按位与,例如:`AND R0, R1, R2`(R0 = R1 & R2)。 - `ORR`:按位或,例如:`ORR R0, R1, R2`(R0 = R1 | R2)。 - `EOR`:按位异或,例如:`EOR R0, R1, R2`(R0 = R1 ^ R2)。 - **分支控制指令**: - `B`:无条件分支(跳转),例如:`B label`(跳转到标签处)。 - `BL`:带链接的分支(用于函数调用),例如:`BL function`(调用函数并保存返回地址)。 - `BX`:分支并交换指令集(常用于切换模式),例如:`BX LR`(跳转到链接寄存器地址)。 - `CMP`:比较寄存器值,设置条件标志,例如:`CMP R0, R1`(比较R0和R1)。 - 条件分支指令:如`BGT`(大于时跳转)、`BEQ`(等于时跳转)、`BLT`(小于时跳转),例如:`CMP R0, #0` 后跟 `BGT loop`(如果R0 > 0则跳转到loop)。 - **其他常用指令**: - `NOP`:空操作(用于延时或对齐)。 - `LDRB`/`STRB`:加载/存储字节(8位数据),例如引用中的 `ldrb r3, [r9], #1`(从R9指向的内存加载一个字节到R3,并后递增R9)[^4]。 - `SUB` 与立即数操作:如 `sub r8, r8, #1`(R8减1)[^4]。 这些指令覆盖了STM32启动文件(如`startup_stm32xx.s`)和底层驱动中的常见操作。完整指令集可参考ARM官方文档。 #### 2. **示例代码片段** 以下是一个简单的STM32汇编代码示例,展示指令的实际使用(基于引用中的启动文件代码)。此代码常用于内存复制操作: ```assembly __CopyFromStart: LDRB R3, [R9], #1 ; 从R9地址加载一个字节到R3,R9后递增1 STRB R3, [R7], #1 ; 将R3的值存储到R7地址,R7后递增1 SUB R8, R8, #1 ; R8减1(计数器递减) CMP R8, #0 ; 比较R8是否等于0 BGT __CopyFromStart ; 如果R8 > 0,则跳回__CopyFromStart B __JumpToBootImage ; 否则跳转到__JumpToBootImage ``` 此代码演示了循环复制数据的过程,涉及`LDRB`、`STRB`、`SUB`、`CMP`和`BGT`指令[^4]。 #### 3. **相关参考资料** 要获取完整的汇编指令大全,建议参考以下资源(确保信息真实可靠): - **ARM官方文档**:ARM Cortex-M系列参考手册(如[ARMv7-M Architecture Reference Manual](https://developer.arm.com/documentation/ddi0403/latest/)),包含所有指令的详细描述和编码。 - **STM32启动文件**:STM32固件库(如HAL库或标准外设库)中的`startup_stm32xx.s`文件(例如`startup_stm32f4xx.s`),提供汇编实现的初始化代码[^2]。 - **Linux内核参考**:如引用所述,Linux内核的`arch/arm`目录包含丰富的ARM汇编示例,适用于学习复杂指令用法[^4]。 - **在线教程和书籍**: - 《ARM汇编语言入门》(中文资源,适合初学者)。 - STMicroelectronics官网的[STM32编程手册](https://www.st.com),搜索“Cortex-M assembly”。 - **开发工具**:使用Keil MDK或STM32CubeIDE调试器,可单步执行汇编代码并查看指令效果。 注意:在STM32开发中,汇编常用于启动文件或优化关键路径,但高级应用(如Bootloader)可能涉及更多指令(如USART或USB通信相关操作)[^3]。 #### 4. **注意事项** - **指令集兼容性**:STM32不同系列(如F1/F4/H7)均使用Thumb-2指令集,指令一致。 - **性能优化**:汇编指令可提升实时性,但建议优先使用C语言,仅在必要时内嵌汇编。 - **学习建议**:从STM32启动文件入手,结合调试器实践,以加深理解。 如果您有具体STM32型号或应用场景,我可以提供更针对性的示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值