自己归纳整理的ARM THUMB指令机器码表

自己归纳整理的ARM THUMB指令机器码表
自己归纳整理的ARM THUMB指令机器码表

有个项目需要分析ARM THUMB指令的机器码,网上没有搜索到整理好的机器码表,只好自己把相关指令的机器码归纳整理出来,这里分享给大家。THUMB指令并不多,只有六十多条,这个数字真的是非常了不起,51都一百三十多条呢。

可能这张表对于大多数朋友都用不到,毕竟要深入到机器码这一层的机会还是比较少,我想能到这一步的朋友一定对ARM指令有了足够的理解,所以就不对注释做另外的说明,相信你一看就懂。

呵呵,如果你用上了这张表,记得在内心感谢我一下,这可是我从《Addison Wesley - ARM Architecture Reference Manual (2nd Edition)》中一条一条摘录出来的。

v is immed_value

n is Rn

m is Rm

s is Rs

r is register_list

c is condition

表一:按指令字母升序排列

0100 0001 01mm mddd -- ADC Rd,Rm

0001 110v vvnn nddd -- ADD Rd,Rn,#immed_3

0011 0ddd vvvv vvvv -- ADD Rd,#immed_8

0001 100m mmnn nddd -- ADD Rd,Rn,Rm

0100 0100 hhmm mddd -- ADD Rd,Rm h1h2,h1 is msb for Rd,h2 is msb for Rm

1010 0ddd vvvv vvvv -- ADD Rd,PC,#immed_8*4

1010 1ddd vvvv vvvv -- ADD Rd,SP,#immed_8*4

1011 0000 0vvv vvvv -- ADD SP,#immed_7*4

0100 0000 00mm mddd -- AND Rd,Rm

0001 0vvv vvmm mddd -- ASR Rd,Rm,#immed_5

0100 0001 00ss sddd -- ASR Rd,Rs

1101 cccc vvvv vvvv -- Bcc signed_immed_8

1110 0vvv vvvv vvvv -- B signed_immed_11

0100 0011 10mm mddd -- BIC Rd,Rm

1011 1110 vvvv vvvv -- BKPT immed_8

111h hvvv vvvv vvvv -- BL(X) immed_11

0100 0111 1hmm mSBZ -- BLX Rm

0100 0111 0Hmm mSBZ -- BX Rm

0100 0010 11mm mnnn -- CMN Rn,Rm

0010 1nnn vvvv vvvv -- CMP Rn,#immed_8

0100 0010 10mm mnnn -- CMP Rn,Rm

0100 0101 hhmm mnnn -- CMP Rn,Rm

0100 0000 01mm mddd -- EOR Rd,Rm

1100 1nnn rrrr rrrr -- LDMIA Rn!,reg_list

