第4章 伪指令与源程序格式

合集下载

单片机指令系统习题

单片机指令系统习题

单⽚机指令系统习题第四章汇编语⾔程序设计第⼀节汇编语⾔源程序的格式和伪指令(⼀)学习要求1、掌握汇编语⾔源程序格式和伪指令。

2、掌握各种伪指令功能。

(⼆)内容提要⼀:汇编语⾔源程序的格式1、语句格式汇编语⾔源程序是由汇编语句(即指令)组成的。

汇编语⾔⼀般由四部分组成。

其典型的汇编语句格式如下:标号:操作码操作数;注释START:MOV A,30H ;A←(30H)(1) 标号段标号是⽤户定义的符号地址。

(2) 操作码段操作码段是每⼀语句中不可缺少的部分,也是语句的核⼼部分,⽤于指⽰计算机进⾏何种操作,汇编程序就是根据这⼀字段⽣成⽬标代码的。

(3) 操作数段指出了参与操作的数据或存放该数据的地址。

通常有⽬的操作数和源操作数之分。

(4) 注释段为了增强程序的可读性,可在某⾏指令的后⾯⽤分号起头,加上注释,⽤以说明该条指令或该段程序的功能、作⽤,以供编程⼈员参考。

此注释内容程序汇编时CPU 不予处理,不产⽣⽬标代码。

⼆:伪指令1、定位伪指令ORG(Origin)格式:[标号:] ORG mm:16位⼆进制数,代表地址。

功能:指出汇编语⾔程序通过编译,得到的机器语⾔程序的起始地址。

2、定义字节伪指令DB(Define Byte)格式:[标号:] DB X1,X2,~XnXn:单字节⼆进制、⼗进制、⼗六进制数,或以… ?括起来的字符串,数据符号。

功能:定义程序存储器从标号开始的连续单元,⽤来存放常数、字符和表格。

3、定义字伪指令DW(Define Word)格式:[标号:] DW Y1,Y2,~YnYn:双字节⼆进制、⼗进制、⼗六进制数,或以… ?括起来的字符串,数据符号。

功能:同DB,不同的是为16位数据。

4、汇编结束命令END格式:[标号:] END功能:END是汇编语⾔源程序的汇编结束标志,在它后⾯所写的指令均不予处理。

5、等值命令EQU格式:字符名称EQU 数或汇编符号功能:将⼀个数或特定的汇编符号赋予规定的字符名称。

汇编语言设计实践:第4部分 基本汇编语言

汇编语言设计实践:第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
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。

第4章 指令系统(三)

第4章 指令系统(三)
在程序的开始可以用NAME或TITLE为模块取名字,NAME的格式是:
NANEmodule_name
汇编程序将已给出的module_name作为模块的名字。如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为:
TITLEtext
TITLE伪操作可指定每一页上打印的标题。同时,如果程序中没有使用NAME伪操作,则汇编程序将用text中的前六个字符作为模块名。Text最多可有60个字符。如果程序中既无NAME又无TITLE伪操作,则将用源文件名作为模块名。所以NAME及TITLE伪操作并不是必要的,但一般经常使用TITLE,以便在列表文件中能打印出标题来。
表示源程序结束的伪操作的格式为:
END[label]
其中标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号。例4.4.8给出求两数之和的绝对值的程序实现,其中用TITLE给出标题,用END START表示程序结束。汇编程序将在遇END时结束汇编,而程序则将从START开始执行。
(4)DQ伪操作用来定义字,其后的每个操作数占有四个字。
(5)DT伪操作用定义十个字节,其后的每个操作数占有十个字节,形成压缩的BCD码。
操作数(operand)字段可为:1)数值表达式;2)ASCII字符串;3)地址表达式;4)?;5)操作数字段还可以使用复制操作符(duplication operator)来复制某个(或某些)操作数。其格式为:
(2)数值回送(Value_retuning)操作符
它有TYPE、LENGTH、SIZE、SEG五种。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。
1) TYPE

第4章 伪指令及汇编语言源程序

