3-2-3 伪指令2
ARM汇编手册

ARM 汇编手册
版权声明
本手册为北京顶嵌开源科技有限公司内部培训资料,仅 供本公司内部学习使用,在未经本公司授权的情况下,请勿 用作任何商业用途。
400-661-5264
专注嵌入式 Linux 技术
北京顶嵌开源科技有限公司
目录
寄存器装载和存储.............................................................................................................................5 传送单一数据.............................................................................................................................5 传送多个数据.............................................................................................................................7 SWP : 单一数据交换................................................................................................................ 9
乘法指令........................................................................................................................................... 19 MLA : 带累加的乘法..............................................................................................................19 MUL : 乘法..............................................................................................................................19
伪指令

第6章 6.1.5 伪指令
SEG和OFFSET
SEG返回存储器地址操作数的段地址 OFFSET 返回存储器地址操作数的段内偏移地 址部分
: NUMBER-1 DD ? CCAA EQU SEG NUMBER-1 : MOV AX,SEG NUMBER-1 MOV DS,AX MOV SI,OFFSET NUMBER-1
第6章 6.1.5 伪指令
结构的存储分配和预置
格式:变量 结构名称<赋值说明> LiPing STUDENT_RECORD <,,,’891011’>
LuiYi STUDENT_RECORD <‘LuiYi’,1,,’891011’,80H>
对结构的访问
格式:变量名.字段名 例如:MOV AL,LiPing.AGE 等价于: MOV AL,[BX].AGE
CODE_SEG
第6章:逻辑段的简化定义
.STACK [大小]
;堆栈段定义伪指令 .STACK 创建一个堆栈段,段名是: STACK 。可选的“大小”参数指定堆栈段所占存储区的 字节数,默认是1KB(=1024=400H字节)
.DATA
;数据段定义伪指令 .DATA 创建一个数据段,段名是: _DATA。数据段名可用@DATA预定义标识符表示
第6章 6.1.5 伪指令
TYPE、SIZE、LENGTH
见表6.3
段定义伪指令
SEGMENT/ENDS伪指令 成对使用,说明段的名称和范围,还可指明段 的定位类型、组合类型、分类名
段名
段名
SEGMENT [定位类型][组合类型][分类名] : 本段程序内容(指令或伪指令语句) ENDS
第6章 6.1.5 伪指令
8051汇编语言概述一 ) 指令分类 42个助记符,33种功能,共...

3-3 数据传送类指令
数据传送操作是指把数据从源地址传送到目的地址, 源地址内容不变。共29条指令,使用8种助记符: 片内数据存储器传送指令MOV;
片外数据存储器传送指令MOVX;
程序存储器传送指令MOVC; 累加器交换指令 XCH、XCHD、SWAP; 堆栈操作指令 PUSH、 POP; 3-5
3-3-4 累加器交换指令
1) 字节交换指令XCH(3 条)
助记符格式
XCH A, Rn
机器码
11001rrrB
相应操作
A Rn
指令说明 机器周期
n=0~7 1 1
XCH A, direct 11000101B A (direct) direct
XCH A, @Ri
1100011iB data
MOV R2,#20h ;设臵传送次数 MOV DPTR,#TAB ;设臵数据源起始地址 MOV R0,#30H ;设臵目标起始地址 LOOP: MOV A, #00h ;设臵变址值 MOVC A, @A+DPTR ;读外部数据存储器 MOV @R0, A ;将数据传送到内部RAM INC R0 ;目标地址+1 INC DPTR ;源地址+1 DJNZ R2,LOOP ;传送个数判断
五)汇编语言的伪指令
伪指令不是真正的指令,它无对应的机器码,在汇编时不 产生目标程序,只是用来对汇编过程进行某种控制。 (p178)
1)ORG nnnnh ;设臵起始地址 例如: ORG 0030h mov a,#00h …… 2)END 汇编结束伪指令 3)EQU (data、bit)等值伪指令 例如:SDA EQU P1.0 ; sda bit P1.0 addr1 EQU 1000h ; addr1 data 1000h D5 EQU 5fh ; D5 data 5fh
第4章(伪指令)

