微机原理与应用 第4章 汇编语言程序设计.docx

上传人:b****7 文档编号:15294408 上传时间:2023-07-03 格式:DOCX 页数:43 大小:68.37KB
下载 相关 举报
微机原理与应用 第4章 汇编语言程序设计.docx_第1页
第1页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第2页
第2页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第3页
第3页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第4页
第4页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第5页
第5页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第6页
第6页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第7页
第7页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第8页
第8页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第9页
第9页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第10页
第10页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第11页
第11页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第12页
第12页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第13页
第13页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第14页
第14页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第15页
第15页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第16页
第16页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第17页
第17页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第18页
第18页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第19页
第19页 / 共43页
微机原理与应用 第4章 汇编语言程序设计.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微机原理与应用 第4章 汇编语言程序设计.docx

《微机原理与应用 第4章 汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《微机原理与应用 第4章 汇编语言程序设计.docx(43页珍藏版)》请在冰点文库上搜索。

微机原理与应用 第4章 汇编语言程序设计.docx

微机原理与应用第4章汇编语言程序设计

第四章汇编语言程序设计(assemblylanguageprogramming)

§4.1汇编语言(assemblylanguage)

一.概述

汇编语言:

一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应

汇编:

把汇编语言源程序翻译成机器语言目标程序的过程

汇编语言源程序手工汇编或汇编程序机器语言目标程序

汇编程序:

用来完成汇编工作的程序,有

小汇编ASM

宏汇编MASM

动态调试程序DEBUG

二.汇编语言的语句

格式:

[名称]指令助记符[操作数][;注释]

带方括号的项有时可没有,注释项完全可以没有

每个部分用空格分开

每行最多可有132个字符,但最好不要超过屏宽80

语句可分成指令性语句和指示性语句(伪指令语句)

指令性语句汇编后可生成机器码

[标号:

]指令助记符[操作数][;注释]

指示性语句指示汇编程序处理一些工作

[名称]伪指令(指示符)[操作数][;注释]

1.名称(或称标识符)

给指令或存储单元地址起的名字,由字母、数字、字符组成

字母:

A~Z,a~z

数字:

0~9

字符:

可打印+-*/=()[]〈〉;.'’,_:

@$&

(非打印空格制表符TAB回车换行)