第4章   伪指令及汇编语言源程序
2019/4/12 9
第 4章
符号定义伪指令
2、 等号伪指令 = = 伪指令的格式与功能和 EQU 类似。不同的是, 在同一个程序中 = 可以对一个符号重复定义, EQU不能对同一个符号重复定义。 Y1=7 Y1=128 的定义是正确的。 而 Y1 EQU 7 Y1 EQU 128 的定义是错误的。
2019/4/12
24
第 4章
组合类型
组合类型规定本段与其他段的关系,有 4 种方式(默 认方式为NONE): NONE:连接时,表示本段与其他段在逻辑上没有 关系。 PUBLIC:连接时,本段将与其他同名、同类别的段 相邻地连接在一起,形成一个物理段,段的长度为 各PUBLIC段长度之和。 COMMON:连接时,本段将与其他同名、同类别 的段相覆盖,形成一个物理段,段的长度为最长的 COMMON段的长度。 STACK:表示此段为堆栈段,连接方式与PUBLIC 段相同。
2019/4/12
偏移地址低字节
偏移地址高字节
偏移地址低字节 偏移地址高字节
段地址低字节
段地址高字节
图4.2
15
第 4章
操作数是字符串
操作数为字符串时,内存中存放的是各字符的ASCII码。 例4-5 下面3个定义语句是等价的。 STR1 DB ‘ABCD’ STR1 DB ‘A’, ‘B’, ‘C’, ‘D’ STR1 DB 41H,42H,43H,44H 例4-6 下面2个定义语句是等价的 STR2 DB ‘AB’ STR2 DW ‘BA’ 当定义的字符串中字符多于2个时,只能使用DB定义,不 能使用DW。 STR3 DW ‘ABCD’ 是错误的定义方式。
2019/4/12
5
第 4章
操作码与操作数

汇编 第四章伪指令及汇编语言源程序结构

汇编 第四章伪指令及汇编语言源程序结构

MOV AL, BUF1
ADD AL, BUF2 MOV SUM, AL
;取第一个加数
;两数加 ;和放入SUM单元
3
伪指令(指 示性)语句: 提供相关辅 助信息。
指令性语句: 完成一定功 能,能翻译 成机器码。
伪指令语句
DATA SEGMENT ;DATA段定义开始 BUF1 DB 34H BUF2 DB 27H SUM DB ? DATA ENDS ;DATA段定义结束 CODE SEGMENT ;CODE段定义开始 ASSUME CS:CODE ASSUME DS:DATA ;段性质规定 START: MOV AX,DATA MOV DS,AX ;给DS赋值 MOV AL, BUF1 ;取第一个加数 ADD AL, BUF2 ;两数加 MOV SUM, AL ;和放入SUM单元 MOV AH,4CH INT 21H ;返回DOS CODE ENDS ;CODE段定义结束 END START ;源程序结束
14
二、= 等号伪指令
格式:符号名 = 表达式 功能:为常量、表达式及其他各种符号定义一个等价的符号 名,并能对所定义的符号多次重复定义,且以最后一次定义 的值为准。 例:COST = 20 M = MOV LOST = COST+10 ;30→LOST M = ADD ;M=ADD 注 : “ = ” 伪 指 令 的 格 式 和 功 能 与 EQU 类 似 。 二者区别:在同一程序中,“=”可以对一个符号重 复定义,EQU不能对同一符号重复定义。
26
三、变量、标号的分析运算和合成运算
例:DATA SEGMENT A DB ‘ABCDEF’ B DW 10 DUP(1,2DUP(2)) C DB 3,20 DUP(0) DATA ENDS ┆ MOV AX,LENGTH A ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX ┆

第四章 汇编语言程序格式

第四章 汇编语言程序格式

.model small .data …… .code start: mov ax, @data mov ds, ax …… mov ax, 4c00h int 21h end start
9
段组定义伪操作
dseg1 dseg1 dseg2 dseg2 segment …… ends segment …… ends word public ‘data’
DATA_BYTE DATA_WORD
DB DW
10,4,10H,? 100,100H,-5,?
14
ARRAY
DB DB DW
‘HELLO’ ‘AB’ ‘AB’
ARRAY
48H 45H 4CH
4CH
4FH 41H 42H 42H 41H
PAR1 PAR2 ADDR_TABLE
DW DW DW
100,200 300,400 PAR1,PAR2
.STARTUP .EXIT [ return_value ]
13
数据定义及存储器分配伪操作:
[变量] 助记符 操作数 [ , 操作数 , … ] [ ; 注释] 助记符:DB DW DD DF DQ DT
DATA_BYTE 0AH 04H
10H
DATA_WORD 64H 00H 00H 01H FBH FFH -
12 ; (bx)=0 ; (bx)=2 ; (bx)=2
?
datagroup group data1,data2
code segment assume cs:code, ds:datagroup
; (bx)=0
程序开始和结束伪操作:
TITLE text
NAME module_name

