第四章汇编语言
第四章 汇编语言程序设计
![第四章 汇编语言程序设计](https://img.taocdn.com/s3/m/6bfa7629af45b307e871979f.png)
有5个:SEG(求段基值)、OFFSET(求偏移
量)、TYPE(求变量类型)、LENGTH(求变量长 度)和SIZE(求字节数)。
例:
MOV BX, OFFSET DA1
修改属性运算符也经常称作综合运算符。
有6个:段操作符、PTR、THIS、HIGH、LOW、 SHORT。 例: MOV AX , ES:[BX]
一、 数据定义语助记符 助记符 操作数,操作数„;注释 n DUP(操作数,操作
功能:
将操作数存入变量名指定的存储单元中,或者 只分配存储空间不存入数据。
说
变量名
明
用符号表示,可以省略,后面不跟冒号“:”。 汇编程序汇编时将此变量的助记符后的第一各直接 的偏移地址作为它的符号地址。
说
助记符
明
DB: 用来定义字节,表示每个操作数占用一个字节。 DW: 用来定义字,表示每个操作数占用一个字。 DD:用来定义双字,表示每个操作数占用两个字。 DQ:用来定义四个字,表示每个操作数占用四个字。
DT:用来定义十个字节,表示每个操作数占用十个字
节。
说
操作数
明
操作数可以是常数,字符串,变量,标号,表达式 等,多个操作数之间用逗号格开。 注释 说明伪指令的功能,可以省略,注释前必须带分号“;” 注: 在格式2中,用n DUP( )表示 时,n必须是正整数,表示括号 中的操作数的重复次数。
例
例:操作数是常数或表达式 DA1 DA2 DA3 DB 10H, 52H ; 变量DA1中装入 10H,52H
DW 1012H, 34H ; 变量DA2中装入22H,11H, 34H,00H DD 5*20H, 0FFEEH; 变量DA3中装入A0H, 00H EEH, FFH
汇编语言 第四章
![汇编语言 第四章](https://img.taocdn.com/s3/m/1c09df86e53a580216fcfe19.png)
4.3 汇编语言程序格式
3.关系运算符 1) 运算符包括EQ、NE、LT、GT、LE、GE。 2)运算结果为一个数字值。关系成立结果为0FFFFH,结 果不成立结果为0。 例:MOV AX,1234H GT 1024H MOV BX,0LT0 相当于 MOV AX,0FFFFH MOV BX,0
2012-8-12 17
4.2 伪指令
六、过程定义伪指令 可以把具有独立功能的程序段定义为过程 (相当于高级语言中的子程序),供其它程序 调用。 过程定义的语法格式为: <过程名> PROC [NEAR]/FAR ┆ RET <过程名> ENDP
2012-8-12 18
4.3 汇编语言程序格式
语句的种类和格式 表达式的表示
2012-8-12 12
4.2 伪指令
7)定义其他类型数据项DQ,DT DQ定义8字节数据项 DT定义10字节数据项 2.重复操作符DUP 格式:count DUP (表达式[,表达式…]) 1)可以用来定义数组,定义数据缓冲区; 2)count是重复次数; 3)允许嵌套; 例:BUF DB 3 DUP(0);BUF DB 0,0,0 例:BUF1 DB 3,2,5 DUP(1,2,2 DUP(0))
2012-8-12
7
4.2 伪指令
3.SEGMENT伪操作可增加说明 格式:段名 SEGMENT [定位类型][组合类型][使用类 型][类别] …….. 段名 ENDS 1)当需要连接程序把本程序与其他程序模块连接时,需 要使用这些说明。 2)定位类型:说明段的起始地址应有怎样的边界值。 3)组合类型:说明程序连接时的段合并方法。 4)使用类型:说明是16位或32位寻址方式。 5)类别:在引号中给出连接时组成段组的类别。
汇编语言设计实践:第4部分 基本汇编语言
![汇编语言设计实践:第4部分 基本汇编语言](https://img.taocdn.com/s3/m/2d45808ddbef5ef7ba0d4a7302768e9951e76e84.png)
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
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。
汇编语言 第四章 汇编语言
![汇编语言 第四章 汇编语言](https://img.taocdn.com/s3/m/74bae4df84254b35eefd34c7.png)
4.1.4 特殊运算符
1.属性替换运算符
(3)短取代运算符SHORT 告诉汇编程序,目标标号在本条指令的 -128~+127 个字节的范 围内,生成节省一个字节的机器指令。一般情况下可以不用。 例如: JMP SHORT NEXTBRACH … NEXTBRACH: MOV EAX,ECX
4.1.4 特殊运算符
4.1.4 特殊运算符
1.属性替换运算符
(2)段地址取代运算符“:” 又称为段地址运算或者跨段前缀。用于临时给定变量,标号或 者地址表达式指定一个段属性,地址表达式EA和类型保持不变。在 指令中替代默认的段以形成物理地址。 例如: MOV DX,ES:[BX + DI];EA = BX +DI,PA =ES ;*16 + EA,临时替换默认的DS
4.1.4 特殊运算符
2.属性分离运算符
TYPE运算符 格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量,将返回该变 量的类型对应字节数;如果是标号,则返回代表标号类型的数值。 MOV CL,TYPE ARRAYW ;若变量ARRAYW为字类型,则CL=2
4.1.4 特殊运算符
(1)LENGTH运算符 功能:当变量由数据定义伪指令定义,并且表达式带有一个DUP项 时,LENGTH取DUP项前面的重复系数;如果表达式有多个DUP项 嵌套时,仍然取第一个DUP项前的数字,LENGTH变量的取值为1. DATA SEGMENT A DB ‘ABCDEF’ B DW 10 DUP(1,2DUP(2)) C DB 4,20 DUP(0) DATA ENDS ┆ MOV AX,LENGTH A ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX
第四章 汇编语言程序设计
![第四章 汇编语言程序设计](https://img.taocdn.com/s3/m/2fe378eef8c75fbfc77db2fa.png)
一、算术运算符
包括:+,-,*,/(取商),MOD(取余),SHL,SHR 特点:①运算对象及结果均为整数 ②地址只能加减 例: DA1 DA2 MOV MOV MOV MOV DB 1,2,3,4 DB 20 AX,30*5 汇编时 AL,31MOD5 AL,31/5 AL,DA2-DA1
MOV MOV MOV MOV
如:加法:1001、1D、2B……
特点:计算机能够直接识别,执行速度快;
但不方便记忆和编程
2、汇编语言(Assembly Language) 用助记符来表示指令,如:加法:ADD…… 特点:机器不能识别,需翻译;但仍然面向硬件, 执行速度较快;多用于编制系统程序、实时控制和通 信程序。 3、高级语言(High-level Language) 用数学语言和自然语言编程; 如:加法:+,输出:Printf… 特点:编程方便简单,无需了解机器硬件;但机器 不能识别,需要庞大的翻译系统,速度较慢。
类型 返回值 1 2 4 类型 返回值 -1 [FFH] -2 [FEH] DB DW DD
变量
标号
NEAR FAR
数值返回运算符(续)
LENGTH:
•对于一般变量,返回1; •对于DUP定义的变量,返回单元数(直接返回第一
个DUP前的N值); 说明:DUP为复制操作符,格式:N DUP(表达式); N表示复制次数,表达式为复制内容 例:2 DUP(1,2) 等价于 1,2,1,2
则:COUNT的值为5
COUNT表示:DA1,DA2占的字节总数(长度之和) 七、优先级(P136 表4-3)
4.3 伪指令语句
在汇编时进行处理,主要完成变量定义,段定义,
段分配,指示程序开始和结束等功能。
汇编 第四章伪指令及汇编语言源程序结构
![汇编 第四章伪指令及汇编语言源程序结构](https://img.taocdn.com/s3/m/3166970b763231126edb11ae.png)
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 ┆
第四章 汇编语言程序设计
![第四章 汇编语言程序设计](https://img.taocdn.com/s3/m/466d336e561252d380eb6e8c.png)
数据定义例( ) 数据定义例(1)
DABYTE DAWORD DB -5H DW 6*3
FBH 12H 00H 34H 12H 00H 00H
DABYTE DAWORD
DADWORD DD 1234H
DADWORD
15
数据定义例( ) 数据定义例(2)
STRING1 STRING2 STRING3 DB DW DD 'AB' 'AB' 'AB'
9
例:…… VAR1 DB 2 DUP(1,2 DUP(0)) …… MOV AX, SEG VAR1 MOV BX, OFFSET VAR1 MOV CL, TYPE VAR1 MOV DX, SIZE VAR1
;CL=1
MOV CH, LENGTH VAR1 ;CH=2
;DX=2
10
BYTE、WORD、DWORD、 、 、 、 QWORD、TBYTE 、NEAR、 、 、 FAR 3)属性修改运算符 )属性修改运算符
算术运算符 逻辑运算符 关系运算符
符合比较条件, 符合比较条件, 则比较结果为全 则比较结果为全 +、-、*、/、1,否则为全 、 、 、 、mod等 等 ,否则为全0
AND、OR、NOT、XOR 、 、 、 EQ、NE、LT、LE、GT、GE 、 、 、 、 、 = ≠ < > ≤ ≥
注意逻辑运算指令和逻辑运算符的区别 注意逻辑运算指令和逻辑运算符的区别 逻辑运算指令 AND DX, PORT AND 0FFH
变量、 变量、标 号、存储 单元
类型修改运算符PTR 类型修改运算符
类型 PTR 地址表达式
短转移运算符SHORT JMP SHORT 标号 短转移运算符 类型指定运算符THIS THIS 类型 类型指定运算符 段超越运算符 段名: 段名:地址表达式 段寄存器: 段寄存器:地址表达式
四章汇编语言程序设计ppt课件
![四章汇编语言程序设计ppt课件](https://img.taocdn.com/s3/m/4687005111a6f524ccbff121dd36a32d7375c7e7.png)
ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
汇编语言第4章PPT课件
![汇编语言第4章PPT课件](https://img.taocdn.com/s3/m/fafd7ff7ccbff121dc36832a.png)
2. 汇编语言程序设计与执行过程
输入汇编语言源程序(EDIT) 汇编(MASM) 链接(LINK) 调试(TD)
源文件 . ASM 目标文件 .OBJ 可执行文件.EXE 最终程序
4
3. 汇编语言源程序结构
由多个逻辑段组成,包含: 代码段:存放源程序的所有
数据段名 SEGMENT …
数据段名 ENDS
26
一、数据定义伪指令
用途:定义变量类型,给存储器赋初值,或仅给变量分配存储单 元,而不赋予特定的值。
格式: [变量名] DB 操作数;定义字节 [变量名] DW 操作数;定义字 [变量名] DD 操作数;定义双字 [变量名] DQ 操作数;定义8个字节 [变量名] DT 操作数;定义10个字节
操作数——是赋给变量的初始值,可以有一个,也可以有多个, 但不能超出数据类型范围。操作数可以是数值、字 符串、?、或者DUP。
CLC
;CF=0
LPER:MOV AL,DATA2[SI]
ADC DATA1[SI],AL
INC SI
DEC CX
JNZ LPER
MOV AH,4CH
INT 21H
;返回DOS
CODE ENDS
END START
7
二、汇编语言语句类型及格式
1. 汇编语言语句分类
指令性语句
CPU执行的语句, 能够生成目标代码
段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之
间的位移量。 类 型 字节型、字型和双字型
14
3)表达式
组成:操作数:常量、寄存器名字、存储器操作数 运算符:
算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
15
汇编语言第4章汇编语言
![汇编语言第4章汇编语言](https://img.taocdn.com/s3/m/92f5d9cbb4daa58da1114abf.png)
4 8 汇编语言第4章汇编语言
10
近类型 (NEAR)
-1
远类型 (FAR)
-2
2. 操作符
操作符可以是指令助记符, 伪指令助记符, 宏指令符号。
3. 操作数
操作数是操作符操作的对象,可以是数据 本身,也可以是标号、寄存器名或算术表达式。
4. 注释
注释是对指令功能的说明,目的实施自 己或他人在阅读分析程序是方便。
第四章 汇编语言
4.1 汇编语句格式 4.2 汇编语言中数据的表示方法 4.3 运算符号 4.4 伪指令 4.5 汇编语言的上机过程
汇编语言第4章汇编语言
4.1 汇编语句格式
4.1.1 字符集 4.1.2 汇编语句格式
汇编语言第4章汇编语言
4.1.1 字符集
Microsoft的宏汇编语言由下列字符组成: (1)英文字母:A~Z和a~z。 (2)数字字符:0~9。 (3)算术运算符:+,-,*,/。 (4)关系运算符:<,=,>。 (5)分隔符:,,:,;,(,),[,], (空格),TAB(制表符)。 (6)控制符:CR(回车),LF(换行),FF(换页)。 (7)其它字符:$,&,_(下划线),.,@,%,!。
SIZE LAB= (L汇E编N语G言T第H4章汇L编A语B言) * (TYPE LAB)
4.3.5 组合算符
1. PTR 用来建立或临时改变存储器操作数的类型。 2. THIS 用来为一个标号建立一个新的类型。
MOV [BX],10H MOV BYTE PTR[BX],10H MOV WORD PTR[BX],10H A1 DB 10H,20H MOV AX,A1 MOV AX,WORD PTR A1 B1 EQU THIS WORD A2 DB 21H,34H MOV AX,B1
单片机应用技术(第三版)第四章汇编语言程序设计课件
![单片机应用技术(第三版)第四章汇编语言程序设计课件](https://img.taocdn.com/s3/m/adf45fd0162ded630b1c59eef8c75fbfc77d943e.png)
第4章 汇编语言程序设 计 实训4 信号灯的控制2
4.1 概述 4.2 简单程序设计 4.3 分支程序设计 4.4 循环程序设计 4.5 查表程序 4.6 子程序设计与堆栈技术 本章小结 习题4
第4章 汇编语言程序设计
实训4 信号灯的控制2
1. 实训目的 (1) 掌握汇编语言程序的基本结构。 (2) 了解汇编语言程序设计的基本方法和思路。 2. 实训设备与器件 (1) 实训设备:单片机开发系统、微机等。 (2) 实训器件与电路:参见实训1电路图。 3. 实训步骤与要求 (1) 运行程序1,观察8个发光二极管的亮灭状态。
ORG 0000H ;程序从地址0000H开始存放
START: MOV P1,#00H
;把立即数00H送P1口,点亮
;所有发光二极管
ACALL DELAБайду номын сангаас ;调用延时子程序
MOV P1,#0FFH
;灭掉所有发光二极管
第4章 汇编语言程序设计
(2) 在单片机开发调试环境中,将内部RAM的20H单元内
容修改为00H,运行程序2,观察8个发光二极管的亮灭状态;
重新将内部RAM的20H单元内容修改为80H,再次运行程序2,
观察8个发光二极管的亮灭状态。
(3) 运行程序3,观察8个发光二极管的亮灭状态。
程序1:所有发光二极管不停地闪动。
汇编语言学习第4章
![汇编语言学习第4章](https://img.taocdn.com/s3/m/6331be1e964bcf84b9d57b87.png)
不同而不同。
(名字项,常称为标号) 标号是程序设计人员自己定义的表示符号,用来表示本语句的符号地址
(即该指令的偏移地址,也就是该单元与其所处段基址的偏移量)是可有
可无的,只有当需要用符号地址来访问该语句时才需要。 2.operation(操作符)
操作符项可以是指令、伪操作或宏指令的助记符。对于指令,作用是指出
1.等价语句EQU
等价语句的一般使用格式如下: SYMBOL EQU EXPRESSION
作用是用左边的符号名代表右边的表达式。
注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名, 也不能被重新定义。
(1)用符号名代表常量或表达式
例4.14 (2)用符号名代表字符串 例4.15 (3)用符号名代表关键字或指令助记符 例4.16
例4.21
2.定义字变量的伪指令为DW
一个变量占一个字空间
例4.22:WORD1 DW DW 89H, 1909H, -1 0ABCDH, ?, 0
上面的定义语句经汇编后所产生出的内存单元分配情况如下:
… 89 00 09 19 FF FF CD AB --00 00 …
例4.23
3.双字变量定义伪指令DD 每个双字变量占用二个连续的字单元(四个字节)。
功能和作用,而不应该只写出指令的动作。
4.2运算符号
4.2.1算术运算符
算术运算符有:+、-、*、/和MOD。 其中: +、-、*、/就是我们算术中常用的加、减、乘、除。 MOD算符是模运算。指除法运算后得到的余数。 例如:5 MOD 2为1。 注意:算术运算符可以用于数字表达式或地址表达式中,但当它用于地址 表达式时,只有当其结果有明确的物理意义时才是有效的。 例如:将两个地址相乘或相除是无意义的。地址可以做加减运算,但也必 须注意物理意义。例如把两个不同段的地址相加减也是无意义的。 例4.1 例4.2
汇编教程 第四章 汇编语言
![汇编教程 第四章 汇编语言](https://img.taocdn.com/s3/m/76a9c591dd88d0d233d46a4d.png)
数据定义伪指令
用于定义变量,即内存单元或数据区。 格式:
变量名 数据定义伪指令 操作数,操作数,… 操作数,操作数,
数据定义伪指令有如下几种: DB 定义字节 定义字节 DW 定义字 定义字 DD 定义双字 定义双字 DF 定义6字节 定义6 DQ 定义8字节 定义8 DT 定义10字节 定义10字节 操作数可以是常数、变量或表达式
10
语句的构成元素: 标号——指令的符号地址,用来代表指令在存储器中的 标号——指令的符号地址,用来代表指令在存储器中的 地址。只能出现在指令性语句中,标号后应加上冒号。 地址。只能出现在指令性语句中,标号后应加上冒号。 名字——段、过程、变量的名字,用来代表它们在存储 名字——段、过程、变量的名字,用来代表它们在存储 器中的地址。只能出现在指示性语句中,名字后不加冒 器中的地址。只能出现在指示性语句中,名字后不加冒 号。 指令助记符——8086助记符、伪指令 指令助记符——8086助记符、伪指令 操作数——即指令的操作对象 操作数——即指令的操作对象 – 对指令性语句——0,1,2个 对指令性语句——0 – 对指示性语句——根据需要而定 对指示性语句——根据需要而定 – 操作数之间以逗号分隔 – 操作数可以是:寄存器、存储单元、常数或表达式 例如:AX,[DI+BX+10],200,16*8+TABLE,等等
名字
标号
13
DOS系统功能调用 DOS系统功能调用 DOS功能调用以中断服务程序的形式向 DOS功能调用以中断服务程序的形式向 用户提供大量子程序,供用户编程时调用。 一般调用DOS的 一般调用DOS的INT 21H提供的子程序。 21H提供的子程序。 系统功能调用格式:P127 系统功能调用格式:P127 –在AH中设置调用的功能号; AH中设置调用的功能号; –在指定的寄存器中设置入口参数; –执行INT 21H指令,调用功能子程序; 执行INT 21H指令,调用功能子程序; –如果需要,分析出口参数。
第4章汇编语言程序设计知识
![第4章汇编语言程序设计知识](https://img.taocdn.com/s3/m/7ea72bf34693daef5ef73d0b.png)
图4-1 分支程序结构
例4-1
JMP_128:MOV RL MOV JMP JMPTAB:AJMP AJMP ┇ AJMP A,R3 A DPTR,#JMPTAB @A+DPTR ROUT00 ROUT01 ┇ ROUT7F
128个子程序首址
二、分支程序
说明:此程序要求128个转移目的地址(ROUT00 ~
三、反汇编
将二进制机器语言程序翻译成汇编语言程序的过程 称反汇编。
汇编和反汇编的过程如图4-3所示。
汇编(汇编程序)
源程序 (汇编语言)
反汇编(汇编程序)
目标码 (机器语言)
图4-3 汇编和反汇编过程
§4.2.3 伪指令
伪指令不是真正的指令,无对应的机器码,在汇编 时不产生目标程序,只是用来对汇编过程进行某种 控制。
格式:字符名称
DATA
表达式
功能:与EQU类似,但有以下差别:
1、EQU定义的字符名必须先定义后使用,而DATA定义的 字符名可以后定义先使用。
ORG START
2000H MOV R0,#21H ;21H→(R0) MOV A,20H ; (20H)→(A) ANL A,#0FH ;A^#0FH→(A),取低位 MOV @R0,A ; (A)→((R0))),低 位置 21H 中 INC R0 ;R0+1→(R0) MOV A,20H ; (20H)→(A) SWAP A, ;A0~3-((A4~7),低位 与高位交换 ANL A,#0FH ;A^#0FH,取高位 MOV @R0,A ; (A)→((R0)),高位 置 22H
序执行程序。
分支程序又分为单分支和多分支结构。 多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。
汇编语言程序设计
![汇编语言程序设计](https://img.taocdn.com/s3/m/24cf1fd90342a8956bec0975f46527d3250ca652.png)
第四章汇编语言程序设计(assembly languageprogramming)§4.1 汇编语言(assembly language)一.概述汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编语言程序:用汇编语言编写的程序汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编语言源程序手工汇编或汇编程序机器语言目标程序汇编程序:用来完成汇编工作的程序,有小汇编ASM宏汇编MASM动态调试程序DEBUG二.汇编语言的语句格式: [名称] 指令助记符 [操作数] [;注释]带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最多可有132个字符,但最好不要超过屏宽80语句可分成指令性语句和指示性语句(伪指令语句)指令性语句汇编后可生成机器码[标号:] 指令助记符 [操作数] [;注释]指示性语句指示汇编程序处理一些工作[名称] 伪指令(指示符) [操作数] [;注释]1.名称(或称标识符)给指令或存储单元地址起的名字,由字母、数字、字符组成字母:A~Z ,a~z数字:0~9字符:可打印+-*/=()[]〈〉;.' ’ ,_:?@$&(非打印空格制表符TAB 回车换行)(界符:,;:.()[]〈〉+-*/=?_@&$' ’界符用来表示某个标志的结束)数字不能作名称的第一个字符,圆点.仅能作第一个字符保留字不能作标识符($、?是保留字,与其它字符组合除外)名称最长为31个字符当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号冒号隐含NEAR属性,例:供段内调用写成 OUTPUT:OUT DX ,AL供段间调用写成 OUTPUT OUT DX ,AL2.指令助记符8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开3.操作数指令执行的对象,可能有一、二个或没有名称指令助记符操作数注释RET ;返回(无操作数)COUNT: INC CX ;CX加1(1个操作数)MOV AL,BL ;ALBL(2个操作数)伪指令可有多个操作数COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开)操作数可以是常数、寄存器名、标号、变量、表达式,MOV AX,[BP+4];(第二个操作数为表达式)4.注释可选项,使程序易读,汇编时不作处理注释前面要加分号,它可位于操作数之后,也可位于行首三.常量与变量1.常量,也叫常数,没有属性的纯数,汇编时已确定的值·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号例:‘A’,“ABC”,汇编后变成41H,414243H2.变量,用于表达数值(或串)的标识符,有三个属性① 段属性(SEGMENT)② 偏移地址属性(OFFSET)③ 类型属性(TYPE),用DB、DW、DD定义§4.2 伪指令(pseudo-instruction)一.符号定义伪指令1.等值EQU格式:符号名 EQU 表达式用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次DATA EQU 1234 ;代表一个数XYZ EQU ALPHA[SI] ;代表一个地址2.等号 =格式:符号名 = 表达式意义与EQU一样,但程序中可重新定义符号的值EMP = 6 ;EMP代表6EMP =EMP + 1 ;EMP现在代表73.解除PURGE格式:PURGE 符号名(符号1,符号2,……,符号n)用于解除所定义的符号使该符号在以后的定义中有效例:原定义 TAB EQU 5可用 PURGE TAB 来解除然后可重新定义 TAB EQU 10二.数据定义伪指令用于预置存储器或定义变量1.定义字节DB格式:[变量名称] DB 表达式例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据2.定义字DW格式:[变量名称] DW 表达式例:TAB DW 1234H;TAB单元内容为34H,TAB+1单元内容为12H 3.定义双字DD格式:[变量名称] DD 表达式每个数据二字(四字节)低位部分在低地址,高位部分在高地址·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行DB/DW/DD用法<1> SUM DB ? ;给SUM单元分配一个字节,内容未定<2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0<3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容未定<4> ADDR DD TABLE ;TABLE的地址(双字)给ADDR例:DATA SEGMENTORG 100HTABLE DB 1,2,3,4ADDR DD TABLEDATA ENDS假设汇编后DS=13A2H(如果ADDR用DW定义,只得偏移量)(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)<5> LETTER DB ‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存<6> HIS DB 3 DUP(‘WELCOME!’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!和回车换行符4.标号LABEL格式:标号名 LEBEL 类型标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用标号有三个属性段属性偏移量属性距离属性(即格式中的类型):NEAR(近程)和FAR(远程)NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段FAR:本标号为段间标号,调用本标号提供偏移地址和段基址一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含如 AGAIN LABEL NEARXOR AX,BUFF[BX]可写成 AGAIN:XOR AX,BUFF[BX]例:ROOT LABEL NEAR ;以下程序所用的ROOT标号是段内属性COMP PROC NEAR ;以下程序所用的过程下的标号是段内属性TIME PROC FAR ;以下程序所用的过程下的标号是段间属性三.运算符1.算术运算符+、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD 7=5)操作数是数字,结果也是数字存储器地址运算时只有加减,例TAB+2、BETA-5等2.逻辑运算符AND、OR、XOR、NOT即与、或、异或、非操作数是数字,结果也是数字例:AND BX,DAT AND 0FEH3.关系算符EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于若关系是假结果为0,若关系是真结果为0FFFFH例:MOV BX,PAD LT 3则PAD的值小于3时,汇编成MOV BX,0FFFFH否则,汇编成MOV BX,04.分析运算符可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型5.合成算符由已存在的存储器操作数生成一个段值与偏移量相同,而类型不同的新的存储器操作数以下讨论分析算符和合成算符1.取段基址SEG它加于一个变量或标号之前,回送段基址,例:ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址MOV AX,SEG VARN ;将VARN的段基址送AX2.取偏移量OFFSET它加于一个变量或标号之前,取其偏移量,例:MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX3.取类型码TYPE它加于一个变量或标号之前,取其类型代码DB DW DD DQ DT NEAR FAR1 2 4 8 10 -1 -2例:NG1 DB ‘A’,‘D’,3NG2 DW 88,265……MOV AL,TYPE NG1 ;NG1定义字节,AL 1MOV AL,TYPE NG2 ;NG2定义字,AL 24.取长度LENGTH它加于一个变量之前,取分配给变量的项数例:TAB DB 150 DUP(?);150项,150字节FUM DW 150 DUP(?);150项,300字节则,MOV CX,LENGTH TAB ;CX 150MOV AX,LENGTH FUM ;AX 150·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为1 5.取字节数SIZE它加于一个变量之前,取回变量所占字节总数,有SIZE = LENGTH * TYPE由上例,LENGTH TAB = 150,TYPE TAB = 1LENGTH FUM = 150,TYPE FUM = 2可知: SIZE TAB = 150SIZE FUM = 300以上5个叫数值返回算符6.类型指示PTR格式:类型 PTR 地址表达式表示PTR右边的(存储器)操作数是左边的类型,有:BYTE、WORD、DWORD、NEAR、FAR例:INC BYTE PTR [BX] ;将BX指向的单元字节加1MOV WORD PTR [DI],99 ;立即数99送DI指向的字中JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取FOK偏移地址)7.指定符THIS(合成算符)用于定义当前所指单元中的类型格式:THIS 类型/距离经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,例:FOOB EQU THIS BYTE;下面的字类型变量FOOW在这里指定为字节型FOOBFOOW DW 120 DUP(?)定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型访问FOOB时为字节操作,访问FOOW时为字操作ADD AL,FOOB[3] ;将数组第四字节与AL相加MOV AX,FOOW[4]将数组第五六字节组成的字送AX也可以这样来构成FOOB:FOOB EQU BYTE PTR FOOW又例:DATAF EQU THIS FARDATAN:MOV AX,FOO这时 JMP DATAN为近程转移JMP DATAF为远程转移8.段修改符:用于对某一地址表达式指定临时段基址,如MOV AX,ES:[BX];指定ES为BX的段基址,对当前指令有效9.短程符SHORT与NEAR、FAR功能类似,位移量一字节范围 -128~+127,对应一条短转移指令例:JMP SHORT LAB;转移到标号LAB的地址10.方括号 [ ]表示操作数(加方括号)是一个地址偏移量,不是数值格式:[表达式] 或者 [表达式][ ]例:MOV [BX],AX ;将AX内容送BX所指单元MOV [BX+7],AX ;将AX内容送BX+7所指单元MOV AX,[BX][SI] ;将BX+SI所指单元内容送AX11.取高/低字节HIGH/LOW用来分离常量的高/低字节,对存储器操作数无效例:DATA EQU 789AHMOV AL,HIGH DATA ;AL=78HMOV AL,LOW DATA ;AL=9AH四.段定义伪指令1.SEGMENT—ENDS格式:[段名] SEGMENT [定位类型] [组合类型] [‘类别名’]┇[段名] ENDS·段名·定位类型(Align),给出实际段地点的种类或段长度的信息<1> PARA 段起始地址从一个节(paragraph)的边界开始<2> BYTE 段地址可从任意绝对地址开始<3> WORD 段地址从任意一个字的边界开始<4> PAGE 段地址从某一页的边界开始(一页等于256字节)<5> INPAG 段长度小于一页未说明定位类型时则默认为PARA·组合类型(Combine),又称联合类型,程序中各程序段的连接和定位方法<1> PUBLIC 将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖<2> COMMON将段名相同的程序段连接,各段都从同一地址开始<3> AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上例:AT 1234H,则段地址被定位在物理地址为12340H处,如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG 5AT 不能向前引用<4>STACK 表示这个段是运行期间的堆栈段<5>MEMORY 该段是相互连接的几个段中地址最高的段<6>NONE本段与其他段无组合关系未说明联合类型时则默认为NONE,不和别的段连接·‘类别名’(Class),也叫组名,加单引号,汇编后类别名相同的程序段代码集中在一起定位,形成一个统一的物理段,类别名可自定,约定的有CODE (代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等2.ASSUME段寄存器说明伪指令,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现格式:ASSUME 段寄存器:段名 [,…]例: ASSUME CS:CODE,DS:DATA ;用SEGMENT—ENDS定义ASSUME CS:SEG KGF,DS:SEG BEGIN;由算符定义ASSUME ES:NOTHING ;用关键字定义,表示不使用ES(取消ES段寄存器)(保留字NOTHING在这里作为一个段名参数,ASSUME NOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值)·ASSUME只是设定段寄存器与逻辑段的对应关系,并没给段寄存器装入实际值,所以程序中必须对DS、ES、SS赋值,而CS由系统赋值3.ORG定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址格式:ORG 表达式表达式以65536(64K)为模计算,超过64K则取其余数本语句前未定义过的变量不可出现在表达式中,表达式可包含$(程序计数器当前值)如:ORG OFFSET $+1000表达式必须为正值,若为负值,就会从当前段的地址高端开始表达式最好不要写成OFFSET $-1000,以免把汇编过的1000个字节覆盖掉ORG指令不能带标识符,如START:ORG 0和SKIP ORG 100都是错的例:CODE SEGMENT ;段起始ORG 100H ;本程序代码从偏移地址100H开始装入ASSUME CS:CODE ;装入代码段地址到CS中START:IN AL,30H ;程序段SHL AL,1OUT 32H,ALJMP STARTCODE ENDS ;程序段结束END START ;汇编结束例:DATA SEGMENTORG 50HDAT DW 1,2,$+1┇DATA ENDS注意DAT不能定义为字节,否则与$不匹配五.过程定义伪指令格式:过程名 PROC 属性┇过程体RET过程名 ENDP·过程名不可缺省,它和标号一样有三个属性:段属性、偏移地址属性、距离属性·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性·一个过程允许多个入口,入口处有标号,标号要说明距离属性例:延时100ms子程序DELAY PROC ;隐含NEARMOV BL,10 4TDLY1: MOV CX,2801 ;内循环延时10ms 10TWAIT0: LOOP WAIT0 9/5T DEC BL 2TJNZ DLY1 8/4TRET 8TDELAY ENDP六.结束伪指令·NAME:给模块(源程序)命名格式:NAME 模块名称它出现在源程序的最前端·END:汇编结束格式:END [标号名]它通知汇编程序本模块汇编到此结束标号名是可选项,若选取,应指向执行本程序的起始地址若一个源程序是多模块,只有主模块的END后加标号,子模块只有END七.宏指令宏指令:在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用宏汇编:源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码宏指令用MACRO—ENDM来定义,如:CRLF MACROMOV DL,0DHMOV AH,02HINT 21H┇ENDM(CRLF作回车换行)§4.3 汇编语言程序设计(assembly language programming)一.设计要求1.程序简明、易读、易调试、易修改2.程序占用内存要少(包括程序长度及运行时所需空间)3.程序运行速度要快二.基本设计方法1.选择合适的计算方法2.绘制程序流程图3.编制程序4.上机调试三.汇编语言程序格式和基本结构一般一个完整的汇编语言程序至少应包括以下三个程序段简化段格式:.MODEL SMALL.STACK 64H.DATA……;紧接指令代码从偶地址开始存放.CODESTART: MOV AX,@DATAMOV DS,AX……END STARTDATA SEGMENT ‘DATA’┇数据段DATA ENDSSTACK SEGMENT ‘STACK’┇堆栈段STACK ENDSCODE SEGMENT ‘CODE’ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AX┇代码段CODE ENDSEND START程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构(一)顺序结构一种简单程序,按顺序执行例1.将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0200HX X201H 0202H 0DATA SEGMENTORG 200HBCD DB 47HDB 2 DUP(?)DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AXMOV AX,TOPMOV SP,AXMOV BX,OFFSET BCD MOV AL,[BX]AND AL,0FHMOV [BX+1],AL MOV AL,[BX]MOV CL,4ROL AL,CLAND AL,0FHMOV [BX+2],AL HLTCODE ENDS END START例2.将ADDR1和ADDR2两单元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中DATA SEGMNETADDR1 DW 7854HADDR2 DW 9981HSUM DB 3 DUP(0)DATA ENDSSATCK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,ADDR1ADD AX,ADDR2MOV WORD PTR SUM,AXADC SUM+2,0HLTCODE ENDSEND START例3.查表将DATA1单元中字节类型数据(0~0FH)转换成ASCII码,并存入ASCII单元中DATA SEGMENTASCTAB DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HDATA1 DB 09HASCII DB ?DATA ENDSSTACK SEGMENT STACKDW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARASCTAB 30 031 1┇93941 A42 B┇46 F┇ASCIIPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET ASCTABMOV AL,DATA1XLATMOV ASCII,ALRETSTART ENDPCODE ENDSEND START例4.将200H和201H单元字节的高4位对调,低4位不变CODE SEGMENT200H201HORG 200HDATA1 DB 0F3H,47HASSUME CS:CODE,DS:CODESTART:MOV AX,CODEMOV DS,AXMOV CL,4MOV AX,WORD PTR DATA1 ;AX=47F3HROL AX,CL ;AX=7F34H ROL AH,CL ;AX=F734H ROL AL,CL ;AX=F743H MOV WORD PTR DATA1,AXHLTCODE ENDSEND START(二)分支结构通过判断产生分支,借助于条件转移指令跳转到相应的分支地址执行分支程序分支程序由三部分组成① 测试部分,负责产生决定分支的条件② 定向部分,根据测试条件是否满足,决定程序是否分支③ 标注部分,标明分支的去向利用跳转表也可使程序转移到分支地址例1.16位二进制补码X在DATA1单元,求其绝对值送DATA2单元(设X≠8000H)∣X∣= X,X≥0-X, X<0DATA SEGMENTDATA1 DW 9F87HDATA2 DW ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,DATA1AND AX,AXJNS ABS0NEG AXABS0: MOV DATA2,AXHLTCODE ENDSEND START例2.多重分支学生成绩按分数段划分为:A、90~100(5AH~64H)B、80~89 (50H~59H)C、70~79 (46H~4FH)D、60~69 (3CH~45H)E、 <60 ( <3CH)已知分数存放在MARK单元,请用ASCII码的A、B、C、D、E去代表MARK单元中的分数所属的段,并存于GRADE单元DATA SEGMENTMARK DB 81GRADE DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET MARKMOV AL,[BX]CMP AL,3CHJC LPECMP AL,46HJC LPDCMP AL,50HJC LPCCMP AL,5AHJC LPBMOV AL,41H ;‘A’JMP SHORT DONELPB: MOV AL,42H ;‘B’JMP SHORT DONELPC: MOV AL,43H ;‘C’JMP SHORT DONELPD: MOV AL,44H ;‘D’JMP SHORT DONELPE: MOV AL,45H ;‘E’DONE: MOV BX,OFFSET GRADE MOV [BX],ALHLTCODE ENDSEND START法2:直接查表转换(顺序结构)DATA SEGMENTTAB DB ‘EEEEEEDCBAA’MARK DB 81GRADE DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABMOV AL,MARKMOV AH,0MOV CL,10DIV CLXLATMOV GRADE,ALHLTCODE ENDSEND START(三)循环结构使机器重复执行一系列指令,是一种闭合的分支结构循环程序由四部分组成① 初始化部分(或预置部分),负责设置循环初值② 处理部分,循环过程的主体③ 控制部分,修改初值,判断是否循环循环次数由一计数器控制循环次数由某一指定条件是否满足来决定④ 结束部分,处理循环程序的最后结果例1.将DTAB单元开始的一组字节补码数(≤255个)求平均值,结果存入AVE单元,若结果为负,在SYM置FFH否则置0DATA SEGMENTDTAB DB 0FDH,0FCH,05H,0F8H,……DB 08H,25H,83H,97H,……COUNT EQU $-DTABAVE DB ?SYM DB ?DATA ENDSSTACK SEGMENT STACKSTA DB 20 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK AVER PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,DTABMOV CX,COUNTXOR DX,DXNEXT: MOV AL,[BX]CBWADD DX,AXINC BXLOOP NEXTMOV AX,DX MOV CL,COUNTIDIV CLMOV AVE,ALMOV SYM,0AND AL,ALJNS DONEMOV SYM,0FFHDONE: RETAVER ENDPCODE ENDSEND START循环控制方法:循环次数由计数器控制例2.将8位二进制小数规格化设需规格化的小数在DATA1单元,要求规格化后使其最高位为1,并存入DATA2单元,办法是把小数左移至最高为位为1为止,左移次数存入DATA3单元,若小数是0,则在DATA2和DATA3单元存入0示例:DATA1 DATA2 DATA322H 88H 02H01H 80H 07HCBH CBH 00H00H 00H 00HDATA SEGMENTDATA1 DB 22HDATA2 DB ?DATA3 DB ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV CL,0MOV AL,DATA1 ;取数AND AL,AL ;设ZF、SF标志JZ DONECHKSF:JS DONEINC CLADD AL,AL ;左移一位JMP SHORT CHKSFDONE: MOV DATA2,ALMOV DATA3,CLHLTCODE ENDSEND START循环控制方法:循环次数由某一指定条件是否满足来决定例3.多重循环将n个无符号字节数从小到大排序,方法是依此比较相邻两单元的数,若前小后大不交换第一轮比较n-1次,最大数沉底(高地址)第二轮比较n-2次,次大数沉到最大数上面第n-1轮比较完若在某一轮比较时没有出现交换,说明顺序已排好,不必后续比较,故设交换标志AH=1代表不交换,AH=2代表有交换DATA SEGMENTLIST DB 18,6,11,3,1,2,3,9,8,7,6 DB 111,110,99,112,115,114,113,98,96,97 COUNT EQU $-LISTDATA ENDSSTACK SEGMENT STACKSTA DW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSET PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV DX,COUNT-1 ;n-1轮(外循环)EXGO:MOV CX,DX ;每轮次数(内循环)MOV AH,01H ;交换标志MOV BX,OFFSET LIST ;数据块首址INGO: MOV AL,[BX]INC BXCMP AL,[BX]JC NEXT ;数1小,不交换XCHG AL,[BX] ;数1>数2,交换DEC BXXCHG AL,[BX]INC BX ;恢复数据指针MOV AH,02H ;有交换标志NEXT: LOOP INGODEC DXJZ DONEDEC AHJNZ EXGODONE: RETSET ENDPCODE ENDSEND START(四)子程序结构基本要求:① 子程序的开始(入口处)应给予一个标号,结束处有返回指令② 通用子程序要说明入口条件(入口参数)和出口条件(出口参数)③ 调用子程序要注意保护现场和恢复现场调用—返回的堆栈操作:CALL target ;段内SPSP-2,[SP+1,SP] IP,IPIP+disp段间SPSP-2,[SP+1,SP] CS,CSsegSPSP-2,[SP+1,SP] IP,IPoffsetRET ;段内IP [SP+1,SP],SPSP+2;段间IP [SP+1,SP],SPSP+2CS [SP+1,SP],SPSP+2RET n ;如上操作后SPSP+n·子程序入口标号应说明距离属性·对于一个FAR过程,过程初必须先保护程序段前缀中的中断指令INT 20H 的断点地址(DS:0000),它是一个程序正常结束退出的中断处理程序例1.将内存200H单元开始的一个五字节十六进制数显示出来(低位在低地址)DATA SEGMENTORG 200HNUM DB 9AH,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV BX,5MOV AX,STACKMOV SS,AXMOV SP,TOPMOV SI,OFFSET NUMNEXT: MOV DH,[SI+BX-1] ;(不用AL,因调用MOV DL,DH ; display返回时DL→AL)MOV CL,4ROL DL,CLAND DL,0FHCALL DISPLAYMOV DL,DHAND DL,0FHCALL DISPLAYDEC BXJNZ NEXTMOV AX,4C00HINT 21HDISPLAY PROC NEARADD DL,30HCMP DL,3AHJB OKADD DL,07H;(如果DL=3AH,3AH+7=41H是‘A’)OK: MOV AH,02HINT 21HRET。
汇编语言第四章
![汇编语言第四章](https://img.taocdn.com/s3/m/277cee7af5335a8102d22075.png)
; (DL)变为ASCII码
分支程序设计注意
选择合适的转移指令
如:CMP AX,1
JL L1
JL为有符号转移指令,(AX)<1则转移。若JL换为JB, 则为无符号转移指令,该转移的反而不转移。
4.2 分支程序设计注意
为每个分支安排出口
如:实现(AL)≥0,′+′→DL; (AL)<0,′-′→DL;
4.3.3 循环程序设计
开始 取数→BX 初始化循环计数值 LOOP1 BX循环左移4位 最右边的4位转为ASCII码 N
ASCII在A~F? Y ASCII码再加7 显示一个字符 循环计数值减1 N 循环计数=0? 结束
Y
4.3.3 循环程序设计
STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DW 1234H DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK BEGIN:MOV AX, DATA MOV DS, AX MOV BX, BUF; 取要显示 的数 MOV CH, 4; 循环次数 LOOP1: MOV CL, 4 ROL BX, CL; 高4位到低4 位 MOV AL, BL AND AL, 0FH ADD AL, 30H; 得到数的 ASCII CMP AL, 3AH; 数>9? JL DISP; 在0~9之间 ADD AL, 7; 在A~F之间 MOV DL, AL; 显示 MOV AH, 2 INT 21H DEC CH JNZ LOOP1 MOV AH,4CH INT 21H ENDS END BEGIN
… MOV BL, 0; BL中存放1的个数 MOV CL, 16 L1: SAL AX, 1; 算术左移,b15→CF JNC L2 INC BL; CF=1,(BL)+1→CL L2: DEC CL JNZ L1 … 上述方法必须循环16次。
微机原理第四章—汇编语言
![微机原理第四章—汇编语言](https://img.taocdn.com/s3/m/d5e03b16a2161479171128e7.png)
第4章 汇编语言程序设计
2. 几种汇编程序 (1)汇编程序的作用 ) 将源程序翻译成机器语言程序。 ① 将源程序翻译成机器语言程序。 按用户要求自动分配存储区域(如程序区、数据区等) ② 按用户要求自动分配存储区域(如程序区、数据区等) 。 二进制数。 ③ 自动地把各种进制数 → 二进制数。 ASCII码 ④ 把字符 → ASCII码。 ⑤ 计算表达式的值。 计算表达式的值。 自动对源程序进行检查,指出语法错误(如非法格式、 ⑥ 自动对源程序进行检查,指出语法错误(如非法格式、未 定义的助记符、标号、漏掉操作数等)。 定义的助记符、标号、漏掉操作数等)。 Microsoft 公司 (2)汇编程序分类 ) ① 基本汇编 ASM ② 宏汇编 MASM(有各种版本,还支持宏操作,条件汇 编,协处理命令等) ③ TASM(Turbo Assembler)性能同MASM,速度更快
第4章 汇编语言程序设计
段
; ―――――――――――――――――――――――――――― 段名1 SEGMENT ; 一个段的开始 语句1 语句 语句2 语句 …… 段名1 ENDS ; 一个段的结束 ; ――――――――――――――――――――――――――――- - 段名2 SEGMENT ; 另一个段的开始 …… 段名2 ENDS ; 另一个段的结束 ; ――――――――――――――――――――――――――――― …… ; 其它段 ; ――――――――――――――――――――――――――――― END START ; 源代码结束
CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备 、存储器 接口、 、 、 接口 输入、
第4章 汇编语言程序设计
编辑源程序 EDITABC.ASM
汇编语言上机过程 D:>EDIT ABC.asm D:>MASM ABC 有语法错, 有语法错,回EDIT下改该程序 下改该程序 D:>LINK ABC 有错,回在EDIT下改程序 有错,回在 下改程序 D:>ABC 运行结果错, 运行结果错,回EDIT下改程序 下改程序 或在DEBUG下调试,找原因。 下调试,找原因。 或在 下调试 D:>DEBUG ABC.exe
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;3
MOV CX,LENGTH GAMA ;4
SIZE SLAB= (LENGTH SLAB) * (TYPE SLAB)
4.3.5 组合算符
有2个:PTR,THIS(略)
PTR 用来建立或临时改变标识符号的类型或存储器操作数的 存储单元类型。格式如下:
NEWT PTR EXP
其中:NEWT是要建立(或改变)的标号或存储单元的新的类 型。可以是BYTE,WORD,DWORD,QWORD,TBYTE, NEAR 或 FAR。EXP是表达式,可以是用户自定义的标识符号, 或用间接寻址、基址寻址、变址寻址或基变址寻址方式表示的 存储器操作数的存储单元。
4.1.2 汇编语句格式
DSEG DATA1 DATA2 DSEG SSEG SKTOP SSEG CSEG START:
CSEG
SEGMENT
DB
13H, 26H
DW
0
ESENGDMS•ETNTYPSTEACKDATA1=1
DB
20 DUP(0)
•TYPE ENDS
SEGMENT
DATA2=2
ASSUME CS:CSEG,DS:DSEG, SS:SSEG
3. 操作数
操作数是操作符操作的对象,可以是数据 本身,也可以是标号、寄存器名或算术表达式。
4. 注释
注释是对指令功能的说明,目的是使自 己或他人在阅读分析程序时方便。
4.2 汇编语言中数据的表示方法
4.2.1 数据在机内的表示 4.2.2 汇编语言中数据的书写形式
4.2.1 数据在机内的表示
(1)数据的符号:
00010000 0001000000
00010000 00000100
4.3.2 逻辑运算符
AND(与) 按位与 76H AND 23H=22H
OR(或) 按位或 76H OR 23H=77H
0111 0110 AND 0010 0011
0010 0010
0111 0110 OR 0010 0011
MOV
AX,DSEG
MOV
DS,AX
MOV
AX,SSEG
MOV
SS,AX
MOV
SP,LENGTH SKTOP
MOV
AL,DATA1
ADD
AL,DATA1+1
MOV
BYTE PTR DATA2,AL
MOV
AH,4CH
INT
21H
ENDS
END
START
;数据段开始 ;原始数据 ;保存结果单元 ;数据段结束 ;堆栈段开始
CX=0001H,DX=0004H
SI=1,DI=2
ALPHA 0FH 2000:0001H 17H 2000:0002H 2EH 2000:0003H
BETA 67H 2000:0004H 42H 2000:0005H 25H 2000:0006H 00H 2000:0007H
4.3.4 分析算符
用0表示正,1表示负。 对于定点表示有原码、反码、补码等表 示方法。
(2)数据的定点表示法
1)小数点在最低位之后,代表纯整数, 16位表示范围为 -32768~+32767 2)小数点在最高位和次高位之间,代表纯小数。
(3)数据的浮点表示法
在浮点表示中, 分为尾数和阶码两部分. 有多种表示方法,现在一 般用IEEE的表示方法。
2)偏移量属性: 标号所标识的单元的偏移地址即是它的偏移量属性值, 可用 OFFSET算符得到。
3)类型属性: 标号所标识的单元中存放的数据或指令代码的类型。 共有7种。标 号的类型属性值可用TYPE算符得到。
DB DW DD DQ DT
标号 类型
字节类型 字类型 双字类型 四字类型 十字节类型 近类型 远类型 (BYTE) (WORD) (DWORD) (QWORD) (TBYTE) (NEAR) (FAR)
4.3.7 记录专用算符
1. MASK 2. WIDTH
暂时不讲。
4.3.8 算符的优先级
表达式求值时,各种运算符的优先次序(由高至低)如下: 1)括号内的表达式 2)LENGTH,SIZE,WIDTH,MASK。 3)PTR,OFFSET,SEG,TYPE。 4)HIGH,LOW。 5) *,/,MOD,SHL,SHR。 6)十,一。 7)EQ,NE,LT,LE,GT,GE。(关系运算符) 8)NOT。 9)AND。 10)OR,XOR。 优先级别相同时,按出现次序由左至右顺序计算。
;堆栈段结束 ;代码段开始
;初始化数据段基址
;初始化堆栈段基址
;设置堆栈指针 ;取第一个数据 ;与第二个数据相加 ;保存结果
;返回DOS ;代码段结束 ;源程序结束
段定义 END
汇编语句最多由四个域组成: [标号] 操作符 操作数 [;注释]
1. 标号
(1) 定义: 程序设计人员自己定义的标识符号, 用来表示 数据、数据在内存中的偏移地址或指令代码在内存中的 偏移地址。
无符号整数 0~65535 补码表示的带符号整数 -32768~+32767
字单元
4.2.2 汇编语言中数据的书写形式
1)二进制常数:若干个0,1组成的以B结尾的数据,如101B。 2)八进制常数:由0~7的数字组成的以Q结尾的数据,如125Q。 3)十进制常数:由0~9的数字组成的以D结尾或不以任何字母结尾的数据,
4.3.4 分析算符
举例:
ALPHA DB 5 DUP(0)
BETA DW 3 DUP (0)
GAMA DD 4 DUPHA
;5
MOV BX,SIZE BETA
;6
MOV CX,SIZE GAMA
;16
MOV AX,LENGTH ALPHA ;5
MOV BX,LENGTH BETA
A1 DB 10H,20H MOV AX,A1 MOV AX,WORD PTR A1
4.3.6 字节分离算符
用于将一个表达式的高字节和低字节分开。LOW取 低字节,HIGH取高字节。
MOV AL,HIGH 1234H MOV AH,LOW 1234H MOV AL,LOW 12345 MOV AL,LOW 34*97+8
•其中,SEG,OFFSET,TYPE用来将一个标号分解成它的三种属性 值。格式如下:
SEG OFFSET TYPE
SLAB
•其中,SLAB为用户自定义的标识符号。SEG算符用于求得该标号 的段属性值;OFFSET算符用于求得该标号的偏移量属性值;TYPE 算符用于求得该标号的类型属性值。
4.3.4 分析算符
如137D,137。 4)十六进制常数:由0~9的数字以及A~F的字母组成的以H结尾的数据,如
13AH。 5)十进制科学记数法常数:由十进制数,E和指数组成, 如 0.2467E+5。 6)字符常数:用单引号或双引号括起的一个或多个字符,例如 ’ a’ (值为
61H),‘AB’(值为4142H)。 7)标识符:用符号定义伪指令定义的符号。 8)表达式:用运算符号将上述常数、标识符号等连接起来且有确定数学意义
(2)标号的组成规则 1)组成标号的字符: A~Z,a~z,0~9,?,@,$,和_(下划线); 2)标号的最大长度为3l(字符个数)。 3)标号的第一个字符不能是0~9的数字。 4)机器指令语句中标号后面必须以冒号结束,伪指令
语句中的标号后面不允许有冒号。
1. 标号
(3) 标号的三个属性
1)段属性: 标号所在的逻辑段即是它的段属性,标号所在逻辑段段基址的高16位 值即是它的段属性值,标号的段属性值 可用SEG算符得到。
(3)浮点数据表示法
短实数
31
23
0
S 阶码
尾数
尾数23位, 阶码8位,过余量127(7FH)
63
52
0
长实数
S 阶码
尾数
尾数52位, 阶码11位,过余量1023(3FFH)
79
64 63
0
临时实数 S
阶码
1
尾数
尾数63位, 阶码15位,过余量16383(3FFFH)
1▲fff…fff×2n
尾数
阶码
4.3.1 算术运算符
七个: +, -, *, /, MOD, SHL, SHR。 +,-,*,/ 与通常的用法相同。 MOD(取余): 两数相除之余数, 例 10 MOD 3=1 SHL(左移) :按二进制左移, 例 10H SHL 2 =40H SHR(右移) :按二进制右移, 例 10H SHR 2 =04H
(3)浮点数据表示法(举例)
转换为二进制为 100100.101
规格化后为
1.00100101×25
36.625
阶码为
101
加过余量127后 0111 1111+00000101=10000100
尾数(23位)
001 0010 1000 0000 0000 0000
符号&阶码&尾数 01000010 00010010 10000000 00000000
•举例:
ALPHA DB 15,23,46 BETA DW 4267H,25H
MOV AX,SEG ALPHA MOV BX,SEG BETA MOV CX,OFFSET ALPHA MOV DX,OFFSET BETA MOV SI,TYPE ALPHA MOV DI,TYPE BETA
•结果:AX=2000H,BX=2000H
第四章 汇编语言
4.1 汇编语句格式 4.2 汇编语言中数据的表示方法 4.3 运算符号 4.4 伪指令 4.5 汇编语言的上机过程
4.1 汇编语句格式
4.1.1 字符集 4.1.2 汇编语句格式