为第二操作数使用的,而ARM对数字常量的第二操作数有诸多
限制(必须为移位后构成的数),给寄存器加载一个任意数往往不 能使用一条指令实现,而使用伪操作LDR则可以解决此类问题。
第4章 嵌入式式程序设计基础
第4章 嵌入式程序设计基础 ·举例
第4章 嵌入式程序设计基础 该指令常用于加载芯片外围功能部件的寄存器地址(32位立 即数),以实现各种控制操作: a. 读控制寄存器 ……
据域(即MAP定义的内存表要和引用内存表的LDR指令相距不超
过4KB)。
第4章 嵌入式程序设计基础
第4章 嵌入式程序设计基础
2.3.2.3 内存单元分配伪操作
a. 功能 该伪指令用来分配一片连续的存储区域并将其初始化为0, 也可以用“%”来代替。 b. 语法
第4章 嵌入式程序设计基础 2.3.2.4 字节分配内存单元伪操作DCB
a. 功能
用来分配一段连续的双字内存单元,并用双精度的浮点数初 始化,DCFD分配的内存字对齐,DCFDU则不一定。 b. 语法
第4章 嵌入式程序设计基础 2.3.2.8 字分配内存单元伪操作DCFS和DCFDU
a. 功能
用来分配一段连续的字内存单元,并用单精度的浮点数初 始化,DCFS分配的内存字对齐,DCFSU则不一定。 b. 语法
• SETL—给一个逻辑变量赋值 • SETS—给一个字符串变量赋值
第4章 嵌入式程序设计基础 d.定义通用寄存器列表名称伪操作
该伪操作定义的寄存器列表主要用在堆栈操作或LDM/STM
多寄存器传送指令中。
第4章 嵌入式程序设计基础 2.2 语法
第4章 嵌入式程序设计基础 2.3 数据定义伪指令
器将其转化为LDR r0, [ PC,#offset ]的形式。
单片机原理及接口技术(微课版 第3版)-习题及答案 (3)[4页]
![单片机原理及接口技术(微课版 第3版)-习题及答案 (3)[4页]](https://img.taocdn.com/s3/m/3dc9e46e59fafab069dc5022aaea998fcc224086.png)
《单片机原理及接口技术》(第2版)人民邮电出版社第3章 8051指令系统与编程基础思考题及习题31.说明伪指令的作用。
“伪”的含义是什么?常用伪指令有哪些?其功能如何?答:伪指令是程序员发给汇编程序的命令,只有在汇编前的源程序中才有伪指令,即在汇编过程中的用来控制汇编过程的命令。
所谓“伪”是体现在汇编后,伪指令没有相应的机器代码产生。
常用伪指令及功能如下:ORG(ORiGin)汇编起始地址命令;END(END of assembly)汇编终止命令;EQU(EQUate)标号赋值命令;DB(Define Byte)定义数据字节命令;DW(Define Word)定义数据字命令;DS(Define Storage)定义存储区命令;BIT 位定义命令2.解释下列术语:手工汇编,机器汇编,反汇编答:手工汇编:通过查指令的机器代码表(表3-2),逐个把助记符指令“翻译”成机器代码,再进行调试和运行。
这种人工查表“翻译”指令的方法称为“手工汇编”。
机器汇编:借助于微型计算机上的软件(汇编程序)来代替手工汇编。
通过在微机上运行汇编程序,把汇编语言源程序翻译成机器代码。
反汇编:将二进制的机器码程序翻译成汇编语言源程序的过程称为“反汇编”。
3.下列程序段经汇编后,从1000H开始的各有关存储单元的内容是什么?ORG 1000HTAB1 EQU 1234HTAB2 EQU 3000HDB "MAIN"DW TAB1,TAB2,70H答:从1000H开始的各有关存储单元的内容(16进制)如下:4DH,41H,49H,4EH,12H,34H,30H,00H,00H,70H4.设计子程序时应注意哪些问题?答:编写子程序时应注意以下问题:子程序的第一条指令前必须有标号。
主程序调用子程序,有如下两条子程序调用指令:①绝对调用指令ACALL addr11。
被调用的子程序的首地址与绝对调用指令的下一条指令的高5位地址相同,即只能在同一个2KB区内。
计算机接口技术课件 第三章 MCS-51单片机汇编语言与程序设计基础

例2:编制一段程序,要求在端口线 :编制一段程序,要求在端口线P1.0,P1.1上分别产生周期为 , 上分别产生周期为 200us和400us的方波.设单片机的外接频率为 的方波. 和 的方波 设单片机的外接频率为12MHz. . 分析:利用定时器产生方波,将定时器设置成为工作方式 , 分析:利用定时器产生方波,将定时器设置成为工作方式3,将寄 存器T0定时 定时100us,T1定时 定时200us,达到定时时间后引起中断,在中 存器 定时 , 定时 ,达到定时时间后引起中断, 断服务程序中各自将P1.0和P1.1引脚取反. 引脚取反. 断服务程序中各自将 和 引脚取反 定时器预设值的设置: 定时器预设值的设置: 单片机的晶体振荡频率为12MHz,计时器的计时频率为1MHz,机 单片机的晶体振荡频率为 ,计时器的计时频率为 , 器周期为1us. 定时 定时100us,因此寄存器 需要计数 需要计数100次 器周期为 . T0定时 ,因此寄存器T0需要计数 次 ,其预 置值为64H+1=9CH. T1定时 定时200us,因此寄存器 需要计数 需要计数200次 置值为 . 定时 ,因此寄存器T1需要计数 次 其预置值为C8H+1=38H. ,其预置值为 . 定时器T0,T1的工作方式设置: 的工作方式设置: 定时器 的工作方式设置 T0采用工作方式 ,因此 采用工作方式3,因此TMOD寄存器的值设置为 寄存器的值设置为#22H. 采用工作方式 寄存器的值设置为 . 定时器T0,T1的控制设置: 的控制设置: 定时器 的控制设置 打开T0, ;要求TCON寄存器的值设置为 寄存器的值设置为#50H. 打开 ,T1;要求 寄存器的值设置为 .
定义存储区域的大小. 6. DS —定义存储区域的大小. 定义存储区域的大小 例: ORG 0350H DS 3
汇编语言(微机)第三章

汇编语言源程序的格式
一般情况下,定位类型、组合类型和类别说明可以 不用。 注意:SEGMENT和ENDS语句必须成对使用。 例:定义一数据段DATA
DATA SEGMENT A DB '1234' B DW 12H
DATA ENDS
22
汇编语言源程序的格式
(2)偏移地址定位语句 ORG 格式:ORG 数值表达式 功能:指定在它之后的程序段或数据块所存放的起始地 址的偏移量。
SUB1: ?
RESU: ?
?
31
汇编语言源程序的格式
④ 用DUP重复因子初始化一个数据区
格式:N DUP (表达式)
?、数值、
数值表达式
重复次数 重复装入的内容
字符等
例1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1)
DA1
00
00
DA2
41
LOP: ADD AL,[BX] ADC AH,0 INC BX LOOP LOP MOV [DI] ,AX MOV AH ,4CH INT 21H
CODE ENDS END START
9
汇编语言源程序的格式
汇编语言源程序的格式
二、指令性语句 [标号:] 操作码 [操作数] [;注释项]
操作码:指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。
第三章:8086汇编语言程序设计
主讲教师:范新民
整理ppt
1
8086汇编语言程序设计
1 3.2.1 汇编语言源程序的格式 2 3.2.2 常量、标识符和表达式 3 3.2.3 指示性语句 4 3.2.4 指令性语句 5 3.2.5 宏指令
第二部分 汇编语言程序设计——伪指令

例3.2:数据定义综合应用-2/2
.code .startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2] ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end
运算符
算术运算符 + - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD
地址型参数
汇编语言程序中,指令参数还有地址型,
它的主要形式是标号和名字(变量名、段 名、过程名等) 硬指令的操作数有存储单元;存储单元就 应该用地址型参数(存储器操作数)表达
定义字节单元伪指令DB
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
例3.4:属性及其应用-2/5
.code .startup mov al,byte ptr v_word ;用PTR改变v_word的类型,否则类型不匹配 dec al mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp n_label ;进行短转移
华中科技大学8086汇编讲义第三章宏汇编语言