ch4-1汇编语言程序设计(伪指令)

ch4-1汇编语言程序设计(伪指令)
什么是伪指令?
由汇编程序执行的“指令系统” 用于定义变量、分配存储区、定义逻辑段、
指示程序开始和结束等 在汇编时被解释执行,不产生任何目标代码
常用伪指令分类
数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 宏命令伪指令 结束伪指令
第四章 汇编语言程序设计
第四章 汇编语言程序设计
data SEGMENT
名字 Hello DB ‘Hello, world!’,0DH,0AH,’$’
data ENDS prog SEGMENT
伪指令
ASSUME CS:prog ,DS:data
start: MOV AX,data
MOV DS,AX
标号
LEA DX,hello
MOV AH,9
INT 21H 指令码 MOV AH,4CH
NUM:ADD AL,30H
RET
第四章 汇编语言程序设计
2.汇编语言与高级语言
• 汇编语言是一种依赖于计算机微处理器的语言 • 汇编语言一般不具有通用性和可移植性 • 进行汇编语言程序设计必须熟悉机器的硬件资
源和软件资源 • 高级语言是面向过程的语言 • 高级语言具有很好的通用性和可移植性
第四章 汇编语言程序设计
INT 21H
prog ENDS
操作数
END start
(4)操作数
常量 变量或标号 表达式 寄存器 存储器单元
第四章 汇编语言程序设计
第四章 汇编语言程序设计
表达式: 算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出
注意:
名字和标号: 标号后有冒号,在指令性语句前;名字后不加

第四章 伪指令及程序设计

第四章 伪指令及程序设计
7 2018/11/13 ASSUME CS:段名,DS:段名,SS:段名,ES:段名
assume指定段与段寄存器之间的关系,但并不为段寄存 器设定初值,程序中如果使用数据段或者附加段,需要明确 对DS、ES赋值。只要正确书写源程序,CS、IP和SS、 SP的值将会由连接程序正确设置 设置方法: MOV AX,STACK MOV SS,AX
2018/11/13
6
汇编程序的基本结构要求
完整的汇编程序要包括:段定义、段分配、设置段地址、返 回DOS语句、程序结束 和程序体。必要时加上过程调用。 完整汇编语言程序的典型格式 1. 段定义格式: 段名 …… SEGMENT
段名
ENDS
至少有一个代码段,堆栈段如果不定义,由计算机自动分配。 段名是由字母数字组成的,可以任意定义。 计算机识别不同的段靠 段分配ASSUME 语句完成
2018/11/13 20 Nhomakorabea PTR例 MUL BYTE PTR[BX] JMP JMP JMP
;限定存储器操作数的类型
WORD PTR[BX] ;段内转移 DWORD PTR[BX] ;段间转移 CS:IP FAR PTR LO ;段间转移
2018/11/13
21
THIS: 格式:变量/标号 EQU THIS 类型/距离 功能:该变量或标号的段地址和偏移地址与下一个存储 单元的地址相同,并具有THIS后的属性 Eg4-45:FIRST EQU THIS BYTE TABLE DW 200DUP(?) EG4-46 :SP1 EQU THIS FAR MOV AX,100
2018/11/13 23
4-3 8086宏汇编语言常用伪指令
11

第四章 伪指令

第四章  伪指令

数据定义伪指令的格式为: [变量名] 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个字节单元。

伪指令

伪指令

方括号中为可选项,规定了逻辑段的一些其他特性
例:
DATA1 A DATA1 DATA2 DATA2 DATA3 C DATA3
DB
DB
DB
SEGMENT 1,2,3 ENDS SEGMENT 200 DUP(0) ENDS SEGMENT ?,?,? ENDS
STACK
CODE
SEGMENT
ASSUME DS:DATA1,ES:DATA3 CS:CODE,SS:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA3 MOV ES,AX ┆ Q1: MOV AL,A Q2: MOV C,AL
A C8H
STR1 ‘H’
SUM
- -
‘I’
20H ‘O’ ‘K’ ‘!’
TABLE
3 3 3 7 3
0DH
0AH
‘$’ DATA1 0 0 0 0
3
3 7
……
为 0, 1,
10, 14
2. 段定义伪指令
因8086/8088 CPU的存储器是分段的,这就需要有段 定义语句。 与段有关的伪指令主要有: SEGMENT、ENDS、ASSUME 段定义伪指令的格式如下: 段名 SEGMENT [定位类型] [组合类型] [’类别’] ┇ 段名 ENDS
在前缀开始处安排了一条 INT 20H, 在过程结束时通过RET返回DOS。
AX,DATA DS,AX ;DATA → DS ES,AX ;DATA → ES ┇ ;具体程序 RET ;返回指令 MAIN ENDP ;过程结束 CODE ENDS ;代码段结束 END START ;源程序结束
MOV MOV MOV
字节变量的应用 X