0110 1vvv vvnn nddd -- LDR Rd,[Rn+#immed_5*4]

0101 100m mmnn nddd -- LDR Rd,[Rn,Rm]

0100 1ddd vvvv vvvv -- LDR Rd,[PC+#immed_5*4] 1001 1ddd vvvv vvvv -- LDR Rd,[SP,#immed_8*4] 0111 1vvv vvnn nmmm -- LDRB Rd,[Rn,#immed_5*4] 0101 110m mmnn nddd -- LDRV Rd,[Rn,Rm]

1000 1vvv vvnn nddd -- LDRH Rd,[Rn,#immed_5*2] 0101 101m mmnn nddd -- LDRH Rd,[Rn,Rm]

0101 011m mmnn nddd -- LDRSB Rd,[Rn,Rm]

0101 111m mmnn nddd -- LDRSH Rd,[Rn,Rm]

0000 0vvv vvmm mnnn -- LSL Rd,Rm,#immed_5 0100 0000 10ss sddd -- LSL Rd,Rs

0000 1vvv vvmm mddd -- LSR Rd,Rm,#immed_5 0100 0000 11ss sddd -- LSR Rd,Rs

0010 0ddd vvvv vvvv -- MOV Rd,#immed_8

0001 1100 00nn nddd -- MOV Rd,Rn

0100 0110 hhmm mddd -- MOV Rd,Rm

0100 0011 01mm mddd -- MUL Rd,Rm

0100 0011 11mm mddd -- MVN Rd,Rm

0100 0010 01mm mddd -- NEG Rd,Rm

0100 0011 00mm mddd -- ORR Rd,Rm

1011 110R rrrr rrrr -- POP reg_list

1011 010R rrrr rrrr -- PUSH reg_list

0100 0001 11ss sddd -- ROR Rd,Rs

0100 0001 10mm mddd -- SBC Rd,Rm

1100 0nnn rrrr rrrr -- STMIA Rn!,reg_list 0110 0vvv vvnn nddd -- STR Rd,[Rn,#immed_5*4] 0101 000m mmnn nddd -- STR Rd,[Rn,Rm]

1001 0ddd vvvv vvvv -- STR Rd,[SP,#immed_8*4] 0111 0vvv vvnn nddd -- STRB Rd,[Rn,#immed_5] 0101 010m mmnn nddd -- STRB Rd,[Rn,Rm]

1000 0vvv vvnn nddd -- STRH Rd,[Rn,#immed_5*2] 0101 001m mmnn nddd -- STRH Rd,[Rn,Rm]

0001 111v vvnn nddd -- SUB Rd,Rn,#immed_3 0011 1ddd vvvv vvvv -- SUB Rd,#immed_8

0001 101m mmnn nddd -- SUB Rd,Rn,Rm

1011 0000 1vvv vvvv -- SUB Sp,#immed_7*4

1101 1111 vvvv vvvv -- SWI immed_8

0100 0010 00mm mnnn -- TST Rn,Rm

表二:按指令机器码升序排列

0000 0vvv vvmm mnnn -- LSL Rd,Rm,#immed_5 0000 1vvv vvmm mddd -- LSR Rd,Rm,#immed_5 0001 0vvv vvmm mddd -- ASR Rd,Rm,#immed_5 0001 100m mmnn nddd -- ADD Rd,Rn,Rm

0001 101m mmnn nddd -- SUB Rd,Rn,Rm

0001 110v vvnn nddd -- ADD Rd,Rn,#immed_3

0001 111v vvnn nddd -- SUB Rd,Rn,#immed_3

0001 1100 00nn nddd -- MOV Rd,Rn

0010 0ddd vvvv vvvv -- MOV Rd,#immed_8

0010 1nnn vvvv vvvv -- CMP Rn,#immed_8

0011 0ddd vvvv vvvv -- ADD Rd,#immed_8

0011 1ddd vvvv vvvv -- SUB Rd,#immed_8

0100 0000 00mm mddd -- AND Rd,Rm

0100 0000 01mm mddd -- EOR Rd,Rm

0100 0000 10ss sddd -- LSL Rd,Rs

0100 0000 11ss sddd -- LSR Rd,Rs

0100 0001 00ss sddd -- ASR Rd,Rs

0100 0001 01mm mddd -- ADC Rd,Rm

0100 0001 10mm mddd -- SBC Rd,Rm

0100 0001 11ss sddd -- ROR Rd,Rs

0100 0010 00mm mnnn -- TST Rn,Rm

0100 0010 01mm mddd -- NEG Rd,Rm

0100 0011 00mm mddd -- ORR Rd,Rm

0100 0010 10mm mnnn -- CMP Rn,Rm

0100 0010 11mm mnnn -- CMN Rn,Rm

0100 0011 01mm mddd -- MUL Rd,Rm

0100 0011 10mm mddd -- BIC Rd,Rm

0100 0011 11mm mddd -- MVN Rd,Rm

0100 0100 hhmm mddd -- ADD Rd,Rm h1h2,h1 is msb for Rd,h2 is msb for Rm 0100 0101 hhmm mnnn -- CMP Rn,Rm

0100 0110 hhmm mddd -- MOV Rd,Rm

0100 0111 0Hmm mSBZ -- BX Rm

0100 0111 1hmm mSBZ -- BLX Rm

0100 1ddd vvvv vvvv -- LDR Rd,[PC+#immed_5*4]

0101 000m mmnn nddd -- STR Rd,[Rn,Rm]

0101 001m mmnn nddd -- STRH Rd,[Rn,Rm]

0101 010m mmnn nddd -- STRB Rd,[Rn,Rm]

0101 011m mmnn nddd -- LDRSB Rd,[Rn,Rm]

0101 100m mmnn nddd -- LDR Rd,[Rn,Rm]

0101 101m mmnn nddd -- LDRH Rd,[Rn,Rm]

0101 110m mmnn nddd -- LDRV Rd,[Rn,Rm]

0101 111m mmnn nddd -- LDRSH Rd,[Rn,Rm]

0110 0vvv vvnn nddd -- STR Rd,[Rn,#immed_5*4]

0110 1vvv vvnn nddd -- LDR Rd,[Rn+#immed_5*4]

0111 1vvv vvnn nmmm -- LDRB Rd,[Rn,#immed_5*4]

0111 0vvv vvnn nddd -- STRB Rd,[Rn,#immed_5]

1000 0vvv vvnn nddd -- STRH Rd,[Rn,#immed_5*2]

1000 1vvv vvnn nddd -- LDRH Rd,[Rn,#immed_5*2]

1001 0ddd vvvv vvvv -- STR Rd,[SP,#immed_8*4]

1001 1ddd vvvv vvvv -- LDR Rd,[SP,#immed_8*4]

1010 0ddd vvvv vvvv -- ADD Rd,PC,#immed_8*4

1010 1ddd vvvv vvvv -- ADD Rd,SP,#immed_8*4

1011 0000 0vvv vvvv -- ADD SP,#immed_7*4

1011 0000 1vvv vvvv -- SUB Sp,#immed_7*4

1011 010R rrrr rrrr -- PUSH reg_list

1011 110R rrrr rrrr -- POP reg_list

1011 1110 vvvv vvvv -- BKPT immed_8

1100 0nnn rrrr rrrr -- STMIA Rn!,reg_list

1100 1nnn rrrr rrrr -- LDMIA Rn!,reg_list

1101 cccc vvvv vvvv -- Bcc signed_immed_8

1101 1111 vvvv vvvv -- SWI immed_8

1110 0vvv vvvv vvvv -- B signed_immed_11

111h hvvv vvvv vvvv -- BL(X) immed_11

附件:《Addison Wesley - ARM Architecture Reference Manual (2nd Edition)》

实验1-ARM汇编指令基础

实验一ARM汇编指令基础 学号:姓名: 一、实验目的 ●初步学会使用Embest IDE for ARM 开发环境及ARM软件模拟器; ●通过实验掌握简单ARM汇编指令的使用方法。 二、实验原理 ARM处理器共有37个寄存器: ●31个通用寄存器,包括程序计数器(PC)。这些寄存器都是32位。 ●6个状态寄存器。这些寄存器也是32位,但只使用了其中的12位。 1.ARM通用寄存器 通用寄存器(R0~R15)可分为3类。 1)不分组寄存器R0~R7 R0~R7是不分组寄存器。在所有处理器模式下,它们都能被访问。它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。 2)分组寄存器R8~R14 R8~R14是分组寄存器。被访问的物理寄存器取决于当前的处理器模式。若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。 寄存器R8~R12各有两组物理寄存器:一组为FIQ模式,另一组为除了FIQ模式以外的所有模式。R8~R12没有任何指定的特殊用途。只是使用R8~R12来简单地处理中断。寄存器R13和寄存器R14各有6个分组的物理寄存器,1个用于用户模式和系统模式,其他5个分别用于5种异常模式。R13通常用作堆栈指针,称作SP。每种异常模式都有自己

的R13。R14用作子程序链接寄存器,也称作LR 。 3) 程序计数器R15 寄存器R15用作程序计数器(PC )。 本实验中,ARM 核工作在用户模式,R0~R15可用。 2. 存储器格式 ARM 体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。 1) 大端格式 在这种格式中,字数据的高位字节存储在低地址中,而字数据的低位字节存 放在高地址中,如下所示: 高地址 31 23 22 16 15 8 7 0 字地址 低地址 2) 小 端格式 在这种格式中,字数据的高位字节存储在高地址中,而字数据的低位字节存 放在低地址中,如下所示: 高地址 31 23 22 16 15 8 7 0 字地址 低地址 3.GNU 基础知识 Embest IDE 集成了GNU 汇编器as 、编译器gcc 和链接器ld 。因此,编写程序要符合GNU 的语法和规则。这里简单介绍几点基本知识: 8 4 0 8 4 0

计算机组成原理实验1-汇编语言实验

微处理器与接口技术 实验指导

实验一监控程序与汇编语言程序设计实验 一、实验要求 1、实验之前认真预习,明确实验的目的和具体实验内容,设计好主要的待实验的程序,做好实验之前的必要准备。 2、想好实验的操作步骤,明确通过实验到底可以学习哪些知识,想一想怎么样有意识地提高教学实验的真正效果。 3、在教学实验过程中,要爱护教学实验设备,认真记录和仔细分析遇到的现象与问题,找出解决问题的办法,有意识地提高自己创新思维能力。 4、实验之后认真写出实验报告,重点在于预习时准备的内容,实验数据,实验过程、遇到的现象和解决问题的办法,自己的收获体会,对改进教学实验安排的建议等。善于总结和发现问题,写好实验报告是培养实际工作能力非常重要的一个环节,应给以足够的重视。 二、实验目的 【1】学习和了解TEC-XP16教学实验系统监控命令的用法; 【2】学习和了解TEC-XP16教学实验系统的指令系统;

【3】学习简单的TEC-XP16教学实验系统汇编程序设计。 三、实验注意事项 (一)实验箱检查 【1】连接电源线和通讯线前TEC-XP16实验系统的电源开关一定要处于断开状态,否则可能会对TEC-XP16实验系统上的芯片和PC机的串口造成损害。 【2】五位控制开关的功能示意图如下: 【3】几种常用的工作方式【开关拨到上方表示为1,拨到下方为0】 (二)软件操作注意事项 【1】用户在选择串口时,选定的是PC机的串口1或串口2,而不是TEC-XP16实验系统上的串口。即选定的是用户实验时通讯线接的PC机的端口; 【2】如果在运行到第五步时没有出现应该出现的界面,用户需要检查是不是打开了两个软件界面,若是,关掉其中一个再试; 【3】有时若TEC-XP16实验系统不通讯,也可以重新启动软件或是重新启动PC再试; 【4】在打开该应用软件时,其它的同样会用到该串口的应用软件要先关掉。

Thumb指令集与ARM指令集的区别

标题:Thumb指令集与ARM指令集的区别 2010-06-21 21:43:58 Thumb指令集 Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度【1】的问题而提出的,它具有16为的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。 在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,可使用伪指令CODE32声明。 【1】.代码密度:单位存储空间中包含的指令的个数。例如 ARM指令是32位的,而Thumb指令时16位的,如果在1K 的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb指令时,代码密度高。 Thumb指令集与ARM指令集的区别 Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。Thumb指令集与ARM指令集的区别一般有如下几点: ? 跳转指令 程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。 ? 数据处理指令

数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第三个寄存器中。 数据处理操作比ARM状态的更少,访问寄存器R8—R15受到一定限制。 (除MOV和ADD指令访问寄存器R8—R15外,其他数据处理指令总是更新CPSR中ALU状态标志) 访问寄存器R8—R15的Thumb数据处理指令不能更新CPSR中的ALU状态标志 ? 单寄存器加载和存储指令 在Thumb状态下,单寄存器加载和存储指令只能访问寄存器 R0—R7 ? 批量寄存器加载和存储指令 LDM和STM指令可以将任何范围为R0——R7的寄存器子集加载或存储

汇编语言实验一

淮阴工学院 汇编语言程序设计实验报告 选题名称:实验一调试工具的使用方法训练 系(院):计算机工程学院 专业:计算机科学与技术 班级: 1101 姓名:康志杰学号: 1101301132 指导教师:王福德 学年学期:2013 学年第 2 学期 2013 年 4 月15 日

实验一利用DEBUG调试程序调试程序段 <1 > 实验目的: (1)熟悉DEBUG有关命令的使用方法 (2)利用DEBUG掌握有关指令的功能 (3)利用DEBUG运行简单的程序段 <2 > 实验内容 (1)进入和退出DEBUG程序 1)开始——运行,输入cmd,点确定或回车键进入DOS环境 2)在命令窗口输入debug进入debug程序 3)进入debug程序后,按q退出

(2) 学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命 令、N命令、W命令等,也应试一下。 1 显示存储器单元命令D 格式:D [<地址范围>] 功能:显示指定地址范围内的存储区数据,包括十六进制数据形式及其对应的ASCII码字符显示。 2 写存储器单元命令E 格式:E <地址> [<字符串>] 功能:逐个修改指定单元内容或将字节串写入指定的一组连续单元。 例:将字节串′computer′写入以100H为起始地址的存储器区。 -E 100′computer′ 3显示和修改某个指定寄存器内容, 格式为:-R 寄存器名 例如打入:-R AX 系统将响应如下: AX 0000

: 表示AX当前内容为0000,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,如: -R BX BX 0000 :1000 则BX内容由0000改为1000 4显示和修改标志位状态, 命令格式为:-RF 系统将给出响应,如 NV UP EI PL NZ NA PO NC- 这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如 NV UP EI PL NZ NA PO NC-ZR CY

汇编实验报告1

汇编语言上机实验报告 时间: 地点: 实验人员: 实验二 一、题目 1、《80X86汇编语言程序设计》教材中 P95的 3.7 题。 要求:(1)将该题改成一完整的程序(可以省略实验报告中的程序框图)。 (2)请事先指出依次执行每条程序指令后(AX)的内容。 (3)请事先指出执行ADD、SUB、SAL、RCL指令后,CF、ZF的值。 (4)记录上机执行后与(2)、(3) 中对应的内容。 说明:MOV 指令不影响标志位,DEC指令不影响CF标志位,NOT 指令不影响标志位。 2、《80X86汇编语言程序设计》教材中 P94的 3.3 题。 要求:(1)将该题改成一完整的程序,其中数据段的定义为习题3.1中的数据段(可以省略实验报告中的程序框图)。 (2)请事先画出数据段中数据的存储形式。 (3)请事先指出依次执行每条程序指令后相应寄存器中的内容。 (4)请事先给出各调指令在汇编后的形式。 (5)比较上机执行后,看到的各项内容是否与(2)、(3) ,(4)内容一致。不一致的应分析错误原因。 说明:MOV BX, OFFSET STR1+3 对应的汇编后的指令为:MOV BX, 3 MOV BX, STR1 对应的汇编后的指令为:MOV BX, [0000] (上条指令等价于MOV BX, DS:[0000] ) 3、《80X86汇编语言程序设计》教材中 P96的 3.11 题。 要求:(1)请事先指出程序运行结束后,显示器显示的内容。 (2)若将NUM的定义改成如下形式: NUM DB 35 显示的结果是什么? (3)若将NUM的定义改成如下形式: NUM DB 59 显示的结果是什么? (4)指出程序运行后看到的结果,若不一致,分析产生错误的原因。 4. 从键盘输入两串字符分别存入BUF1和BUF2区,比较两串内容是否相等, 相等显示“MATCH !”, 不相等显示“NO MATCH !”。 要求:(1) 使用10号功能调用输入字符串; (2) 使用9号功能调用输出提示信息; 提示:先比较长度是否相等。 5 选做题 输入一个无符号的数字串,然后以16进制形式显示出串的值。 例如: INPUT A NUMBER : 59

实验01 汇编指令实验——作业1

实验一汇编指令实验 一、实验目的 1、初步掌握开发环境及ARM软件模拟器。 2、掌握简单的ARM、THUMB汇编指令的使用方法。 3、通过实验观察不同类型指令的工作原理。 二、实验步骤 (一)、掌握ARM程序开发环境RealView MDK。 1、在“我的电脑”中新建一个目录,比如:“Exp01”。(注意:目录尽量建立在自带的U盘上,以防实验工程被还原) 2、打开Keil uVision软件,点击菜单中的“File->Project->New uVision Project”选项,启动新建工程向导程序,新建一个uVision工程。工程文件保存在第1步创建的目录中,工程命名为:“Exp01”。 图1 新建工程向导启动

图2 向导开始首先为新建工程命名为:Exp01 3、新建工程向导的第一步是:选择设备即处理器的选择(Select Device for Target ‘Target1’)。在对话框的左下方有一个 列表,列表中选择“NXP->LPC2138”。注:LPC2138是实验箱采用的ARM芯片型号。

图3 向导第1步,设置处理器类型 点击确定按钮后,向导程序会弹出一个“提示框”。这个提示框是询问你是否要向工程中添加LPC2000系列处理器的启动代码。这里可以点击“否”按钮。注:启动文件在生成可下载的运行文件时是必须的,这里只是测试汇编程序所以不需要启动文件。 图4 添加启动代码 4、工程建立完成后,uVision软件的主窗口左边就是工程空间浏览器窗口。可以看到已经建立好的工程默认处理器名:“Target 1”,默认源文件组名:“Source Group 1”。

Thumb指令集中关于IT指令的使用

ARM处理器架构的Thumb指令集中关于IT指令的使用 在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了IT指令,进一步增强了代码的紧凑性。 Thumb中有一个比较有意思的指令——IT,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。如果你需要更紧凑的指令,那么使用Thumb结合ThumbEE来做带条件的指令执行还是不错的选择。Thumb本身不具备带条件指令执行的特性。 IT指令的描述为:IT{{{}}} 其中,表示第二条指令的条件;表示第三条指令的条件;表示第四条指令的条件。是条件操作数,表示第一条指令的条件。 的标识其实就两种符号——T或E。T表示Then,表示相应的指令所满足的条件与一致;E表示else,表示相应的指令所满足的条件与完全相反。因此,对于第一条指令而言,总是为T的,因此不需要在IT中显示给出,它直接对应于的条件。 另外,在IT块中不能再使用IT指令。即,相继的四条指令中不允许出现IT指令。 下面给出一些示例代码: // // hi.s // test // // Created by zenny_chen on 13-5-8. // Copyright (c) 2013年 zenny_chen. All rights reserved. // .text .align 4 .globl _ThumbEETest, _ThumbEETest2 .thumb .thumb_func _ThumbEETest: eor r1, r1, r1 eor r2, r2, r2 eor r3, r3, r3 eor r12, r12, r12

实验1汇编语言实验环境与基本操作

实验1 汇编语言实验环境与基本操作 班级:计科(高职)12-2 姓名:韩长莉学号: 201203014062 上机时间: 2014.4.14 上机地点:一机房指导老师:尉秀梅 一.实验目的: 1.学习debug的主要用法,熟悉R,D,E,U,T,A等常用的命令。 2.理解堆栈的工作原理,push和pop指令的执行步骤。 3.掌握一个完整的汇编程序从写出到执行的过程,熟悉用debug跟踪程序的执行过程。 二.实验内容: 1.查看cpu和内存,用机器指令和汇编指令编程(p35) 2.用机器指令和汇编指令编程(p71) 3.编程、编译、连接、跟踪(94页) 三.实验步骤 1.查看cpu和内存,用机器指令和汇编指令编程(p35) (1)使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,cpu中相关 寄存器中内容的变化。 提示:可用E命令和A命令,以两种方式将指令写入内存。注意用t命令执行时,cs:ip 的指向。 写清楚具体用这两种方式的操作方法。 C:\Users\Administrator>debug -e 1000:0 b8 20 4e 05 16 14 bb 00 20 01 d8 89 c3 01 d8 b8 1a 00 bb 26 00 00 d8 -u 1000:0 1000:0000 B8204E MOV AX,4E20 1000:0003 051614 ADD AX,1416 1000:0006 BB0020 MOV BX,2000 1000:0009 01D8 ADD AX,BX 1000:000B 89C3 MOV BX,AX 1000:000D 01D8 ADD AX,BX 1000:000F B81A00 MOV AX,001A 1000:0012 BB2600 MOV BX,0026 1000:0015 00D8 ADD AL,BL 1000:0017 28752D SUB [DI+2D],DH 1000:001A 807C0429 CMP BYTE PTR [SI+04],29 1000:001E 7554 JNZ 0074 -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=13C0 ES=13C0 SS=13C0 CS=13C0 IP=0100 NV UP EI PL NZ NA PO NC 13C0:0100 0000 ADD [BX+SI],AL DS:0000=CDCS 13C0 :1000 -rip IP 0100

汇编语言程序设计 实验1

汇编语言程序设计实验1——汇编程序与调试器的使用 一、实验目的 熟悉DOS操作系统环境下的汇编程序MASM的使用、掌握DEBUG的基本命令及其功能。 二、实验内容 1.编写一个小程序,从键盘接收一个大写字母,存放到指定的内存单元BUFF1,并转换其为对应的小写字母,存放到指定的内存单元BUF2中。上机编辑、汇编、连接并运行该程序。 2. 输入源程序、汇编、连接并执行相应程序,并用DEBUG 实现以下操作: (1)用反汇编命令查看相应程序的可执行语句序列,分析其与源程序的异同,查看相应程序占用内存单元的字节数。 (2)用数据查看命令查看执行前的数据单元的内容。 (3)分别用P命令和T命令逐步执行程序,分析这两种方式的区别,记录“转换为小写字母”指令执行后的状态字。 (4)查看程序执行后数据单元的内容。 (5)查看0000:0000 起始的32个单元的内容。 (6)用汇编命令编写一个简单加法程序“3+5=8”,加数和结果分别存在内存单元NUM1、NUM2、NUM3中。 三、实验要求 学生要提前做好相关内容的预习(包括源程序的分段组织、DEBUG的系列命令等),熟悉被调试的程序(学生应当在本实验中自行设计一些汇编语言程序,其目的是熟悉相关编程环境的特性),并对程序的测试/调试过程(包括所用的编程环境命令、DEBUG命令等)作出详细计划。 认真完成实验,正确记录各项数据,记录实验过程中出现的问题及其解决过程。 四、实验报告 写出各实验程序的测试/调试的详细过程(包括DEBUG命令的使用等),特别是要写出在DEBUG状态下编写、运行程序的过程。要系统给出各程序在测试/调试过程中所遇到的问题、解决问题的方法与途径。要对程序在测试/调试过程中的问题进行分析,对相关的执行结果进行分析。

Thumb指令集和ARM指令集的对比

Thumb指令集和ARM指令集的对比 Thumb指令 Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。 在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,可使用伪指令CODE32声明。 代码密度:单位存储空间中包含的指令的个数。例如 ARM指令是32位的,而Thumb指令时16位的,如果在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb 指令时,代码密度高。 Thumb指令集与ARM指令集的区别 Thumb指令集不是完整的指令集,它是ARM指令集的子集。但是Thumb 指令具有更高的代码密度,即占用存储空间小,仅为ARM代码规格的65%,但其性能却下降的很少。所以,Thumb指令集使ARM处理器能应用到有限的存储带宽,并且,代码密度要求很高的嵌入式系统中去。Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。Thumb指令集与ARM指令集的区别一般有如下几点: 1. 跳转指令 程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。 2. 数据处理指令 数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第三个寄存器中。 数据处理操作比ARM状态的更少,访问寄存器R8—R15受到一定限制。 (除MOV和ADD指令访问寄存器R8—R15外,其他数据处理指令总是更新CPSR中ALU状态标志)访问寄存器R8—R15的Thumb数据处理指令不能更新CPSR中的ALU状态标志。 3. 单寄存器加载和存储指令 在Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0—R7 4. 批量寄存器加载和存储指令 LDM和STM指令可以将任何范围为R0——R7的寄存器子集加载或存 储。 PUSH 和POP 指令使用堆栈指令R13 作为基址实现满递减堆栈.除 R0~R7 外,PUSH 指令还可以存储链接寄存器R14,并且POP 指令可以加载

实验1 汇编程序设计

实验一、汇编语言程序设计 一、实验目的 1. 熟悉Keil C51集成开发环境的使用方法。 2. 掌握数据传送指令的用法。 3. 掌握算术运算指令的用法 4. 掌握汇编语言程序设计方法 二、实验设备(仪器) PC微机一台 Keil C51集成开发环境一套 三、实验内容 1.按照Keil C51集成开发环境的要求,建立程序,然后进行编译。 2.将编译好的程序进行软件模拟仿真运行。 3. 数据传送,算术运算指令。 4. 逻辑操作、位操作和控制转移指令。 5.顺序程序设计 6.分支程序设计 7.循环程序设计 四、实验步骤 1.打开计算机电源,在桌面上双击“Keil uVision”图标,打开Keil C51集成开 发环境。 2.选择“Project”-“New Project…”建立新的工程文件(注意工程文件放置的文 件夹),输入文件名,选择“保存”。 3.在接下来的窗口中选择单片机芯片类型,暂时选择“Philips”下的“80C51FA”, 然后在接下来的窗口中,选择“否”,暂时不要加载芯片基本参数。 4.选择“File”-“New”或者点击新文件快捷图标,会打开一个文本编辑器窗口。 输入下列数据传送的程序,然后选择“File”-“Save…”,注意保存的时候给文件 起名字以后,加个文件名后缀,Keil C支持汇编语言及一种C语言编程,它是 依靠文件名后缀来判断文件是汇编语言还是C语言格式的,如果是汇编语言, 后缀为“.a”,C语言格式的,后缀为“.c”。我们选择保存为汇编语言格式,比 如保存为“Mcu1-1.a”。注意此时程序中的一些代码和寄存器将会自动蓝色显示,方便观察。 5.选择“Project”-“Targets,Groups,Files…”,选择“Groups/Add Files”标签, 首先点击下边窗口中的“Source Group 1”,然后选择下边的“Add Files to Group…”,在接下来的窗口中,首先选择你需要加入的文件的后缀名(默认是.c,我们选择“Asm Source file,即后缀为.a”),然后选择对应的文件,选择“Add”, 然后选择“Close”,最后选择“确定”,完成文件的添加工作。 6.然后选择“Project”-“Build target”或者直接按下F7,对文件进行编译。如果

汇编实验1

实验一顺序与分支程序设计、实验目的 1) 掌握顺序程序设计方法。 2) 掌握分支程序的结构及分支程序的设计,调试方法。 2) 学习数据传送及算术和逻辑运算指令的用法。 3) 熟悉在PC 机上建立、汇编、连接、调试和运行汇编语言程序的过程。 、实验内容 1) 有一字变量BUF1 是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2 和BUF3 单元,并在屏幕上显示出来。 2) 有两个两字节无符号数分别放在存储单元A 、B 起始的缓冲器中,求其 和,结果放在 A 起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元 。 3) 在BUF 和BUF+1、BUF+2 单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX 单元,并在屏幕上显示。 4) 要求同上,只是比较的数为有符号数。 5) 将1000H 单元开始的10 个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。本实验要求在DEBUG 调试状态下进行,包括汇编程序、运行程序、检查结果。 6) 从键盘上接收一位十进制数X,计算Y值,并以十六进制形式显示出来,丫按下列公式计算。 2 X 2 X ( X 3) 2 X 2 2 X ( X 4) Y 2 X 2 ( X 5) 2 X 2 / 2( X 6) 7) 从键盘上接收两个一位十六进制数X和丫,然后再输入一个A-D之间的一个字符,按下列要求计算。 a) 当输入字符为A,则计算X+Y并以十六进制形式显示出来