第三章宏汇编语言每种计算机语言都规定了自己的字符、基本词汇、典型语句和语法规则。
同样,汇编语言也有自己的字符、基本词汇、典型语句和语法规则。
字符:ASCII字符基本词汇:符号指令(MOV、ADD)伪指令(DB、SEGMENT等)典型语句:●机器指令语句——对应机器指令的一种操作。
●伪指令语句——无机器语言与之对应,不生成机器指令。
●宏指令语句——一条宏指令对应多条机器指令,产生一组目标代码。
语法规则:基本语法单位(常量、变量、标号、表达式)前面的例子已介绍了源程序的基本结构、格式、名字的定义、语句格式,下面将更深入地介绍有关语法规则。
3.1表达式汇编程序的语句及程序格式都比较固定,语句中除正确选择操作符之外,主要问题在于正确表示操作数地址,这涉及到寻址方式,可以归结到地址表达式的使用。
表达式:由常数、寄存器、标号、变量加上运算符构成的式子。
3.1.1.常量与数值表达式一.常量常量:从源程序翻译成目标程序期间已经有确定数值的量。
用途:赋值、作立即数、位移量。
由常量与运算符组成的式子。
数值表达式在汇编期间进行运算,结果为常量。
汇编期间允许对常量进行3种运算:1.算术运算包括:+、–、*、/、模除(MOD,取余数)、右移、左移。
2.逻辑运算●逻辑乘:AND(与)●逻辑加:OR(或)●按位加:XOR(异或)●逻辑非:NOT(非)3.关系运算包括:相等(EQ)、不等(NE)、小于(L T)、大于(GT)、小于等于(LE)、大于等于(GE)。
运算结果:关系不成立,结果为0;关系成立,结果为–1(0FFFFH)。
如:N = 50M = (N EQ 50)该关系成立,M =–1。
3.1.2.变量、标号与地址表达式一.变量变量:数据存贮单元的名字。
(存放地址的符号表示)。
变量有三个属性:段、EA、类型。
其中类型由定义时的伪指令确定(DB、DW、DD、DT)。
变量的定义:格式:[变量名] 数据定义伪指令表达式[,…]数据定义伪指令:DB、DW、DD、DQ、DT等。
ARM汇编手册

ARM 汇编手册
版权声明
本手册为北京顶嵌开源科技有限公司内部培训资料,仅 供本公司内部学习使用,在未经本公司授权的情况下,请勿 用作任何商业用途。
400-661-5264
专注嵌入ห้องสมุดไป่ตู้ Linux 技术
北京顶嵌开源科技有限公司
目录
寄存器装载和存储.............................................................................................................................5 传送单一数据.............................................................................................................................5 传送多个数据.............................................................................................................................7 SWP : 单一数据交换................................................................................................................ 9
协处理器指令...................................................................................................................................23 CDP 指令................................................................................................................................. 23 LDC 指令................................................................................................................................. 23 STC 指令..................................................................................................................................24 MCR 指令................................................................................................................................ 24 MRC 指令...................................................................................................................................24
第四章 伪指令

数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。
伪指令

1、ASSERT :DEF:ENDIAN_CHANGEASSERT 是断言伪指令,语法是:ASSERT +逻辑表达式def 是逻辑伪操作符,格式为::DEF:label,作用是:判断label是否定义过ARM 伪指令ARM 汇编程序的由机器指令,伪指令和宏指令组成。
伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理。
在前面的指令集章节中,我们已经接触了几条常用到的伪指令,如ADR 、ADRL、LDR、NOP 等,把它们和指令集一起介绍是因为它们在汇编时会被合适的机器指令代替,实现真正机器指令操作。
宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。
当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令。
1 符号定义伪指令符号定义伪指令用于定义ARM 汇编程序的变量,对变量进行赋值以及定义寄存器名称,该类伪指令如下:全局变量声明:GBLA、GBLL 和GBLS。
局部变量声明:LCLA、LCLL 和LCLS。
变量赋值: SETA、SETL 和SETS。
为一个通用寄存器列表定义名称:RLIST。
为一个协处理器的寄存器定义名称:CN。
为一个协处理定义名称: CP。
为一个VFP 寄存器定义名称:DN 和SN。
为一个FPA 浮点寄存器定义名称:FN。
GBLA、GBLL、GBLS全局变量声明伪指令。
GBLA 伪指令用于声明一个全局的算术变量,并将其初始化为0。
GBLL 伪指令用于声明一个全局的逻辑变量,并将其初始化为{FALSE}。
GBLS 伪指令用于声明一个全局的字符串变量,并将其初始化为空字符串“”。
伪指令格式:GBLA variableGBLL variableGBLS variable其中:variable 定义的全局变量名,在其作用范围内必须惟一。
全局变量的作用范围为包含该变量的源程序。
伪指令应用举例如下:GBLL codedbg ;声明一个全局逻辑变量codebg SETL {TRUE} ;设置变量为{TRUE}…LCLA、LCLL、LCLS局部变量声明伪指令,用于宏定义的体中。
3-4 伪指令语句