指令语句和伪指令语句的格式-详细解释说明

指令语句和伪指令语句的格式-详细解释说明

指令语句和伪指令语句的格式-范文模板及概述示例1:标题:指令语句与伪指令语句的格式解析及其在编程中的应用指令语句和伪指令语句是程序设计语言中两种关键的构成元素,它们在编程过程中发挥着不同的作用,并具有特定的格式规范。

一、指令语句指令语句,也称机器指令,是计算机硬件可以直接执行的命令。

其格式通常包括操作码(opcode)和操作数(operand)。

操作码代表要执行的操作类型,如加法、减法、移动等;操作数则是该操作的对象,可以是寄存器、内存地址或立即数。

例如,在x86汇编语言中,"ADD AX, BX"是一个指令语句,其中"ADD"是操作码,指示进行加法操作,"AX"和"BX"是操作数。

二、伪指令语句相比之下,伪指令语句并非由计算机硬件直接执行,而是由汇编程序在汇编阶段处理并转化为实际的机器指令。

伪指令主要用于定义数据、分配存储空间、设置程序流程控制以及提供程序说明等。

例如,在汇编语言中,".DATA"、".WORD"、"EQU"、"ORG"等都是常见的伪指令。

".DATA"用于定义数据段,".WORD"用于分配指定大小的存储空间,"EQU"用于定义符号常量,"ORG"则用于设定程序的起始地址。

具体而言,一个伪指令语句的格式可能如下所示:assemblyLABEL EQU 100 ; 定义符号常量LABEL为100在这个例子中,“LABEL”是符号名,“EQU”是伪指令关键字,而“100”则是赋给该符号的值。

总结来说,指令语句和伪指令语句虽然都属于编程语句,但前者直接影响程序的运行过程,后者则主要参与程序的构建和组织,对源代码进行预处理,共同构建出可被计算机理解和执行的程序结构。

汇编语言程序格式、伪指令

汇编语言程序格式、伪指令
微机与接口技术
第4章 汇编语言程序设计
主要内容:
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
1
微机与接口技术
4.1 汇编语言源程序
1.机器语言(Machine Language)
用二进制表示指令和数据。 优点:执行速度快,占有内存少。 缺点:不直观,不易编写、阅读和理解,面向硬件,不 能移植。
MASM
汇编程序
PRODR.OBJ 文件
Link
连接程序
PRODR.EXE 文件
汇编语言程序的建立及汇编过程
4
微机与接口技术
上机过程: 1.调用编辑程序(例如:记事本)建立源文件。 以×××.asm命名文件。 2.用汇编程序masm(或asm)对源文件汇编产生目标文件 ×××.obj。 如果汇编出错则需重新调用编辑程序修改错误,直至汇编 通过为止。
2.汇编语言(Assembly Language)
用助记符书写指令,地址和数据也可用符号表示。 优点:编写、阅读和修改较方便,不易出错,执行速度与机 器语言相近。 缺点:面向硬件,不能移植。
2
微机与接口技术 汇编:把汇编语言源程序翻译成机器语言目标程序的过程。 汇编程序:完成汇编工作的系统软件。 •小汇编(ASM):需要64K内存支持 •宏汇编(MASM):需要96K以上的内存支持,功能更强。 汇编程序的主要功能: 1)检测源程序。 2)测出源程序中的语法错误,并给出出错信息。 3)产生源程序的目标程序,并给出列表文件。 4)展开宏指令。
24
微机与接口技术
(2) 逻辑运算符 AND、OR、XOR、NOT:只用于数值表达式 注:逻辑运算符和逻辑指令的区别:前者在汇编时 进行,后者在程序执行时由CPU执行 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。

第4章 伪指令与源程序格式汇总

第4章  伪指令与源程序格式汇总

第4章伪指令与源程序格式汇编语言程序的语句有三种,即指令、伪指令,还可以有宏指令。

关于宏指令将在第7章介绍,本章介绍部分常用的伪指令(又称伪操作)。

这些伪指令在程序中是必不可少的,主要用来定义数据变量和程序结构。

