汇编语言格式要求
汇编语言程序格式
汇编语言程序格式编程语言是计算机与人之间交流的桥梁,通过编写程序代码,我们可以指导计算机执行特定的任务。
汇编语言是一种底层的编程语言,它直接与计算机硬件进行交互,并提供了对机器指令的精细控制。
在编写汇编语言程序时,我们需要遵循一定的格式,以确保程序的正确性和可读性。
本文将介绍汇编语言程序的格式要求。
一、程序结构在编写汇编语言程序时,需要明确的程序结构是很重要的。
一个典型的汇编语言程序由如下几个部分组成:1. 数据段(.data):用于定义程序中使用的数据,如变量、常量等。
2. 代码段(.text):包含实际的机器指令,用于执行特定的任务。
3. 其他段(如堆栈段):根据需要定义的其他段。
二、指令格式每个汇编指令都有特定的格式,以便告诉计算机应该执行什么操作。
一个标准的汇编指令格式通常包含如下几个部分:1. 操作码(Opcode):用于指定要执行的操作,如“mov”用于将数据从一个位置移动到另一个位置。
2. 操作数(Operand):操作数描述了要对其进行操作的数据。
操作数可以是立即数、寄存器或内存地址等。
3. 注释(Comment):注释用于解释指令的作用和目的,提高程序的可读性。
三、指令的排列在编写汇编语言程序时,指令的排列很重要。
正确的指令排列可以提高程序执行效率和可读性。
一般而言,指令按照执行的顺序排列,具有逻辑关系的指令可以分组编写。
四、标签和跳转在程序中,我们常常需要使用标签和跳转指令来实现条件执行和循环等功能。
标签是程序中的一个标记,用于标识某个位置,而跳转指令则会根据一定的条件,跳转到指定的标签处继续执行。
在使用标签和跳转指令时,需要注意以下几点:1. 标签需要以冒号(:)结尾,以便与其他变量或指令进行区分。
2. 跳转指令一般以条件代码作为前缀,如“je”(等于跳转)、“jne”(不等于跳转)等。
五、宏定义宏定义是一种将一段常用代码片段定义为简单的符号表示的方式。
在汇编语言中使用宏定义可以提高代码的可读性和重用性。
汇编语言设计实践:第4部分 基本汇编语言
4.1 汇编语言语句种类及其格式
汇编语言的程序格式
• 完整的汇编语言源程序由段组成,段由指令语句与 伪指令语句构成
• 一个汇编语言源程序可以包含若干个代码段、数据 段、附加段或堆栈段,段与段之间的顺序可随意排 列
• 需独立运行的程序必须包含一个代码段,并指示程 序执行的起始点,一个程序只有一个起始点
• 所有的指令语句必须位于某一个代码段内,伪指令 语句可根据需要位于任一段内或段外
汇编语言的语句可以分为指令语句和伪指令语句
•指令语句——产生使CPU产生动作、可供机器
执行的机器目标代码
•伪指令语句——不产生CPU动作、在程序执行
前由汇编程序处理的说明性语句,例如,数据说明、 变量定义等等
2
一、指令语句
每一条指令语句在汇编时都要产生一个可供CPU执 行的机器目标代码,它又叫可执行语句。
指令语句的一般格式为: 标号 : 操作码
, 操作数
; 注释
一条指令语句最多可以包含4个字段 例 L1:MOV AH,0A0H ;将0A0H放入AH
3
1.标号字段
标号是可选字段,它后面必须有“:”。标号是一条 指令的符号地址,代表了该指令的第一个字节存放 地址。
注释字段可以是一条指令的后面部分,也可以是 整个语句行。
例:
LABEL1: ADD AX,BX; 功能为AX<=(AX)+(BX)
;后面的程序段将完成两次对存储器的访问
MOV AX, W_VAR1
MOV W_VAR2, AX
7
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。
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
汇编语言的基本语法ppt
举例:已有数据定义如下:
TWO_BYTE DW ? 可以用以下语句对这两个字节赋予另一种
类型定义:
ONE_BYTE EQU BYTE PTR TWO_BYTE 这里ONE_BYTE与TWO_BYTE两个符号
地址具有相同得段地址与偏移地址,但就是它们 得类型属性不同,前者为1,后者为2。
此外,有时指令要求使用PTR操作符。例如 用 MOV [BX], 5
OR ((PORT_VAL GE 5) AND 30) 则当PORT_VAL < 5时,汇编结果应该就是:
MOV BX, 20 否则,汇编结果应该就是:
MOV BX, 30
(4) 数值回送操作符 数值回送操作符有:TYPE、
LENGTH、SIZE、OFFSET、SEG等。 数值回送操作符把一些特征或存储
例如,用段前缀指定某段得地址操作数 MOV AX,ES:[BX + SI]
·SHORT 用来修饰JMP指令中转向地址得属性,指
出转向地址就是在下一条指令地址得±127个 字节范围之内。
例如: JMP SHORT TAG ;转移属性为短转移 、 、 、
TAG: MOV、、、
·THIS 格式为: THIS 属性或类型 THIS可以象PTR一样建立一个指定
又例如: MOV CX, SIZE TABLE
将形成为 MOV CX, 1。
·OFFSET 格式为:OFFSET 变量或标号 汇编程序将回送变量或标号得偏移地址值。
举例: MOV BX, OFFSET OPER_ONE
汇编程序将OPER_ONE得偏移地址作为 立即数回送给指令,而在执行时则将该偏移地址 装入BX寄存器中。所以这条指令得功能与指 令
汇编语言的基本语法
ARM汇编语言的语法知识
地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-64K~64K; 当地址值是字对齐时,其取值范围为-256K~256K; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADRL伪指令在同一个代码段中 .
• ARM伪指令——大范围的地址读取
指令执行的条件码 加载的目标寄存器 地址表达式
地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-255~255字节; 当地址值是字对齐时,其取值范围为-1020~1020字节; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADR伪指令在同一个代码段中.
• ARM伪指令——中等范围的地址读取
;单元,并初始化为0
• ARM汇编语言伪指令----数据定义伪操作
MAP MAP用于定义一个结构化的内存表的首地址.此时,内存 表的位置计数器设置成该地址值.该伪操作可以用"^"代替.
MAP伪操作举例
LTORG伪操作通常放在无条件跳转指令之后,或者子程
序返回指令之后,这样处理器就不会错误地将数据池中的
数据当做指令来执行.
用LTORG伪指令定义数据缓冲池举例
Funel
;子程序
LDR R1, =0x8000;将0x8000加载到R1
MOV PC, LR
LTORG
;定义数据缓冲池,存放0x8000
Data SPACE 40 ;从当前位置开始分配40字节的内存
使用示例:
height DN width SN lower FN
6 ;将VFP双精度寄存器6名称定义为height 16 ;将VFP单精度寄存器16名称定义为width 6 ;将浮点寄存器6名称定义为lower
3.1 MCS-51汇编语言指令格式
·@: 表示间接寻址寄存器或基址寄存器的前缀符号。 ·@Ri: 表示寄存器间接寻址,常常作间接寻址的地址指针。 其中Ri代表R0和R1寄存器中的一个。
16
第一节 指令格式
P35 常用符号 ·addr16: 表示16位地址 ·addr11: 表示11位地址 ·rel: 用补码形式表示的地址偏移量,取值范围为-128~+127。 ·Bit: 表示内部RAM和SFR中的具有位寻址功能的位地址。 ·$: 表示当前指令的地址。 ·#date16: 表示16位立即数,即16位常数, 取值范围为#0000H~#0FFFFH
6
第一节 指令格式
根据指令格式,找出表中指令的 根据指令格式,
实际地址 标号 汇编指令助记符
ORG 0060H R5,#100 R6,#200 R7,#248
操作码
0060H 0062H 0064H
DELAY: MOV D1: MOV D2: MOV
D3: DJNZ R7,D3
DJNZ R6,D2 DJNZ R5,D1 RET END
4
0064H 0062H
实验6.1 实验
ORG 0000H AJMP START ORG 0050H START: MOV R0,#30H MOV R2,#10H CLR A L1: MOV @R0,A INC INC R0 A
L2: DJNZ R2,L1 L3: SJMP L3 END
5
第一节 指令格式
ORG 0060H
0060H 0062H 0064H
START: CLR P3.7 MOV R2,#07H
MOV A,#0FEH LOOP: MOV LCALL P0,A DELAY
RL
A
汇编语言及编程实例(电子教案)
汇编语言及编程实例(电子教案)汇编语言程序设计2005第四章汇编语言程序设计回顾:8086的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。
本讲重点:了解汇编的概念及其方法,掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤。
4.1汇编语言的基本元素一、汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。
每个语句由1~4个部分组成,其格式是:[标号]指令助记符[操作数][;注解]其中用方括号括起来的部分,可以有也可以没有。
每部分之间用空格(至少一个)分开,一行最多可有132个字符。
1.标识符给指令或某一存储单元地址所起的名字。
可由下列字符组成:字母:A~z;数字:0~9;特殊字符:、·、@、一、$数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。
标识符最长为31个字符。
当标识符后跟冒号时,表示是标号。
它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。
2.指令助记符表示不同操作的指令,可以是8086的指令助记符,也可以是伪指令。
3.操作数指令执行的对象。
依指令的要求,可能有一个、两个或者没有,例如:RET;无操作数COUNT:INCC某;一个操作数如果是伪指令,则可能有多个操作数,例如:COSTDB3,4,5,6,7;5个操作数MOVA某,[BP+4];第二个操作数为表达式4.注解该项可有可无,是为源程序所加的注解,用于提高程序的可读性。
二、汇编语言的运算符1.算术运算符、逻辑运算符和关系运算符-1-汇编语言程序设计2005算术运算符可以应用于数字操作数,结果也是数字。
而应用于存储器操作数时,只有+、-运算符有意义。
2.取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH·SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。
例如,定义:SLOTDW25则:MOVA某,SLOT;从SLOT地址中取一个字送入A某MOVA某,SEGSLOT;将SLOT所在段的段地址送入A某MOVA某,OFFSETSLOT;将SLOT所在段的段内偏移地址送A某·TYPE操作符返回一个表示存储器操作数类型的数值。
arm的汇编 标准
arm的汇编标准
ARM的汇编语言规范如下:
1. 汇编语句格式:在ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。
2. 标识符大小写:ARM汇编器对标识符大小写敏感,书写标号及指令时字
母大小写要一致,一个ARM指令、伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用。
3. 注释:注释使用“;”,注释内容由“;”开始到此行结束,注释可以在一行的顶格书写。
4. 格式:格式为[标号] <指令条件S> <操作数>[;注释]。
5. 空行和换行:源程序中允许有空行,适当地插入空行可以提高源代码的可读性。
如果单行太长,可以使用字符“”将其分行,“”后不能有任何字符,包括空格和制表符等。
6. 变量和常量:对于变量的设置,常量的定义,其标识符必须在一行的顶格书写。
以上就是ARM汇编的一些规范,供您参考。
如果需要更多信息,建议查阅相关书籍或咨询专业人士。
汇编语言书写格式
汇编语言书写格式
汇编语言是一种低级语言,其书写格式直接影响到程序的可读性和可维护性。
以下是汇编语言的书写格式要点:
1. 缩进:汇编语言中,缩进是非常重要的。
它有助于区分不同的指令块,也有助于使代码更易读。
建议在每个块开始时缩进4个空格。
2. 标号:标号用来标记指令块或数据块的入口点。
在汇编语言中,标号必须以英文字母或下划线开头,并且不能包含空格或其他特殊字符。
3. 注释:注释是一种非常重要的东西,它可以用来解释代码的功能,或者提供帮助信息。
注释可以放在代码的任何位置,但建议放在指令块之前,并且用分号(;)进行标记。
4. 指令格式:汇编语言的指令格式通常为操作码目标操作数,源操作数。
例如:
MOV AX, BX
其中 MOV 是操作码,AX 是目标操作数,BX 是源操作数。
通常,目标操作数在前,源操作数在后。
5. 数据定义:在汇编语言中,可以使用数据定义来定义变量和常量。
数据定义通常放在程序的开始处,并使用特定的指令进行定义。
例如:
MyVar DD 10
其中,MyVar 是变量名,DD 是定义指令,10 是变量的初始
值。
6. 控制结构:汇编语言也支持控制结构,如条件语句和循环语句。
这些语句通常使用跳转指令实现。
例如:
CMP AX, BX
JE Label
其中,CMP 指令用于比较两个操作数的大小,JE 指令用于跳转到 Label 标号处。
总之,良好的汇编语言书写格式能够提高程序的可读性和可维护性,同时也是一种编程规范的体现。
汇编语言程序格式
2. 段使用设定语句 汇编程序根据段开始语句和段结束语句判断出源程序的段划分,
为了有效地产生目标代码,汇编程序还要了解各程序段与段寄 存器间的对应关系。这种对应关系由段使用设定语句说明。
ASSUME 段寄存器名:段名[,段寄存器名:段名……] 段寄存器名可以是CS,DS,SS和ES。 段名就是段开始和段结束语句中规定的段名。
例如:CS寄存器对应CSEG段,DS寄存器对应DSEG段。
ASSUME CS : CSEG , DS : DSEG ASSUME伪指令中段名也可以是一个特别的关键字NOTHING,
它表示某个段寄存器不与任何段有对应关系。
DSEG1 SEGMENT VARW DW 12
DSEG1 ENDS DSEG2 SEGMENT
2. 重复操作符DUP 有时需要定义数组,有时还需要定于数据缓冲区。 例如: BUFFER DB 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 以上操作太不方便,为此,汇编语言停供了在数据定义语句中 使用的重复操作符DUP。 比如,上述定义语句与如下定义语句起相同的作用: BUFFER DB 8 DUP(0) 重复操作符DUP的一般格式如下: count DUP (表达式[, 表达式, ……]) 例如: BUFFER1 DB 5 , 0 , 5 DUP(?)
6. 优先级 汇编语言中各种运算符和操作符的优先级按高到低排列如下: (1)圆括号,尖括号,方括号,圆点符,LENGTH,SIZE, WIDTH , MASK。 (2)PTR, OFFSET,SEG,TYPE, THIS,冒号。 (3)* , / , MOD, SHL, SHR (4)HIGH, LOW (5)+ , (6)EQ,NE,LT,LE,GT,GE (7)NOT (8)AND (9)OR , XOR (10)SHORT
汇编语言的格式
5.2 汇编语言源程序的格式在第四章介绍指令系统时曾给出若干程序举例,但是,它们仅仅是一些程序片段,并不是完整规范的汇编语言源程序。
下而给出一个比较简单,然而比较规范的汇编语言源程序。
例5.1要求将两个五字节16进制数相加,可以编写出以下汇编语言源程序。
DATA SEGMENT ;定义数据段DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数DATA2 DB 0C1H,36H,9EH,0D5H,20H ;加数DATA ENDS ;数据段结束CODE SEGMMENT ;定义代码段ASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AX ;初始化DSMOV CX,5 ;循环次数送CXMOV SI,0;置SI初值为0CLC;清CF标志LOOPER:MOV AL,DATA2[SI];取一个字节加数ADC DA TA1[SI],AL;与被加数相加INC SI;SI加1DEC CX;CX减1JNZ LOOPER;若不等于0,转LOOPERMOV AH,4CHINT21H;返回DOS CODE END;代码段结束END START;源程序结束5.2.1 分段结构由上面的例子可以看出,汇编语言源程序的结构是分段结构形式,一个汇编语言源程序由若干段(SEGMENT)组成,每个段以SEGMENT语句开始,以ENDS语句结束。
整个源程序的结尾是END语句。
这里所说的汇编语言源程序中的段与前面讨论的CPU管理的存储器的段,既有联系,又在概念上有所区别。
我们已经知道,微处理器对存储器的管理是分段的,因而,在汇编语言程序中也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目标程序后,可以分别装入存储器的相应段中。
但是,以8086/8088 CPU为例,它有四个段寄存器(CS,ES,SS和DS),因此CPU对存储器按照四个物理段进行管理,即数据段,附加段,堆栈段和代码段。
汇编语言指令格式
POP r16/m16/seg ; 出栈指令:
; r16/m16/seg←SS:[SP] ; SP←SP+2
• 堆栈的概念 • 堆栈的操作:进栈和出栈 • 堆栈的特点
2021/10/14
什么是堆栈
• 堆栈是一个“先进后 出”的主存区域,位 于堆栈段中,使用SS 段寄存器记录其段地 址。
2021/10/14
例:地址指针的传送
mov word ptr [3060h],0100h mov word ptr [3062h],1450h lds si,[3060h] ;ds=1450h,si=0100h les di,[3060h] ;es=1450h,di=0100h
;mem指定主存的连续4个字节作为逻辑地址( 32位的地址指针),送入DS:reg或ES:reg。
• seg —— 泛指段寄存器CS/DS/ES/SS • m8 —— 泛指8位存储器操作数单元(包括所有寻址方式)
m16 —— 泛指16位存储器操作数单元(包括所有寻址方式) mem —— 泛指m8或m16 • i8 —— 泛指8位立即数 i16 —— 泛指16位立即数 imm —— 泛指i8或i16 • dest—— 泛指目的操作数 src —— 泛指源操作数
2021/10/14
8088指令系统概述
• Intel 8088指令系统共有117条基本指令,可 分成以下 6 类:
① 数据传送类指令 ② 算术运算类指令 ③ 位操作类指令 ④ 串操作类指令 ⑤ 控制转移类指令 ⑥ 处理机控制类指令
2021/10/14
学习指令的注意事项
• 指令功能——该指令能够实现何种操作。通常指令助记符 就是指令功能的英文单词或其缩写形式。
汇编语言语法
汇编语言语法
汇编语言是一种低级语言,它使用符号代表机器指令,用于编写底层程序。
以下是汇编语言的语法规则:
1. 指令格式
汇编语言的指令格式通常由操作码和操作数组成。
操作码表示要执行的操作,操作数则是指令要操作的数据。
指令格式通常如下:
操作码操作数1, 操作数2
其中,操作数可以是寄存器、内存地址或立即数。
2. 注释
汇编语言中的注释以分号(;)开头,可以在指令后面或单独一行中使用。
注释用于解释代码的作用和用途,提高代码的可读性。
3. 标号
汇编语言中的标号用于标识程序中的位置,通常用于跳转指令和数据定义。
标号以字母或下划线开头,后面可以跟数字和字母。
标号后面必须加冒号(:)。
4. 寄存器
汇编语言中的寄存器用于存储数据和执行操作。
常用的寄存器包括AX、BX、CX、DX等。
寄存器名通常以字母开头,后面可以跟数字。
5. 内存地址
汇编语言中的内存地址用于访问内存中的数据。
内存地址通常由段地址和偏移地址组成。
段地址和偏移地址可以用方括号括起来表示,例如[0x1000:0x0000]。
6. 数据定义
汇编语言中的数据定义用于定义变量和常量。
数据定义通常以关键字开头,例如DB表示定义一个字节,DW表示定义一个字。
数据定义后面可以跟变量名和初始值。
7. 跳转指令
汇编语言中的跳转指令用于改变程序的执行流程。
常用的跳转指令包括JMP、JE、JNE等。
跳转指令后面通常跟标号。
以上是汇编语言的语法规则,掌握这些规则可以编写简单的汇编程序。
汇编语言程序格式
1.2汇编语言程序的段定义
DATA_SEG1 SEGMENT PARA
DATA_SEG1 ENDS
DATA_SEG2 SEGMENT PARA
…….
DATA_SEG2 ENDS
E_SEG1
SEGMENT PARA
……..
ቤተ መጻሕፍቲ ባይዱ
E_SEG1
ENDS
E_SEG2
SEGMENT PARA
……..
E_SEG2
ENDS
ENDP 说明:过程属性项省略,系统默认为NEAR,表示段内调用, FAR 过程体至少有一条返回指令RET,RET一般放在过程体的最后。 也可以使用带参数的返回语句,如RET n。
1.3汇编语言源程序过程定义
MY_CODE SEGMENT
UP_COUNT PROC NEAR
ADDCX, 1
RET
UP_COUNT ENDP
1.2 汇编语言程序的段定义
存储器是采用分段管理方式,在编制任意源程序时亦必 须按段来构造程序。按段来构造程序有两种形式:一种是完
1.
NAME TITLE EQU EXTRN PUBLIC SEG1
SEG1 SEG2
SEG2
SEGMENT PARA STACK …… ENDS SEGMENT PARA STACK ; …… ENDS
避免多模块使用不同起始地址,只有主模块使用起始地址, 否则引起程序出错。
1.4标准程序前奏
Code_SREG1 SEGMENT‘CODE’ ASSUME CS:Code_SREG1…
MAIN PROC FAR ……… RET
MAIN ENDP Code_SREG1 ENDS
END MAIN Code_G2 SEGMENT ‘CODE’
第4章 汇编语言程序格式
WORD——从字边界(偶数地址)开始
DWORD——从双字边界(4的倍数地址)开始 PAGE——从低8位物理地址为0处开始
(2) 组合类型(combine_type)说明程序连接时的段合并方法,可以是:
PRIVATE——私有段,不与其它模块中的同名段合并——默认值 PUBLIC——公有段,连接时与其它模快中的同名段合并成一个段
4.2.1 处理机选择伪操作
.8086 . 286 . 286P . 386 . 386P 选择8086指令系统 选择80286指令系统 选择保护模式下的80286指令系统 选择80386指令系统 选择保护模式下的80386指令系统
. 486
. 486P . 586
选择80486指令系统
选择保护模式下的80486指令系统 选择Pentium指令系统
CS:CSEG,DS:DATAGROUP
START:MOV MOV ……
AX,DATAGROUP DS,AX
4.3.3 程序开始和结束伪操作
1. 开始伪操作
在程序的开始可以用NAME或TITLE作为模块的名字,NAME的格式是: NAME 模块名
如果程序中没有使用NAME伪操作,则也可使用TITLE,其格式为: TITLE text
例4.2 .MODEL SMALL .STACK 100h .DATA 例4.3 .MODEL SMALL .STACK 100h .CONST …… .DATA …… AX,@DATA DS,AX .CODE START: MOV AX,DGROUP
……
.CODE START: MOV MOV …… MOV INT END AX,4C00H 21H START
③ uninitialized data
汇编语言书写格式
汇编语言书写格式
汇编语言书写格式是非常重要的,它直接影响到程序的可读性和可维护性。
以下是一些关于汇编语言书写格式的建议:
1. 注释:在程序中添加注释可以帮助其他程序员理解代码的含义。
注释应该清晰明了,简洁明了,不要使用缩写或术语太过专业的词汇。
2. 缩进:使用缩进可以让代码更容易阅读。
每一层缩进应该有
一个标准的宽度,例如4个空格或一个制表符。
3. 标签:在程序中使用标签可以帮助程序员更好地组织代码。
标签应该具有描述性,并且应该指出其所在的程序段。
4. 标识符:变量、常量和程序标识符应该具有描述性,并且应
该使用下划线或驼峰式命名法。
5. 指令格式:汇编指令应该按照一定的格式书写。
指令的操作
码和操作数应该对齐,并且应该使用适当的间隔符。
6. 常量和变量:常量和变量应该在程序的开头定义,并且应该
按照类型和作用域进行分类。
7. 注释排版:注释应该写在代码下方,每个注释和代码之间应
该用一个空格隔开。
通过采用以上书写格式,可以使得汇编程序更加易于理解和维护。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言格式要求
本要求仅对TMS320C2XX,TMS320C5X系列有效。
无论运用MCS51、MCS96亦或DSP,所有的全程变量都在一起定义,不要分散在各个程序中;各个段都定义在一起,不要分散,并且要加注释注明段的各个部分用了多少变量及总共用了多少,以便之后增加变量时控制跨页。
在DSP中有页的概念,所以要注意变量是否越过边界,一个程序块尽量不要使变量超过128个,如果超过就要使用辅助寄存器作指针进行访问;注意一个程序块中使用的用名称定义的变量要定位在一个页内,否则需要在程序中要频繁更改页地址,容易出错而不易发现。
在未初始化的段(用.bss和.uset定义)中定义一个不大于128个变量的数组时应使块标志(blocking flag)有效(非0),这样编程方便。
对于零散的有名称的变量比较难处理,可以这样变通:定义一个数组,然后用.set指令定义地址如:_exam_array_num .set 40
_exam_free_num .set 10
_exblock .uset “forexa”, _exam_array_num+_exam_free_num,1
_exam_array .set _exblock+0; 定义在偶地址的数组。
_exam0 .set _exblock+_exam_array_num +0
_exam1 .set _exblock+_exam_array_num +1
_fast .set _exblock+_exam_array_num +2
.
.
.
_examend .set _exblock+_exam_array_num +9
这样就可以在一个程序段中使用一个页里的数据。
零碎部分放在后面,注意在增加或减少数据长度时要更改的部分只有_exam_free_num和_exam_array_num。
每一个中断应定义一个未初始化段,不共享数据的一些程序段或子程序也应各自定义未初始化段,还要为堆栈定义一个stack区。
会被不同中断调用的程序其变量一定要用堆栈。
所有的段名称都不要超过8个字符,因为COFF文件里只为段名称保留了8个字节。
会被C语言调用的函数和变量一定要在名称前加一下画线“_”。
不要直接使用立即数,要对立即数按照其意义进行定义,以便更改程序,如:SPM 3;不好的方法
应改为:
PREGSHIFTR6 .SET 3
SPM PREGSHIFTR6 ;
在DSP汇编中*和;都可以屏蔽其后的语句,但*必须放在本行的第一个字符才起作用并且“*”在汇编语句中有用,所以不要用“*”屏蔽语句,只用“;”。
用C编译器编译的程序用ar1作为堆栈指针(SP),为了兼容,在汇编中不要用ar1作其它用,也作为堆栈指针,程序开始也要为ar1赋初值。
为了与C保持兼容子程序和中断格式见文件CFUNCEXA.ASM。
编译器对源程序代码中标号(lable)后的“:”没有强制要求,但为了可读性和查找方便,一定要加“:”。
标号一定要有意义,只要不超过32个字符就可,但尽量短一些。
指令一律放在一个TAB后(一般一个TAB是8个字符,许多WINDOWS编辑器可以设置),指令与操作数之间只间隔一个空格,不要用TAB键;操作数与操作数之间只用“,”隔开,不要用TAB键或空格;每句的注释不要离语句太远,也不要太长,若需要长就用几行表达,方便阅读。
这些规定只针对程序不针对伪汇编语句。
伪汇编指令“.data”可以为RAM(未初始化数据)保留空间,也可以为初始化数据保留空间,建议不用。
因为DSPHEX认为“.data”是初始化数据,会有告警;更不要让“.data”既保留未初始化数据又定义初始化数据。
用“.sect”定义已初始化数据于程序空间,需要使用在数据空间的就将其复制在数据空间。
在汇编中,不要用“.gloal”,定义使用“.def”,引用使用“.ref”,容易检查变量的出处。
为了保证汇编程序可用于C语言(DSPCL无大小写无关参数),所有程序的字符都用小写,这样方便检查程序,容易发现重复定义的符号;同样C语言程序也一律用小写,利于混合编译发现问题。
如果使用DSP的片上Bootloader将单片ROM上的程序引导到RAM上去,就需要将COFF 格式的程序转变为HEX格式的文件,TI有一个DSPHEX程序可以作这种改变,可以做一个CMD文件如下例
在命令行中执行DSPHEX程序:DSPHEX COFFTOHEX.CMD即可。
附录A:
HEX文件格式:
HEX文件是一个标准的ASCII文本文件,可以用普通的编辑软件编辑(但不能用DEBUG,因为DEBUG对HEX文件有特殊处理,可以将其HEX后缀改为ASM,然后用DEBUG)。
每一行的开头有一个“:”然后紧跟字符,每两个字符为一个8位16进制数(称为字节),第一个字节为本行程序代码按字节算的个数(长度字节),第二个、第三个组成一个32位的字,指示本行程序的地址(第二个是高字节,第三个是低字节);然后是标志字节,标志字节指示本行的意义,含义如下:
00 数据
01 文件结束
04 扩展线性地址
标志字节后是数据,个数是长度字节定义的。
数据后是校验码,校验码是长度字节、地址两个自节、标志字节及数据,它们的字节和(保留低字节)的补码(用100H减去字节和)。
每行结束用0D0A(回车、换行),它们在编辑软件中是不可见的。
INTEL的HEX文件如果为MCX-86程序,需要段地址,这需要单独一行,标志字节为04,参见例子的第一行(无段地址时不需要这一行)。
:02000004FFEEE0 指示段地址
:10050000903800F0903C00F0904000F0906000F0D7 0500H启始的16个数据:10051000908000F090A000F012052D12052D12051C 0510H启始的16个数据:100520002D12052DE54904F549B40A94227547E0DA 0520H启始的16个数据:100530007548F000D548FCD547F62290E000F54616 0530H启始的16个数据:100540007400F0E5460022BF86DBCFE6EDFD87FFB5 0540H启始的16个数据:10055000EFF7FCB9DEF9F1803F065B4F666D7D0772 0550H启始的16个数据:090560007F6F777C395E79710030 0560H启始的9个数据
:00000001FF 文件结束行
附录B:
将程序从数据区的ROM拷贝到程序区的RAM的程序例子(见SPRU018D.PDF文件8-35页)。
附录C:
在汇编中定义变量在C中应用的方法1.单个变量
2.数组。