(界符:

,;:

.()[]〈〉+-*/=?

_@&$'’界符用来表示某个标志的结束)

数字不能作名称的第一个字符,圆点.仅能作第一个字符

保留字不能作标识符($、?

是保留字,与其它字符组合除外)

名称最长为31个字符

当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址

当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号

冒号隐含NEAR属性,例:

供段内调用写成OUTPUT:

OUTDX,AL

供段间调用写成OUTPUTOUTDX,AL

2.指令助记符

8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开

3.操作数

指令执行的对象,可能有一、二个或没有

名称指令助记符操作数注释

RET;返回(无操作数)

COUNT:

INCCX;CX加1(1个操作数)

MOVAL,BL;ALBL(2个操作数)

伪指令可有多个操作数

COSTDB3,4,5,6,7,8;(6个操作数,用逗号分开)

操作数可以是常数、寄存器名、标号、变量、表达式,

MOVAX,[BP+4];(第二个操作数为表达式)

4.注释

可选项,使程序易读,汇编时不作处理

注释前面要加分号,它可位于操作数之后,也可位于行首

三.常量与变量

1.常量,也叫常数,没有属性的纯数,汇编时已确定的值

·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0

·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号

例:

‘A’,“ABC”,汇编后变成41H,414243H

2.变量,用于表达数值(或串)的标识符,有三个属性

①段属性(SEGMENT)

②偏移地址属性(OFFSET)

③类型属性(TYPE),用DB、DW、DD定义

§4.2伪指令(pseudo-instruction)

一.符号定义伪指令

1.等值EQU

格式:

符号名EQU表达式

用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次

DATAEQU1234;代表一个数

XYZEQUALPHA[SI];代表一个地址

2.等号=

格式:

符号名=表达式

意义与EQU一样,但程序中可重新定义符号的值

EMP=6;EMP代表6

EMP=EMP+1;EMP现在代表7

3.解除PURGE

格式:

PURGE符号名(符号1,符号2,……,符号n)

用于解除所定义的符号使该符号在以后的定义中有效

例:

原定义TABEQU5

可用PURGETAB来解除

然后可重新定义TABEQU10

二.数据定义伪指令

用于预置存储器或定义变量

1.定义字节DB

格式:

[变量名称]DB表达式

例:

DATA1DB2,3,4,5;从DATA1单元开始存放4字节数据

2.定义字DW

格式:

[变量名称]DW表达式

例:

TABDW1234H;TAB单元内容为34H,TAB+1单元内容为12H

3.定义双字DD

格式:

[变量名称]DD表达式

每个数据二字(四字节)低位部分在低地址,高位部分在高地址

·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行

DB/DW/DD用法

<1>SUMDB?

;给SUM单元分配一个字节,内容未定

<2>TABDB20DUP(0);给TAB开始单元分配20字节,内容为0

<3>TIMEDW100DUP(?

);给TIME开始单元分配100字,内容未定

<4>ADDRDDTABLE;TABLE的地址(双字)给ADDR

100H

01

101H

02

102H

03

103H

04

104H

00

105H

01

106H

A2

107H

13

例:

DATASEGMENT

ORG100H

TABLEDB1,2,3,4

ADDRDDTABLE

DATAENDS

假设汇编后DS=13A2H

(如果ADDR用DW定义,只得偏移量)

(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)

<5>LETTERDB‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存

<6>HISDB3DUP(‘WELCOME!

’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!

和回车换行符

4.标号LABEL

格式:

标号名LEBEL类型

标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用

标号有三个属性

段属性

偏移量属性

距离属性(即格式中的类型):

NEAR(近程)和FAR(远程)

NEAR:

本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段

FAR:

本标号为段间标号,调用本标号提供偏移地址和段基址

一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含

如AGAINLABELNEAR

XORAX,BUFF[BX]

可写成AGAIN:

XORAX,BUFF[BX]

例:

ROOTLABELNEAR;以下程序所用的ROOT标号是段内属性

COMPPROCNEAR;以下程序所用的过程下的标号是段内属性

TIMEPROCFAR;以下程序所用的过程下的标号是段间属性

三.运算符

1.算术运算符

+、-、*、/、MOD即加、减、乘、除、除法取余数(如19MOD7=5)

操作数是数字,结果也是数字

存储器地址运算时只有加减,例TAB+2、BETA-5等

2.逻辑运算符

AND、OR、XOR、NOT即与、或、异或、非

操作数是数字,结果也是数字

例:

ANDBX,DATAND0FEH

3.关系算符

EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于

若关系是假结果为0,若关系是真结果为0FFFFH

例:

MOVBX,PADLT3

则PAD的值小于3时,汇编成MOVBX,0FFFFH

否则,汇编成MOVBX,0

4.分析运算符

可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型

5.合成算符

由已存在的存储器操作数生成一个段值与偏移量相同,而类型不同的新的存储器操作数

以下讨论分析算符和合成算符

1.取段基址SEG

它加于一个变量或标号之前,回送段基址,例:

ASSUMECS:

SEGBEGIN;令CS为BEGIN程序段段基址

MOVAX,SEGVARN;将VARN的段基址送AX

2.取偏移量OFFSET

它加于一个变量或标号之前,取其偏移量,例:

MOVBX,OFFSETSUM;将SUM的段内偏移量存入BX

3.取类型码TYPE

它加于一个变量或标号之前,取其类型代码

DBDWDDDQDTNEARFAR

124810-1-2

例:

NG1DB‘A’,‘D’,3

NG2DW88,265

……

MOVAL,TYPENG1;NG1定义字节,AL1

MOVAL,TYPENG2;NG2定义字,AL2

4.取长度LENGTH

它加于一个变量之前,取分配给变量的项数

例:

TABDB150DUP(?

);150项,150字节

FUMDW150DUP(?

);150项,300字节

则,MOVCX,LENGTHTAB;CX150

MOVAX,LENGTHFUM;AX150

·注意:

LENGTH返回的存储区必须用DUP()来定义,否则返回为1

5.取字节数SIZE

它加于一个变量之前,取回变量所占字节总数,有

SIZE=LENGTH*TYPE

由上例,LENGTHTAB=150,TYPETAB=1

LENGTHFUM=150,TYPEFUM=2

可知:

SIZETAB=150

SIZEFUM=300

以上5个叫数值返回算符

6.类型指示PTR

格式:

类型PTR地址表达式

表示PTR右边的(存储器)操作数是左边的类型,有:

BYTE、WORD、DWORD、NEAR、FAR

例:

INCBYTEPTR[BX];将BX指向的单元字节加1

MOVWORDPTR[DI],99;立即数99送DI指向的字中

JMPNEARPTRFOK;以近程方式跳转到FOK(只取FOK偏移地址)

7.指定符THIS(合成算符)

用于定义当前所指单元中的类型

格式:

THIS类型/距离

经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,

例:

FOOBEQUTHISBYTE;下面的字类型变量FOOW在这里指定为字节型FOOB

FOOWDW120DUP(?

定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型

访问FOOB时为字节操作,访问FOOW时为字操作

FOOB/FOOW

FOOB+3

FOOW+4

ADDAL,FOOB[3];将数组第四字节与AL相加

MOVAX,FOOW[4]将数组第五六字节组成的字送AX

也可以这样来构成FOOB:

FOOBEQUBYTEPTRFOOW

又例:

DATAFEQUTHISFAR

DATAN:

MOVAX,FOO

这时JMPDATAN为近程转移

JMPDATAF为远程转移

8.段修改符:

用于对某一地址表达式指定临时段基址,如

MOVAX,ES:

[BX];指定ES为BX的段基址,对当前指令有效

9.短程符SHORT

与NEAR、FAR功能类似,位移量一字节范围-128~+127,对应一条短转移指令

例:

JMPSHORTLAB;转移到标号LAB的地址

10.方括号[]

表示操作数(加方括号)是一个地址偏移量,不是数值

格式:

[表达式]或者[表达式][]

例:

MOV[BX],AX;将AX内容送BX所指单元

MOV[BX+7],AX;将AX内容送BX+7所指单元

MOVAX,[BX][SI];将BX+SI所指单元内容送AX

11.取高/低字节HIGH/LOW

用来分离常量的高/低字节,对存储器操作数无效

例:

DATAEQU789AH

MOVAL,HIGHDATA;AL=78H

MOVAL,LOWDATA;AL=9AH

四.段定义伪指令

1.SEGMENT—ENDS

格式:

[段名]SEGMENT[定位类型][组合类型][‘类别名’]

[段名]ENDS

·段名

·定位类型(Align),给出实际段地点的种类或段长度的信息

<1>PARA段起始地址从一个节(paragraph)的边界开始

<2>BYTE段地址可从任意绝对地址开始

<3>WORD段地址从任意一个字的边界开始

<4>PAGE段地址从某一页的边界开始(一页等于256字节)

<5>INPAG段长度小于一页

·组合类型(Combine),又称联合类型,程序中各程序段的连接和定位方法

<1>PUBLIC将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖

<2>COMMON将段名相同的程序段连接,各段都从同一地址开始

<3>AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上

例:

AT1234H,则段地址被定位在物理地址为12340H处,如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG5

AT不能向前引用

<4>STACK表示这个段是运行期间的堆栈段

<5>MEMORY该段是相互连接的几个段中地址最高的段

若没有说明联合类型,则本段与其他段无关,即NONE,不和别的段连接

·‘类别名’(Class),也叫组名,加单引号,汇编后类别名相同的程序段代码集中在一起定位,形成一个统一的物理段,类别名可自定,约定的有CODE(代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等

2.ASSUME

段寄存器说明伪指令,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现

格式:

ASSUME段寄存器:

段名[,…]

例:

ASSUMECS:

CODE,DS:

DATA;

用SEGMENT—ENDS定义

ASSUMECS:

SEGKGF,DS:

SEGBEGIN;由算符定义

ASSUMEES:

NOTHING;用关键字定义,表示不使用ES(取消ES段寄存器)

(保留字NOTHING在这里作为一个段名参数,ASSUMENOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值)

·ASSUME只是设定段寄存器与逻辑段的对应关系,并没给段寄存器装入实际值,所以程序中必须对DS、ES、SS赋值,而CS由系统赋值

3.ORG

定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址

格式:

ORG表达式

表达式以65536(64K)为模计算,超过64K则取其余数

本语句前未定义过的变量不可出现在表达式中,

表达式可包含$(程序计数器当前值)如:

ORGOFFSET$+1000

表达式必须为正值,若为负值,就会从当前段的地址高端开始

表达式最好不要写成OFFSET$-1000,以免把汇编过的1000个字节覆盖掉

ORG指令不能带标识符,如START:

ORG0和SKIPORG100都是错的

例:

CODESEGMENT;段起始

ORG100H;本程序代码从偏移地址100H开始装入

ASSUMECS:

CODE;装入代码段地址到CS中

START:

INAL,30H;程序段

SHLAL,1

OUT32H,AL

JMPSTART

CODEENDS;程序段结束

ENDSTART;汇编结束

50H

01

51H

00

52H

02

53H

00

54H

55

55H

00

例:

DATASEGMENT

ORG50H

DATDW1,2,$+1

DATAENDS

注意DAT不能定义为字节,否则与$不匹配

五.过程定义伪指令

格式:

过程名PROC属性

┇过程体

RET

过程名ENDP

·过程名不可缺省,它和标号一样有三个属性:

段属性、偏移地址属性、距离属性

·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性

·一个过程允许多个入口,入口处有标号,标号要说明距离属性

例:

延时100ms子程序

DELAYPROC;隐含NEAR

MOVBL,104T

DLY1:

MOVCX,2801;内循环延时10ms10T

WAIT0:

LOOPWAIT09/5T

DECBL2T

JNZDLY18/4T

RET8T

DELAYENDP

六.结束伪指令

·NAME:

给模块(源程序)命名

格式:

NAME模块名称

它出现在源程序的最前端

·END:

汇编结束

格式:

END[标号名]

它通知汇编程序本模块汇编到此结束

标号名是可选项,若选取,应指向执行本程序的起始地址

若一个源程序是多模块,只有主模块的END后加标号,子模块只有END

七.宏指令

宏指令:

在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用

宏汇编:

源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码

宏指令用MACRO—ENDM来定义,如:

CRLFMACRO

MOVDL,0DH

MOVAH,02H

INT21H

ENDM

(CRLF作回车换行)

§4.3汇编语言程序设计(assemblylanguageprogramming)

一.设计要求

1.程序简明、易读、易调试、易修改

2.程序占用内存要少(包括程序长度及运行时所需空间)

3.程序运行速度要快

二.基本设计方法

1.选择合适的计算方法

2.绘制程序流程图

3.编制程序

4.上机调试

三.汇编语言程序格式和基本结构

一般一个完整的汇编语言程序至少应包括以下三个程序段

简化段格式:

.MODELSMALL

.STACK64H

.DATA

……;紧接指令代码从偶地址开始存放

.CODE

START:

MOVAX,@DATA

MOVDS,AX

……

ENDSTART

DATASEGMENT‘DATA’

┇数据段

DATAENDS

STACKSEGMENT‘STACK’

┇堆栈段

STACKENDS

CODESEGMENT‘CODE’

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

MOVAX,STACK

MOVSS,AX

┇代码段

CODEENDS

ENDSTART

程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构

(一)顺序结构

一种简单程序,按顺序执行

例1.将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0

200H

X

X

201H

0

202H

0

DATASEGMENT

ORG200H

BCDDB47H

DB2DUP(?

DATAENDS

STACKSEGMENT

STADB20DUP(?

TOPEQULENGTHSTA

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

MOVAX,STACK

MOVSS,AX

MOVAX,TOP

MOVSP,AX

MOVBX,OFFSETBCD

MOVAL,[BX]

ANDAL,0FH

MOV[BX+1],AL

MOVAL,[BX]

MOVCL,4

ROLAL,CL

ANDAL,0FH

MOV[BX+2],AL

HLT

CODEENDS

ENDSTART

例2.将ADDR1和ADDR2两单元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中

DATASEGMNET

ADDR1DW7854H

ADDR2DW9981H

SUMDB3DUP(0)

DATAENDS

SATCKSEGMENT

STADB20DUP(?

TOPEQULENGTHSTA

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

MOVAX,STACK

MOVSS,AX

MOVAX,TOP

MOVSP,AX

MOVAX,ADDR1

ADDAX,ADDR2

MOVWORDPTRSUM,AX

ADCSUM+2,0

HLT

CODEENDS

ENDSTART

例3.查表将DATA1单元中字节类型数据(0~0FH)转换成ASCII码,并存入ASCII单元中

DATASEGMENT

ASCTABDB30H,31H,32H,33H,34H,35H,36H,37H

DB38H,39H,41H,42H,43H,44H,45H,46H

DATA1DB09H

ASCIIDB?

DATAENDS

STACKSEGMENTSTACK

DW10DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

STARTPROCFAR

ASCTAB

30

0

31

1

39

9

41

A

42

B

46

F

ASCII

PUSHDS

MOVAX,0

PUSHA

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2