本章还介绍指令中的操作数和运算符,通过本章的学习,可以学会使用简便而有效率的指令格式,正确定义数据变量,熟知源程序的格式,编写完整的汇编语言程序。

4.1 伪指令伪指令和指令不同的是,指令是在程序运行期间由计算机的CPU来执行的,而伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作。

它们可以完成如定义数据、定义程序模式、分配存储区、指示程序结束、处理器选择等功能。

这里只介绍一些常用的伪指令。

有些和宏汇编有关的伪指令在介绍宏汇编时再作说明。

4.1.1 处理机选择伪指令由于80x86的所有处理器都支持8086指令系统,但每一种高档的机型又都增加了一些新的指令。

为了能使用这些新增指令,在编写程序时要用处理机选择伪指令对所用的处理机作出选择,也就是说,要告诉汇编程序应该选择哪一种指令系统。

处理机选择伪指令有以下几种:.8086 选择8086指令系统.286 选择8O286指令系统.286P 选择保护方式下的80286指令系统.386 选择80386指令系统.386P 选择保护方式下的8O386指令系统.486 选择80486指令系统.486P 选择保护方式下的8O486指令系统.586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统指令中的点‘.’是需要的。

这类伪指令一般放在整个程序的最前面。

如不给出,则汇编程序认为其默认选择是8086指令系统。

4.1.2 段定义伪指令我们结合第2章已介绍的程序实例2来看段定义,注意有分号的注释行,程序如下:例4.1data segment ;定义数据段datastring db ‘hello,world!$’data endscode segment ;定义代码段codeassume cs:code,ds:data ;指定段寄存器和段的关系start:mov ax,data ;对ds赋data段基地址mov ds,axmov dx,offset stringmov ah,9int 21hmov ah,4chint 21hcode endsend start ;汇编结束, 程序起始点start:1.段定义伪指令汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,连接程序对针目标程序把不同的段和模块连接在一起,确定各个段的段地址。

第4章 伪指令及汇编语言源程序结构

第4章 伪指令及汇编语言源程序结构

(3) 关系操作符: EQ、NE、LT、LE、GT、GE 计算结果为逻辑值: 真 0FFFFH 假 0000H OPR1 OPR2 … EQU EQU 25 7 ;00011001B ;00000111B 等价指令: MOV AX, 0 等价指令: MOV AX,0FFFFH
;OPR1和OPR2为符号常数
4.掌握段定义及程序分段。
本章重点: 数据定义伪指令、段定义
计划学时: 2--3学时
第2页 第2页
汇编语言程序设计
第4章伪指令及汇编语言源程序结构
4.1 语句类型及格式
4.1.1 语句类型
指令(性)语句
语 句 类 型
完成一定操作功能,能够翻译成机器代码的语句
指示性语句(伪指令语句) 为汇编程序在翻译汇编语言源程序时提供有关信 息,并不翻译成机器代码
第4页 第4页
汇编语言程序设计
第4章伪指令及汇编语言源程序结构
操作码用于指明操作的性质或功能。 书写规则:操作码与操作数之间用空性语句:
格式:[名字:] 操作码 [操作数[,操作数]] [;注释] 伪指令语句: 格式:[名字] 伪操作 [操作数[,操作数,…]] [;注释] 含义:由用户按一定规则定义的标识符 名字定义满足的规则
;取ARRAY数组个数送CX
; 符号地址常数 有意义 ; 时意义不明确 ; 错误用法 ; 正确用法
第7页 第7页
汇编语言程序设计
第4章伪指令及汇编语言源程序结构
(2) 逻辑和移位运算符: AND、OR、XOR、NOT、SHL、SHR
OPR1 OPR2
指令
EQU EQU
25 7
;00011001B ;00000111B
MOV AX, OPR1 EQ OPR2 MOV AX, OPR1 GT OPR2

格式和伪指令课件