3.4.5 其它伪指令
1. NAME 或TITLE 伪指令 格式: NAME 模块名 格式: TITLE 标题 NAME用来为模块取名字。 TITLE伪指令指定每一页上打印的标题。
2. 源程序结束伪指令
格式: END 表达式 其中表达式是该程序中第一条可执行语句的标号, 可以省略。 如果一个程序中包含多个模块,那么只有主程序 模块中的END语句需要带表达式。
3.4.4 过程定义伪指令
格式: 过程名
PROC NEAR/FAR RET 过程名 ENDP 功能:用来定义过程,供其他程序调用
•过程名是过程的名称,供其他程序调用时使用, 不能省略; •过程名具有段地址、偏移地址和类型三个属性; •过程名的段地址和偏移地址是指过程中第一条语 句的段地址和偏移地址; •过程名的类型属性由格式中的类型指明,可以有 NEAR和FAR两种。缺省是NEAR类型; •PROC和ENDP必须具有相同的过程名称; •过程内部至少要设置一条返回指令(RET)作为 过程的出口。允许过程中设置多条返回指令,即 具有多个出口。
PAGE:页边界 XXXX XXXX XXXX 0000 0000B PARA:段边界 XXXX XXXX XXXX XXXX 0000B WORD:字边界 XXXX XXXX XXXX XXXX XXX0B BYTE:字节边界 XXXX XXXX XXXX XXXX XXXXB
3.4.3 段分配伪指令 格式: ASSUME 段寄存器:段名[,段寄存器:段名,…] 功能:该语句安排在代码段的开始,通知汇编程序, 某个段是以哪一个段寄存器为它的段地址寄存器。
例:
ASSUME CS:CODE,DS:DATA,ES:EXTRA、ASTACK分别以CS、 DS、ES、SS为它们的段寄存器,这4个逻辑段分别被定义 为代码段、数据段、附加数据段和堆栈段。
附录3《 伪指令集》

附录3µ’nSP™汇编器伪指令集序号语法格式类别 功能描述1 .CODE 切换定义预定义段CODE2 .DATA定义类切换定义预定义段DATA3 label :.DD [value][,value][,…] 以32位长整型数据的形式存储双字常量4 label :.DOUBLE value[,value][,…]存储类以双精度浮点型实数数据的形式存储实数常量5 .DEFINE variable [value][,…] 定义类为变量赋值(定义常量符号)6 [label:] .DW number DUP(value)[label:] .FLOAT number DUP(value)[label:] .DD number DUP(value)[label:] .DOUBLE number DUP(value)存储 定义类与DW 、FLOAT 、DD 、DOUBLE 存储类伪指令组合在一起用于存放若干个具有相同数值的常量;或者申请若干个备用的整型、单精度浮点型、长整型以及双精度浮点型数据单元7 [label:] .DW [value][,value][,...] 存储类以16位整型数据的形式来存储常量8 .ELSE 条件类引出IF 伪指令设置条件汇编结果为假时汇编指令 9 .END 存储类用来结束程序文件或结束包含文件 10 .ENDIF 条件类用来结束条件汇编组合的定义 11 .ENDM 结束宏的定义 12 .ENDP 结束程序的定义 13 .ENDS结束结构的定义 14 label: .EQU value 为标号赋值15.EXTERNAL label[,label][,...]定义类在某文件中声明已在其它文件里定义过的标号 16 label: .FLOAT value[,value][,...] 存储类以单精度浮点型实数数据单元来存储实数常量 17 .IF value 引出在条件汇编结果为真时的汇编指令18 .IFDEF variable 引出若某变量已被赋过值时的汇编指令 19.IFMA argument#引出若指定的宏参量存在时的汇编指令 20 .IFNDEF variable条件类引出某变量还未被赋值时的汇编指令21 .INCLUDE filename 汇编方式类在汇编文件里包含某个文件22 .IRAM 切换定义预定义段IRAM 23 .ISRAM 切换定义预定义段ISRAM 24 .MACEXIT从宏定义里退出 25 label: .MACRO args 起始宏的定义26 .ORAM 定义类切换定义预定义段ORAM 27 .OSRAM 切换定义预定义段OSRAM 28 label: .PROC起始程序的定义29 .PUBLIC label[,label][,…] 定义类声明将引用在其它文件中的全局标号 30 .RAM定义类切换定义预定义段RAM续附表序号语法格式类别 功能描述31 label: .SECTION .attribute 汇编方式类建立用户定义段32 .SRAM 切换定义预定义段SRAM 33 label: .STRUCT 起始结构的定义 34 .TEXT切换定义预定义段TEXT 35 .VAR variable[=value] 定义变量并为变量置初始值36 label: .VDEF value定义类为标号赋值(可重复定义的常量符号)。
微机原理与接口技术(第三版) 龚尚福章 (4)