b)当输入字符为B,则计算|X-Y|,并以十六进制形式显示出来 c)当输入字符为C,则计算X*Y,并以十六进制形式显示出来 d)当输入字符为D,则计算X/Y,并以十六进制形式显示出来 三、实验设备 PC机一台 四、实验准备 1)分析题目,将程序中的原始数据和最终结果的存取方法确定好。 2)画出流程图。 3)写出源程序。 4)对程序中的结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。 五、实验步骤 1)输入源程序。 2)汇编、连接程序,生成.EXE文件,执行文件,检查结果。 六、实验报告的要求 1)列出源程序,说明程序的基本结构,包括程序中各部分的功能。 2)说明程序中各部分所用的算法。 3)说明主要符号和所用到寄存器的功能。 4)总结为什么在设计分支程序时必须解决三个问题:判断、转向和定标号 。 5)说明标志位CF、SF和OF的意义。 6)上机调试过程中遇到的问题是如何解决的。 7)对调试源程序的结果进行分析。 实验1-1 源程序: DATA SEGMENT

汇编实验1

实验一 顺序与分支程序设计 一 、实验目的 1) 掌握顺序程序设计方法。 2) 掌握分支程序的结构及分支程序的设计,调试方法。 2) 学习数据传送及算术和逻辑运算指令的用法。 3) 熟悉在PC 机上建立、汇编、连接、调试和运行汇编语言程序的过程。 二、实验容 1) 有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。 2)有两个两字节无符号数分别放在存储单元A 、B 起始的缓冲器中,求其和,结果放在A 起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元。 3) 在BUF 和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX 单元,并在屏幕上显示。 4) 要求同上,只是比较的数为有符号数。 5) 将1000H 单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。本实验要求在DEBUG 调试状态下进行,包括汇编程序、运行程序、检查结果。 6) 从键盘上接收一位十进制数X ,计算Y 值,并以十六进制形式显示出来,Y 按下列公式计算。 ???????===-=+=) 6(2/) 5()4(2)3(2222X X X X X X X X X X Y 7) 从键盘上接收两个一位十六进制数X 和Y ,然后再输入一个A-D 之间的一个字符,按下列要求计算。 a) 当输入字符为A ,则计算X+Y ,并以十六进制形式显示出来 b) 当输入字符为B ,则计算|X-Y|,并以十六进制形式显示出来