格式和伪指令课件
➢每条指令都有对应的机器码,不同的CPU使用不同的 汇编语言 。
l用汇编语言编程的优点
➢汇编程序运行速度快,实时性好, 占用内存空间小,能 最大限度地发挥硬件的作用 。
l汇编语言的适用场合 ➢绝大部分系统软件都用汇编语言编写,大多数涉及快速
处理 、位处理和访问硬件设备的高效程序都是汇编程 序。如:实时数据处理程序 、实时控制程序 、高级绘 图程序 、游戏程序等 。
3) 操作数
u 1条指令可包含1个或2个操作数,也可没有操作数。 u 操作数的组成: ➢常数 二进制数,加B ;
10进制数,可加D或省略; 16进制数,加H,A~F前要加0; 2-10进制BCD数,加H,要用调整指令 ➢字符或字符串 用单引号‘ ’ 括起来
➢变量 程序运行期间可修改,数值可由DB、DW、DD等来定
PAGE(页) *NONE
‘STACK’
* PARA( 节 ) PUBLIC ‘ CODE’
WORD(字) STACK
BYTE(字节) COMMON AT
MEMORY
┇ 段名 ENDS
;段中内容
u加“[ ]”项可省略,但堆栈段的组合类型是STACK,不可省 略。
u省略项不写时,其值用带“*”的项,它们是隐含用法,用的 是默认值 。
CALL 过程名
4.变量定义语句
u变量定义语句的一般形式为:
变量名 伪指令指示符 操作数 ;注释
➢变量名用符号表示,也可以省略 。 ➢伪指令包括DB、DW、DD、DQ和DT,分别定义字
节 、字 、双字 、4字和10字节变量 。 ➢操作数可以有具体的字节 、字和双字等初值,也可以
不指定具体数值,而用一个问号“?”来表示,此时仅 为变量留出存储单元 。

第4章《单片机原理与C51基础》赵丽清(课后习题及答案)

第4章《单片机原理与C51基础》赵丽清(课后习题及答案)

第4章《单片机原理与C51基础》赵丽清(课后习题及答案)思考题:【4-1】说明伪指令的作用。

“伪”的含义是什么?常用伪指令有哪些,其功能如何?【4-2】解释下列术语:(1)手工编订(2)机器编订【4-3】下列程序段经汇编后,从1000h开始的各有关存储单元的内容是什么?org1000htab1equ1234htab2equ3000hdb0,1,4,5dwtab1,tab2,70h【4-4】设计子程序时应特别注意哪些问题?【4-5】试编写一个程序,将内部ram中45h单元的高4位清0,低4位置1。

【4-6】未知程序执行前存有a=02h,sp=42h,(41h)=ffh,(42h)=ffh。

下列程序执行后,a=();sp=();(41h)=();(42h)=();pc=()。

popdphpopdplmovdptr,#3000hrlamovb,amovca,@a+dptrpushaccmova,bincamovca,@a+dptrpushaccretorg3000hdb10h,80h,30h,80h,50h,80h【4-7】先行编写程序,搜寻在内部ram的30h~50h单元中与否存有0aah这一数据。

若存有,则将51h单元用为“01h”;若未找到,则将51h单元用为“00h”。

【4-8】试编写程序,查找在内部ram的20h~40h单元中出现“00h”这一数据的次数,并将查找到的结果存入41h单元。

【4-9】在内部ram的21h单元已经开始存一组单字节并无符号数,数据长度为20h,编写程序,建议找到最大数取走max单元。

【4-10】若sp=60h,标号label所在的地址为3456h。

lcall指令的地址为2000h,执行如下指令:2000hlcalllabel后,堆栈指针sp和堆栈内容发生了什么变化?pc的值等于什么?如果将指令lcall 直接换成acall是否可以?如果换成acall指令,可调用的地址范围是什么?【4-11】若80c51的晶振频率为6mhz,试计算延时子程序的延时时间?delay:movr7,#0f6;1个机器周期lp:movr6,#0fa;1个机器周期djnzr6,$;2个机器周期djnzr7,lp;2个机器周期ret;2个机器周期【4-12】撰写子程序,将r1中的2个十六进制数切换为ascii后取走r3和r4。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4章伪指令与源程序格式汇编语言程序的语句有三种,即指令、伪指令,还可以有宏指令。

关于宏指令将在第7章介绍,本章介绍部分常用的伪指令(又称伪操作)。

这些伪指令在程序中是必不可少的,主要用来定义数据变量和程序结构。

本章还介绍指令中的操作数和运算符,通过本章的学习,可以学会使用简便而有效率的指令格式,正确定义数据变量,熟知源程序的格式,编写完整的汇编语言程序。

4.1 伪指令伪指令和指令不同的是,指令是在程序运行期间由计算机的CPU来执行的,而伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作。

它们可以完成如定义数据、定义程序模式、分配存储区、指示程序结束、处理器选择等功能。

这里只介绍一些常用的伪指令。

有些和宏汇编有关的伪指令在介绍宏汇编时再作说明。