在同一个程序中,同样的标号或变量的定义只允许出现一 次,否则汇编程序会指示出错。
第4章 汇编语言程序设计
4.2.1 定义符号的伪指令 有时程序中多次出现同一个表达式,为方便起见,可以用
赋值伪操作给表达式赋予一个名字。 1. 等值伪指令EQU 格式: <符号名> EQU <表达式> 功能:给符号名定义一个值,赋予一个符号名、表达式或
助记符。
第4章 汇编语言程序设计
此后,程序中凡需要用到该表达式之处,就可以用表达式 名来代替了。可见,EQU的引入提高了程序的可读性,也使其 更加易于修改。上式中的表达式可以是任何有效的操作数格式, 可以是任何可以求出常数值的表达式,也可以是任何有效的助 记符。举例如下:
第4章 汇编语言程序设计
(3) 符号常数。用符号名来代替的常数就是符号常数,如 COUNT EQU 3或COUNT=3定义后COUNT就是一个符号常数,与数 值常数3等价。
第4章 汇编语言程序设计
2) 表达式
由运算对象和运算符组成的合法式子就是表达式。表达式
分为数值表达式、关系表达式、逻辑表达式和地址表达式等。
类型(TYPE)属性:类型表示该标号所代表的指令的转移范 围,分为NEAR和FAR两种。如果为NEAR型,则标号只能在段内 引用;如果为FAR型,则标号可以在段间引用。
第4章 汇编语言程序设计
(2) 变量。变量在数据段、附加数据段或堆栈段中定义, 后面不跟冒号。它也可以用LABEL或EQU伪操作来定义。变量经 常在操作数字段出现。它也有段、偏移及类型三种属性。
汇编语言最全指令表

伪指令?1、定位伪指令ORG m?2、定义字节伪指令DB X1,X2,X3, (X)?3、字定义伪指令DW Y1,Y2,Y3,…,Yn4、汇编结束伪指令END寻址方式MCS-51单片机有五种寻址方式:1、寄存器寻址2、寄存器间接寻址3、直接寻址4、立即数寻址5、基寄存器加变址寄存器间接寻址6、相对寻址7、位寻址数据传送指令一、以累加器A为目的操作数的指令(4条)?MOV A,Rn ;(Rn)→A n=0~7?MOV A,direct ;(direct )→A?MOV A,@Ri ;((Ri))→A i=0~1?MOV A,#data ;data →A二、以Rn为目的操作数的指令(3条)MOV Rn ,A;(A)→ RnMOV Rn ,direct;(direct )→ RnMOV Rn ,#data;data → Rn?三、以直接寻址的单元为目的操作数的指令(5条)MOV direct,A;(A)→directMOV direct,Rn;(Rn)→directMOV direct,direct ;(源direct)→目的directMOV direct,@Ri;((Ri))→directMOV direct,#data;data→direct四、以寄存器间接寻址的单元为目的操作数的指令(3条)MOV @Ri,A;(A)→(Ri)MOV @Ri,direct;(direct)→(Ri)MOV @Ri,#data;data→(Ri)五、十六位数据传送指令(1条)MOV DPTR,#data16;dataH→DPH,dataL →DPL六、堆栈操作指令进栈指令PUSH direct ;(SP)+1 →SP ,(direct)→ SP退栈指令POP direct七、字节交换指令(5条)?XCH A,Rn ;(A)→?(Rn)?XCH A,direct ;(A)→?(direct)?XCH A,@Ri ;(A)→?((Ri))?八、半字节交换指令?XCHD A,@Ri ;(A)0~3→?((Ri))0~3九、加器A与外部数据存贮器传送指令(4条)?MOVX A,@DPTR ;((DPTR))→A?MOVX A,@ Ri ;((Ri))→A i=0,1 ?MOVX @ DPTR ,A ;(A)→(DPTR)?MOVX @ Ri ,A ;(A)→(Ri)i=0,1 十、查表指令(i)MOVC A ,@ A+PC ;((A)+(PC))→A? (ii)MOVC A ,@A+ DPTR ;((A)+(DPTR))算术运算指令一、不带进位的加法指令(4条)ADD A,Rn ;(A)+(Rn)→AADD A,direct ;(A)+(direct)→AADD A,@Ri ;(A)+((Ri))→AADD A,#data ;(A)+#data→A二、带进位加法指令(4条)ADDC A,Rn ;(A)+(Rn)+CY→AADDC A,direct ;(A)+(direct)+CY →AADDC A,@Ri ;(A)+((Ri))+CY →AADDC A,#data ;(A)+ #data +CY →A三、增量指令(5条)INC A ;(A)+1 →A?INC Rn ;(Rn)+1 → Rn?INC direct ;(direct)+1 → direct?INC @Ri ;((Ri))+1 →(Ri)?INC DPTR ;(DPTR)+1 →DPTR四、十进制调整指令(1条)DA A减法指令一、带进位减法指令SUBB A,RnSUBB A,directSUBB A,@RiSUBB A,#data二、减1指令(4条)DEC ADEC RnDEC directDEC @Ri乘法指令MUL AB除法指令DIV AB逻辑运算指令累加器A的逻辑操作指令一、累加器A清0CLR A二、累加器A取反CPL A三、左环移指令RL A四、带进位左环移指令RLC A五、右环移指令RR A六、带进位右环移指令RRC A七、累加器ACC半字节交换指令SWAP A两个操作数的逻辑操作指令逻辑与指令ANL A,RnANL A,directANL A,@RiANL A,#dataANL direct ,AANL direct,#data逻辑或指令ORL A,RnORL A,directORL A,@RiORL A,#dataORL direct,AORL direct,#data逻辑异或指令XRL A,RnXRL A,directXRL A,@RiXRL A,#dataXRL direct,AXRL direct,#data位操作指令位变量传送指令MOV C,bitMOV bit,C位变量修改指令CLR CCLR bitCPL CCPL bitSETB CSETB bit位变量逻辑与指令ANL C,bitANL C,/bit位变量逻辑或指令ORL C,bitORL C,/bit控制转移指令无条件转移指令(4条)1、短跳转指令AJMP addr11 ;先(PC)+2→PC ;addr11→PC10~0 ,(PC15~11)2、跳转指令LJMP addr16 ;Addr16→PC3、转移指令SJMP rel ;先(PC)+2→PC;后(PC)+rel→PC4、寄存器加变址存器间接转移指令(散转指令)JMP @A+DPTR ;(A)+(DPTR)→PC条件转移指令(8条)一、测试条件符合转移指令JZ rel ;当A=0 时,(PC)+rel→(PC)转移;当A≠0时,顺序执行。
第3章ARM汇编语言程序设计GNU汇编ppt课件