c)当输入字符为C,则计算X*Y,并以十六进制形式显示出来 d)当输入字符为D,则计算X/Y,并以十六进制形式显示出来 三、实验设备 PC机一台 四、实验准备 1) 分析题目,将程序中的原始数据和最终结果的存取方法确定好。 2) 画出流程图。 3) 写出源程序。 4) 对程序中的结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。 五、实验步骤 1) 输入源程序。 2) 汇编、连接程序,生成 .EXE文件,执行文件,检查结果。 六、实验报告的要求 1) 列出源程序,说明程序的基本结构,包括程序中各部分的功能。 2) 说明程序中各部分所用的算法。 3)说明主要符号和所用到寄存器的功能。 4) 总结为什么在设计分支程序时必须解决三个问题:判断、转向和定标号。 5) 说明标志位CF、SF和OF的意义。 6) 上机调试过程中遇到的问题是如何解决的。 7) 对调试源程序的结果进行分析。 实验1-1 源程序: DATA SEGMENT

实验一 汇编语言程序设计1

实验一汇编语言程序设计(1)一、实验目的 1.熟悉Pentium微处理器指令系统和寻址方式 2.掌握汇编语言程序的编程与调试方法 二、实验内容 1. 编程在显示器上输出显示HELLO TITLE 'HELLO.EXE---PRINT HELLO ON SCREEN' CR EQU 0DH LF EQU 00H DSEG SEGMENT 'DA TA' MESSAGE DB CR, 'HELLO!', CR, LF, '$' DSEG ENDS CSEG SEGMENT PUBLIC 'CODE' ASSUME CS:CSEG,DS:DSEG PRINT PROC FAR PUSH DS SUB A X,AX PUSH AX MOV AX, DSEG MOV DS, AX MOV DX, OFFSET MESSAGE MOV AH, 09h INT 21H RET PRINT ENDP CSEG ENDS