4.1.1 处理机选择伪指令由于80x86的所有处理器都支持8086指令系统,但每一种高档的机型又都增加了一些新的指令。

为了能使用这些新增指令,在编写程序时要用处理机选择伪指令对所用的处理机作出选择,也就是说,要告诉汇编程序应该选择哪一种指令系统。

处理机选择伪指令有以下几种:.8086 选择8086指令系统.286 选择8O286指令系统.286P 选择保护方式下的80286指令系统.386 选择80386指令系统.386P 选择保护方式下的8O386指令系统.486 选择80486指令系统.486P 选择保护方式下的8O486指令系统.586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统指令中的点‘.’是需要的。

这类伪指令一般放在整个程序的最前面。

如不给出,则汇编程序认为其默认选择是8086指令系统。

4.1.2 段定义伪指令我们结合第2章已介绍的程序实例2来看段定义,注意有分号的注释行,程序如下:例4.1data segment ;定义数据段datastring db ‘hello,world!$’data endscode segment ;定义代码段codeassume cs:code,ds:data ;指定段寄存器和段的关系start:mov ax,data ;对ds赋data段基地址mov ds,axmov dx,offset stringmov ah,9int 21hmov ah,4chint 21hcode endsend start ;汇编结束, 程序起始点start:1.段定义伪指令汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,连接程序对针目标程序把不同的段和模块连接在一起,确定各个段的段地址。

段地址确定了,其中的指令、标号和变量的段地址也就确定了,这样就形成一个可执行程序。

为此,需要段定义伪指令。

段定义伪指令格式:segment_name SEGMENT…segment_name ENDS其中segment_name由用户确定,大写的为关键字。

段定义伪指令两句成对出现,两句之间为其它指令。

为了确定用户定义的段和哪个段寄存器的关系,用ASSUME伪指令来实现。

ASSUME伪指令格式:ASSUME register_name:segment_name …,register_name:segment_name其中register_name为段寄存器名,必须是CS,DS,ES和SS。

而segment_name则必须是由段定义伪指令定义的段中的段名。

ASSUME伪指令只是指定把某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中。

为此,还需要用两条MOV 指令完成这一操作。

但是,代码段不需要这样做,代码段的这一操作是在程序初始化时完成的。

一般情况下,使用上述的段定义伪指令就可以了,如果需要对段定义作进一步地控制,SEGMENT伪指令还可以增加类型及属性的说明,其格式如下:segment_name SEGMENT [定位类型][组合类型][ 使用类型][“类别”]…segment_name ENDS如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明,具体内容安排在第6章有关子程序的多模块设计中介绍。

2.简化的段定义伪指令MASM5.0以上版本还支持一种简化的段定义方法,把例4.1程序用简化的段定义方法可以改写如下:例4.2.model small ;定义存储模型为small.data ;定义数据段datastring db ‘hello,world!$’.code ;定义代码段codestart:mov ax,@data ;对ds赋data段基地址mov ds,axmov dx,offset stringmov ah,9int 21hmov ah,4chint 21hend start首先用.MODEL伪指令说明在内存中如何安排各个段,存储模型为SMALL的意思是:所有数据都放在一个64KB的数据段,所有代码都放在另一个64KB的代码段,数据和代码都为近访问。

这是最常用的一种模型。

.DATA伪指令用来定义数据段,但没有给出段名,默认段名是_DATA。

@DATA表示段名_DATA,在指令中表示段地址。

简化段定义的表达能力不如SEGMENT伪指令那样完整而清楚,所以很多时候还是用SEGMENT伪指令。

有关简化段定义的更多说明在第6章有关子程序的多模块设计中介绍。

4.1.3 程序开始和结束伪指令在前面例子中,都没有使用表示程序开始的伪指令。

用户根据需要可以在程序的开始用NAME或TITLE伪指令定义该程序模块名。

NAME的格式为:NAME module_name其中module_name 为模块的名字。

如果程序中没有使用NAME伪指令,也可使用TITLE 伪指令来指定模块名,其格式为:TITLE text其中text中的前六个字符被汇编程序作为模块的名字。

TITLE伪指令的另一个作用是在列表文件的每一页上打印标题。

标题text最多可有6 0个字符。

如果程序中既无NAME又无TITLE伪指令,则用源文件名作为模块名。

所以NAME及TITLE 伪指令不是必要的。

表示源程序结束的伪操作的格式为:END [label]汇编程序将在遇到END时结束汇编。

其中标号label指示程序开始执行的起始地址。