时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时, 只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的 同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器 R0~R3完成。 以下是使用BL指令调用子程序的汇编语言源程序的基本结构:
.string/.asciz/.ascii
语法格式 .string/.asciz/.ascii 表达式{,表达式}...
作用
.string/.asciz/.ascii定义多个字符串。 注意:ascii伪操作定义的字符串需要自动添加结尾字符'\0'
举例
.string "abcd","hello"
bne 1f @跳转到1标号去执行 局部标号代表它所在的地址,因此也可以当作变量或
者函数来使用。
Linux汇编程序中的分段
(1).section伪操作
用户可以通过.section伪操作来自定义一个段,格式如下 :
.section section_name [, "flags"[, %type[,flag_specif
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为−255B~255B;
当地址值是字对齐时,其取指范围为−1020B~1020B。
ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的 地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被 编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB 指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错 误,编译失败。
第四章伪指令

第四章伪指令汇编语言源程序由一系列语句构成,这些语句既可以是指令,也可以是伪指令。
指令是由CPU负责执行的,每一条指令都和一条机器语言相对应。
而伪指令是由汇编程序负责执行,完成一些内存单元分配、段之间的连接关系等操作,所以伪指令并不会生成机器指令,也就不会被CPU执行。
在本章中,重点讲解一些常用的伪指令及其功能。
4.1伪指令的分类及伪指令语句格式伪指令又称为伪操作,它虽然不会被CPU执行,但却可以指示汇编程序按照用户的意图,完成数据的定义、存储器的分配、指示程序结束等功能。
所以伪指令在汇编语言程序设计过程中具有重要的意义,希望读者在学习过程中应该加以高度重视。
4.1.1 伪指令的分类8088/8086的伪指令大致可分为以下八类:·数据定义伪指令;·符号定义伪指令;·段定义伪指令;·过程定义伪指令;·结束伪指令;·条件汇编伪指令;·结构、记录定义伪指令;·其他伪指令。
其中,条件汇编伪指令与结构、记录定义伪指令将在第八章予以介绍。
4.1.2 伪指令语句格式伪指令语句格式一般由四部分组成。
语句格式: [变量] 伪指令助记符参数1,参数2····参数n[;注释]说明:伪指令助记符规定了伪指令的功能。
一般伪指令都有参数,用于说明伪指令的操作对象,参数的类型和个数随着伪指令的不同而不同。
有时参数是常数或数值表达式,有时参数是一般的符号,有时是具有特殊意义的符号。
伪指令语句中的变量可有可无,如果伪指令语句中出现变量,则汇编程序使其记以第一个字节的偏移地址。
注释部分也是可有可无的,用于说明该伪指令的功能。
例如 VAR1 DW 1234H,5678H ;定义VAR1为字变量该语句中的VAR1为变量;DW为伪指令助记符;1234H与5678H为参数;分号后面给出的文字为注释。
4.2汇编语言中的数据项数据项是指令或伪指令语句操作对象的基本组成部分。
常用ARM指令

常用ARM指令及汇编包括1、ARM处理器寻址方式2、指令集介绍3、伪指令4、ARM汇编程序设计5、C与汇编混合编程ARM处理器寻址方式1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作MOV R1, R2 ;R2->R1SUB R0, R1,R2 ;R1-R2 -> R02、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数SUBS R0,R0,#1 ;R0-1 -> R0MOV R0,#0xff00 ;0xff00 -> R0注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作MOV R0,R2,LSL #3 ;R2的值左移3位,结果存入R0,即R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相与操作,结果放入R1寄存器偏移寻址可采用的移位操作如下(1)、LSL(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0(2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0(3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1(4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位(5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C 填充4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针LDR R1,[R2] ;将R2中的数值作为地址,取出此地址中的数据保存在R1中SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。
汇编语言伪指令

汇编语言伪指令在编写汇编语言程序时,会用到另一类指令,这类指令仅供汇编程序将源程序翻译成目标程序时使用,本身并不形成机器码,这类指令称为伪指令。
由此可知,指令有二类:(1)汇编指令:是编译后产生气器码的指令。
(2)伪指令:仅供汇编程序使用,编译后不产生气器码的指令。
下面简洁介绍5条伪指令。
1. 汇编起点指令ORG(Origin)指令格式:ORG nn作用:将ORG nn 后的程序机器码或数据存放以nn为首地址的存储单元中。
如在下面的例4-1中,伪指令ORG 2000H 将目标程序从地址2000H处开头存放。
2. 定义字节指令DB (Define Byte)指令格式:[LABEL] DB N1,N2,…,Nm作用:将DB后的8位字节数据N1,N2,…,Nm依次存入以标号LABEL为首地址的存储单元中。
若无标号,则N1,N2,…Nm依次存放在DB上一条指令之后的存储单元中。
如在例4-1中伪指令DB 将字节数据55,38依次存放到以标号LABEL3为首地址的存储单元2100H~2101H中。
3. 定义字指令DW (Define Word)指令格式:[LABEL] DW NN1,NN2,…,NNm作用:将DW后的16位字数据NN1,NN2,…,NNm依次存放到以标号LABEL为首地址的存储单元中,若无标号,则NN1,NN2,…,NNm依次存放在DW上一条指令之后的存储单元中。
在例4-1中,伪指令DW 同样可将字数据5538存放到以标号LABEL3为地址的存储单元2100H~2101H中。
4. 等值指令EQU (Equate)指令格式:LABEL EQU nn作用:将16位地址nn赋给标号LABEL,在例4-1中,伪指令LABEL0 EQU 2100H将地址2100H赋给标号LABEL0。
5. 结束汇编指令END作用:汇编程序编译源程序时,遇到伪指令END,不管END下面是否还有其它指令都将停止编译。
例1 将地址为2100H存储单元中内容55与地址为2101H存储单元内容38进行十进制数相加,运算结果93存放在地址为2102H的存储单元中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、定义段的伪指令 2、定义数据的伪指令 3、变量的属性及属性操作符 DB定义字符串 4、用DB定义字符串 问号? DUP在DB和DW的应用 5、问号?及DUP在DB和DW的应用 6、定义符号名的伪指令 地址计数器$ 7、地址计数器$ 置地址计数器伪指令ORG 8、置地址计数器伪指令ORG 9、堆栈定义及堆栈指针初始化
3
难点) 3、变量的属性及属性操作符(难点) 变量一旦定义,便具有某些属性, 变量一旦定义,便具有某些属性, 在此,只介绍其中3种属性: 在此,只介绍其中3种属性:
①段地址属性 ②偏移地址属性 偏移地址属性 变量类型属性 ③变量类型属性
与 与 与
段地址属性操作符SEG 段地址属性操作符SEG 偏移地址属性操作符OFFSET 偏移地址属性操作符OFFSET 属性操作符 类型属性操作符PTR 属性操作符 类型属性操作符PTR
01 02 56H 34H 07H 00H M1 M2
例1
D1 SEGMENT M1 DB 1,2 3456H M2 DW 3456H,7 D1 ENDS
OFFSET的用途之一 OFFSET的用途之一: 的用途之 OFFSET用于变量名前, OFFSET用于变量名前, 用于变量名前 取变量的有效地址。 取变量的有效地址。
无论M1原来是何类型,均按字节访问M1 无论M1原来是何类型,均按字节访问M1 M1原来是何类型
无论M1原来是何类型,均按字访问M1 无论M1原来是何类型,均按字访问M1 M1原来是何类型
14
例
D1 SEGMENT M1 DB 1,2 3456H M2 DW 3456H,7 D1 ENDS
分析下列语句是否正确? AX, 1. MOV AX,M1 AX, 2. MOV AX,WORD PTR M1 AX=? AX=0201H AL, 3. MOV AL,M1 PTR临时改变操作数的类型属性 PTR临时改变操作数的类型属性 BL, 4. MOV BL,M2 BL=? BL=56H BL, 5. MOV BL,BYTE PTR M2 CX, 6. MOV CX,M2 DX, 7. MOV DX,M2+2
34H 07H 00H
5
段地址属性与段地址属性操作符 属性与段地址属性操作符SEG ① 段地址属性与段地址属性操作符SEG D1 SEGMENT 01 M1 M1 DB 1,2 02 3456H M2 DW 3456H,7 D1 ENDS 56H M2
获得段地址值的方法之一: 获得段地址值的方法之一: 之一 用段名作立即数,取段地址值。 用段名作立即数,取段地址值。 MOV AX,D1 AX, DS,AX;完成DS DS的初始化 MOV DS,AX;完成DS的初始化 获得段地址值的方法之二: 获得段地址值的方法之二: 之二 在变量名前用SEG操作符,取变量的段地址值。 SEG操作符 在变量名前用SEG操作符,取变量的段地址值。 AX, M1 MOV AX,SEG M1 MOV DS, AX
4
段地址属性与段地址属性操作符 属性与段地址属性操作符SEG ① 段地址属性与段地址属性操作符SEG D1 SEGMENT 01 M1 M1 DB 1,2 02 3456H M2 DW 3456H,7 D1 ENDS 56H M2
变量一旦定义,便具有段地址值; 变量一旦定义,便具有段地址值; 一般不必知道段地址的具体值是多少, 一般不必知道段地址的具体值是多少, 但必须完成段寄存器的初始化。 但必须完成段寄存器的初始化。
~~~
10
DB X0,X1,X2,X3,X4,X5,X6,X7,X8,X9 ENDS SEGMENT CS:CODE,DS: ASSUME CS:CODE,DS:DATA START: AX, START:MOV AX,DATA DS, MOV DS,AX AL) (AL)=X0+X1+ … +X9 AL, MOV AL,0 CX, MOV CX,10 BX, MOV BX,OFFSET BUFF AL, L1: ADD AL,[BX] OFFSET用于设置地址指针 用于设置地址指针!!! OFFSET用于设置地址指针!!! INC BX LOOP L1 HLT
分析变量在内存中的存放形式
D2 SEGMENT X DB 1,2 S1 DB ‘1’,‘2’ 34ABC’ S2 DB ‘34ABC’ D2 ENDS
01 02 56H 34H 07H 00H M1 M2
BX, MOV BX,OFFSET M1 MOV SI,OFFSET M2 SI,
(BX)=? (SI)=?
(BX)=0000H (BX)=0000H 0000 (SI)=0002H (SI)=0002H 0002
取变量的偏移地址值(传地址) OFFSET 取变量的偏移地址值(传地址) 一般,不同变量具有不同的偏移地址值 一般,不同变量具有不同的偏移地址值 7
说明下列指令执行后,各寄存器的值= 说明下列指令执行后,各寄存器的值=? CODE SEGMENT CS:CODE,DS: ASSUME CS:CODE,DS:D1 START: AX,D1 START:MOV AX,D1 MOV DS,AX ;AX=? 3456H 直接寻址 AX,M2 MOV AX,M2 立即寻址, MOV SI,OFFSET M2 ;SI=? 0002H 立即寻址,取地址 ;CX=? 3456H 间接寻址 MOV CX,[SI] ;DX=? 7 间接相对寻址 DX,2 MOV DX,2[SI] … OFFSET的用途之 的用途之二 CODE ENDS OFFSET的用途之二: OFFSET用于任何存储器操作数 用于任何存储器操作数前 OFFSET用于任何存储器操作数前, 取操作数的有效地址。 取操作数的有效地址。 ~~~ 9
1
要点归纳: 要点归纳
1、定义段的伪指令
段名 SEGMENT 定义段的伪指令, 定义段的伪指令, 必须成对出现 ┇ 必须有段名 段名 ENDS ASSUME CS:CODE,DS:DATA
;用在代码段首行,指定段寄存器
段的起始地址由系统自动安排 段的第一个单元的偏移地址一定是0000 0000H 段的第一个单元的偏移地址一定是0000H 段的起始地址一定为 起始地址一定为×××× (段的起始地址一定为××××0H) CS: CS:IP 会自动初始化 用户应完成其它段寄存器和偏移地址寄存器 寄存器和偏移地址寄存器的初始化 用户应完成其它段寄存器和偏移地址寄存器的初始化 2
01 02 56H 34H 07H 00H
M1 M2
~~~
15
注意
若MOV指令中两个操作数的类型都不确定时, MOV指令中两个操作数的类型都不确定时, 指令中两个操作数的类型都不确定时 必须用PTR说明其中一个操作数的类型。 PTR说明其中一个操作数的类型 必须用PTR说明其中一个操作数的类型。 分析下列语句是否正确?
② 偏移地址属性操作符OFFSET 偏移地址属性操作符OFFSET 属性操作符 D1 SEGMENT M1 DB 1,2 3456H M2 DW 3456H,7 D1 ENDS 注意 地址传送与数据传送 传地址;立即寻址 传地址; BX, BX) 0000H MOV BX,OFFSET M1 ;(BX)← 0000H,传地址 AL) 0000H MOV AL, AL, M1 ;(AL)←(0000H),传数据 无OFFSET时,则为传数据, OFFSET时 则为传数据, 直接寻址, 直接寻址,等价于 AL, MOV AL,[0000H] 8
34H 07H 00H
等价与
AX, M2 MOV AX,SEG M2 MOV DS, AX
一个段中的所有变量具有相同的段地址值! 一个段中的所有变量具有相同的段地址值! 段地址值
6
② 偏移地址属性操作符OFFSET 偏移地址属性操作符OFFSET 属性操作符 D1 SEGMENT M1 DB 1,2 3456H M2 DW 3456H,7 D1 ENDS 任何变量都具有偏移地址 任何变量都具有偏移地址 在变量名前用OFFSET操作符, OFFSET操作符 在变量名前用OFFSET操作符, 取变量的偏移地址值。 取变量的偏移地址值。
1. MOV [DI],AL 2. MOV [DI],5 应该为: 应该为: MOV BYTE PTR [DI],5 或 MOV WORD PTR [DI],5
16
小结
AX, 1. MOV AX,
2. MOV 3. MOV 4. MOV 5. MOV
D1 SEGMENT M1 DB 1,2 3456H M2 DW 3456H,7 D1 ENDS 传送地址 传送数据
归纳: 归纳
2、定义数据的伪指令
DB 数1[,数2,… ][;注释]
一般格式: 一般格式:
[变量名] DB DW DD
其它几个定义数据的伪指令: 其它几个定义数据的伪指令: 定义数据的伪指令
一个数据占1 定义字节数据 Defin Byte,一个数据占1个字节 Word, 一个数据占2 定义字数据 Defin Word, 一个数据占2个字节 定义双字数据 Defin Double word 一个数据占4 一个数据占4个字节
M1 M2
~~~
13
类型属性操作符 PTR
PTR用在存储器操作数前 临时改变操作数的类型属性。 PTR用在存储器操作数前,临时改变操作数的类型属性。 用在存储器操作数 操作数 属性
语法格式: 语法格式: BYTE/WORD BYTE/WORD PTR 存储器操作数 BYTE 按字节访问操作数 WORD 按字访问操作数 例: 1. MOV AL, BYTE PTR M1 2. MOV AX, WORD PTR M1
SEG M2 BX, BX, OFFSET M2 AX, M2 AL, BYTE PTR M2 [DI],32 WORD PTR [DI],32
17