2. 在DATA1处建立10个字节,各数加1后移到DATA2处。DA TA SEGMENT DATA1 DB 0H,01H,02H,03H,04H,05H,06H,07H,08H,09H DATA2 DB 10 DUP (00H) DA TA ENDS CODE SEGMENT START: MOV AX , DATA MOV DS , AX MOV CX,10 LEA SI, DA TA1 LEA DI, DATA2 NEXT: MOV AL,[SI] INC AL MOV [DI],AL INC SI INC DI LOOP NEXT MOV AH.4CH INT 21H CODE ENDS END START

ARM汇编指令实验.

实验1 ARM汇编指令实验 1、实验目的: ●熟悉ADS开发环境和wiggler调试环境。 ●掌握简单的ARM汇编指令的使用方法。 2、实验设备 ●PC机、JTAG调试板、S3C2410开发板。 3、实验内容 ●熟悉ARM开发环境的建立。 ●使用ARM汇编指令设置GPIO口的相应寄存器,控制LED灯的亮灭。 4、实验原理 下面介绍本实验用到的一些汇编指令。 1).LDR/STR指令 说明:LDR/STR指令用于加载/存储寄存器。举例说明: 示例: LDR r3,[r0],#4 //从r0表示的地址中读取数据分别存放到r3中,然后将r0加4。 STR r3, [r1],#4 //将r3中的数据保存到r1表示的地址中,然后将r1加4。 LDMIA/STMIA指令 说明:LDM/STM指令用于加载/存储多个寄存器,举例 示例: LDMIA r0!,{r4---r11}//从r0表示的地址中顺利取出8个字数据分别存放到r4-r11中。 2).程序分支指令 B指令 说明:B指令为ARM的分支指令,将引起处理器转移到制定标号处执行。 示例: B Label //处理器转移到Label标号处执行 BEQ stop//Z标记置位,则跳转到stop标号处执行;否则继续下一条指令 BNE octcopy//Z标记清0,则跳转到octcopy标号处执行;否则继续下一条指令 3).其他指令 SUBS 说明:该指令有SUB指令加上S后缀组成,S后缀标志根据执行结果更新条件标志码。 示例: SUBS r3,r3,#1//如果r3等于0,则Z位清0 MOVS指令 说明:该指令由MOV指令加上后缀S组成,S后缀标志根据执行结果更新条件标志码。