如果是多个程序模块相连接,则只有主程序需要使用标号,其他子程序模块则只用END而不能指定标号。

4.1.4 数据定义与存储器单元分配伪指令我们知道,指令语句的一般格式是:[标号:] 操作码操作数 [;注释]这一类伪指令的格式是:[变量] 操作码 N个操作数 [;注释]其中变量字段是可有可无的,它用符号地址表示。

其作用与指令语句前的标号相同。

但它的后面不跟冒号。

操作码字段说明所用伪操作的助记符,即伪操作,说明所定义的数据类型。

常用的有以下几种:DB 伪操作用来定义字节,其后的每个操作数都占有一个字节(8位)。

DW 伪操作用来定义字,其后的每个操作数占有一个字(16位,其低位字节在第一个字节地址中,高位字节在第二个字节地址中,即数据低位在低地址,数据高位在高地址)。

DD 伪操作用来定义双字,其后的每个操作数占有两个字(32位)。

DF 伪操作用来定义6个字节的字,其后的每个操作数占有48位。

DQ 伪操作用来定义4个字,其后的每个操作数占有4个字(64位),可用来存放双精度浮点数。

DT 伪操作用来定义1O个字节,其后的每个操作数占有1O个字节,为压缩的BCD码。

(需要说明的是,MASM6允许DB,DW,DD,DF,DQ,DT伪操作分别用BYTE,WORD,DWORD,FWORD,QWORD,TBYTE代替)。

这些伪操作可以把其后跟着的数据存人指定的存储单元,形成初始化数据;或者只分配存储空间而并不确定数值。

下面举例说明各种用法。

例4.3 操作数为常数、数据表达式。

D_BYTE DB 10,5,10HD_WORD DW 14,100H,-5,0ABCDHD_DWORD DD 4×8程序中默认的数据为十进制数,10H为十六进制数,用DB定义的数据的值不能超出一个字节所能表示的范围。

数据10的符号地址是D_BYTE,数据5的符号地址是D_BYTE+1。

数据可以是负数,均为补码形式存放。

允许数据表达式,如4×8,等价为32。

当数据第一位不是数字,应在前面加0,如0ABCDH。

数据在内存中的存放如图4.1所示。

D_BYTE D_WORD D_DWORD图4.1例4.3的汇编结果例4.4 操作数为字符串。

问号‘?’仅预留空间。

数据在内存中的存放如图4.2所示。

MESSAGE DB 'HELLO',?DB ‘ABCD’MESSAGE图4.2 例4.4的汇编结果例4.5 用操作符复制操作数。

数据在内存中的存放如图4.3所示。

ARRAY DB 2 DUP(1,3,2 DUP(4,5))ARRAY图4.3 例4.5的汇编结果例4.6 指令中使用隐含类型属性。

OPER1 DB ?, ?OPER2 DW ?, ?┇MOV OPER1, 0MOV OPER2, 0MOV OPER2, AX第一条指令将使OPER1字节单元清零,第二条指令将使OPER2字单元清零,因为OPER2为字类型变量,第三条指令两个操作数类型一致,无需说明。

例4.7 在指令中使用类型属性操作符指定操作数类型。

OPER1 DB 3, 4OPER2 DW 5678H, 9┇MOV AX,OPER1MOV BL, OPER2MOV [BX], 0前两条指令操作数类型不匹配,第三条指令的目标操作数类型不明确,所以都是错误的。

解决的办法是可在指令中对操作数类型作临时性指定,以使操作数类型匹配和明确。

这三条指令可改为:MOV AX,WORD PTR OPER1MOV BL, BYTE PTR OPER2MOV BYTE PTR[BX], 0使用类型属性操作符WORD PTR,BYTE PTR 可对操作数类型进行重新指定。

指令执行结果:AX=0403H,BL=78H。

实际上一个变量也可以定义成不同类型,以方便使用。

这可以用LABEL伪操作来定义,格式为:name LABEL type例4.8 把变量定义成不同类型,指令中可灵活选用。

指令执行结果如图4.4所示。

OPR_B LABEL BYTEOPR_W DW 4 DUP(0)┇MOV AX, 1234HMOV OPR_B, ALMOV OPR_W+2, AXOPR_BOPR_W图4.4 (1) 例4.8的数据定义OPR_BOPR_W图4.4 (2) 例4.8的指令执行结果OPR_B LABEL BYTE伪操作使得OPR_B和OPR_W指向同一个内存单元。

相关文档
最新文档