汇编指令实验

实验三汇编指令实验 一实验目的 1.熟悉ADS1.2软件开发环境; 2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序; 3.掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。 4.掌握ARM乘法指令的使用方法; 5.了解子程序编写及调用。 二实验内容 1.使用LDR指令读取0x30003100上的数据,将数据加1,若结果小于10,则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址。 2.使用ADS1.2软件仿真,单步,全速运行程序,设置断点,打开寄存器窗口(Processor Registers)监视R0,R1的值,打开存储器观察窗口(Memory)监视0x30003100上的值。 3. 使用STMFD/LDMFD,MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算X n的值。 X n= X*X*X ……*X,其中相乘的X的个数为n个。先将X的值装入R0和R1,使用寄存器R2进行计数,循环n-1次R0=R0*R1,运算结果就保存在R0中。(不考虑溢出问题) 注意:若n=0,则运算结果直接赋1;若n=1,则运算结果直接赋X。 三预备知识 1.ARM指令系统内容; 2.ADS1.2工程编辑和AXD调试的内容。 四实验设备 硬件:PC机一台。 软件:Windows98/XP/2000系统,ADS1.2集成开发环境。 五实验步骤

1. 实验内容1和实验内容2的步骤如下: (1)启动ADS1.2,使用ARM Executable Image工程模板建立一个工程arm1.mcp。 (2)建立汇编源文件arm1.s,编写实验程序,然后添加到工程中。 (3)设置工程连接地址RO Base为0x30000000,RW Base为0x30003000,如图3.1所示。设置调试口地址Image entry point为0x30000000。 图3.1 设置工程连接地址 图3.2 设置调试口地址 (4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。 (5)打开寄存器窗口(Processor Registers),选择Current项监视R0,R1的值。打开存储器观察窗口(Memory),设置观察地址为0x30003100,显示方

cortex_M3 ARM_n_Thumb2指令集速查卡

ARM?和 Thumb?-2 指令集 快速参考卡 表关键字 Rm {, }请参阅表寄存器,可选择移动常数个位 请参阅表灵活的操作数 2。移位和循环移位只可用于 Operand2。以逗号隔开的寄存器列表,括在大括号 { 和 } 内。 请参阅表PSR 域。作为,不能包含 PC。 CPSR(当前处理器状态寄存器)或 SPSR(保存的处理器状态寄存器)作为,包含 PC。 C*,V*在体系结构 v4 及其更早版本中,标记不可预知;在体系结构 v5 及其以后版本中,标记保持不变。+/-+ 或 -£ (+ 可省略。) 可为 Rs 或一个直接移位值。每种移位类型的允许值与请参阅表ARM 体系结构版本。 表寄存器,可选择移动常数个位中的相同。中断标记。一个或多个a、i、f(中止、中断、快速中断)。 x、y B 或 T,B 表示半寄存器 [15:0],T 表示半寄存器 [31:16]。请参阅表处理器模式 ARM:32 位常数,由 8 位值向右循环移偶数位生成。SPm所指定的处理模式的 SP Thumb:32 位常数,由 8 位值左移任意位生成,位域的最低有效位。 格式模式为 0xXYXYXYXY、0x00XY00XY 或 0xXY00XY00。位域宽度, + 必须小于或等于 32。 请参阅并行指令的前缀{X}如果有 X,则 RsX 为 Rs 循环 16 位生成。否则,RsX 为 Rs。 {IA|IB|DA|DB}之后增加、之前增加、之后减小、之前减小。{!}如果有 !,则在数据传送完毕后更新基址寄存器(前变址)。 IB和DA不可用于 Thumb 状态下。如果省略,则缺省时为IA。{S}如果有 S,则更新条件标记。 B、SB、H或SH,含义分别为字节、有符号字节、半字和有符号半字。{T}如果有 T,则带有用户模式特权。 SB和SH不可用于STR指令。{R}如果存在 R,则对结果进行舍入,否则将其截断。 运算汇编程序S 更新操作注释加法加法ADD{S} Rd, Rn, N Z C V Rd := Rn + Operand2N 带进位ADC{S} Rd, Rn, N Z C V Rd := Rn + Operand2 + 进位N 宽T2ADD Rd, Rn, #Rd := Rn + imm12,imm12 的范围为 0-4095T、P 饱和 {加倍}5E Q{D}ADD Rd, Rm, Rn Rd := SAT(Rm + Rn) 加倍:Rd := SAT(Rm + SAT(Rn * 2))Q 寻址PC 相对的寻址ADR Rd,

相关文档
最新文档