微机原教案第四章OK.docx
- 文档编号:5664204
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:32
- 大小:101.42KB
微机原教案第四章OK.docx
《微机原教案第四章OK.docx》由会员分享,可在线阅读,更多相关《微机原教案第四章OK.docx(32页珍藏版)》请在冰豆网上搜索。
微机原教案第四章OK
第四章汇编语言程序设计
基本内容:
汇编语言与高级语言的区别,汇编语言的作用,汇编语言的语句结构(标记、表达式、语句格式),汇编中的常用伪指令;汇编语言的上机过程。
基本要求:
了解汇编语言与高级语言的区别,理解汇编语言的作用,掌握汇编语言中的常数、表达式、标号、变量及常用伪指令的格式与用法,熟悉汇编语言的上机过程。
重点内容:
汇编语言中的常数、表达式、标号、变量及常用伪指令,语句行构成,汇编语言的上机过程。
难点:
常用伪指令的用途及格式。
第一节汇编语言的语句行构成及常用伪指令
汇编语言是助记符编写的符号语言,每个语句行一般可由四部分构成
[标号名字]操作码[操作数];[注释]
名字项是一符号;操作数项是一个操作码的助记符,可以是指令,伪指令,宏指令。
各操作数项是一个或多个表达式组成提供为执行所需要的操作数而需要的信息;注释项用来说明程序和语句的功能,常用来帮助阅读程序,可以是指令末尾,也可以是行开头,但必以“;”号表明。
以上四项中括号部分可有可无,各项之间必须用空格(一个或多个隔开)
一、汇编语言的语句行构成
(一)标记
常用的标记有标识符,保留字,界符,常数和注释。
1、标识符
为便于理解,书写所使用的字符串,作为一段程序的开头,一个数据块开头。
标识符可以是字母,数字或专用字符,?
.@-$,但不能以数字开头,如用到,则必须是第一个字符可以用很多字符来说明,但汇编程序只识别前31个。
一般用做标号和变量名。
A.标号:
定义在代码段中,后面跟冒号,代表本语句得到符号地址,如NEXT:
MOVAL,5也可以做子程序名称,不跟冒号,如SENDPROCNEAR。
B.变量:
定义在代码段外的其他段中,后面不跟冒号,如SUMDW0实际上也是本变量的符号地址。
2、保留字
汇编语言中预先保留的有特殊意义的符号,如指令,伪指令寄存器等,不可以用做标号或变量名。
3、常数
如立即数,直接地址
十进制数后加D或不加,二进制加B,16进制加H,8进制加Q。
4、注释
便于理解和阅读程序,前用分号。
(二)表达式
由操作数和运算式组成,一个或多个表达式组成指令中的操作数项,操作数可能是数据,也可以是存储单元的地址。
运算符包括:
算术运算符+、-、*、/、MOD(取余)如:
19/7=219MOD7=5
逻辑运算符AND、OR、NOT、XOR
关系运算符EQNELEGELTGT表达式成立返回FFFFH
如MOVAX,PORTLT5
若LT<5则等价于MOVAX,0FFFH否则等价于MOVAX,0
其它运算符
OFFSET取地址的偏移量如MOVDX,OFFSETSUM
SEG取存储单元的段地址MOVDX,SEGSUM
二、汇编语言的语句形式
汇编语言中,有两种语句:
指令性语句和指示性语句。
指令性在汇编后产生指令代码,在程序运行时由计算机执行。
指示性指令又称伪指令,不产生代码指令,计算机不执行,只是在汇编期间给汇编程序提供某些信息,如完成数据定义,分配存储区,指示程序结束等功能。
1)指令性语句格式
[格式]:
[前缀]指令操作码[指令操作数];注释
[]内可有可无。
标号代表本条指令所在存储区的地址,如JMPNEXT。
前缀:
某些指令常与前缀配合使用,如REPMOVSB。
操作码:
必须部分告诉CPU本条指令应进行的操作。
操作数:
为指令执行提供所需的数据,可以是操作数本身,也可以是其存放地址,由寻址方式决定,操作数可以是1个,2个,或没有。
注释:
必须以“;”开头,说明本条指令或本段指令的功能。
2)指示性语句格式
[名字]伪指令操作码[操作数][;注释]
名字后不跟冒号,用于定义的变量名、过程名、常量名等。
三、汇编语言中的常用伪指令
1)数据定义与存储器分配伪指令
常用的有:
DB定义字节,其后的每一个操作数都占一个
字节;
DW定义一个字,其后的每一个操作数都占一个字(低位字节在低地址,高在高);
DD定义一个双字,其后的每一个操作数都占4个
字节;
DQ定义一个4字,其后的每一个操作数都占4个
字空间;
例:
DATA1DB10,4
DATA2DW100
DATA3DD3*20,OFFCDH
源程序汇编时,将数据写入存储器。
另:
操作数也可以是字符串,如“HELLO”
可以是“?
”——保存存储空间,但不写入数据,
还可以用DUP重复操作符,
如NDUP(D)——数D重复N次;
例:
MES3DB“HELLO”
DATA1DB0,?
,5,?
DATA2DB3DUP(10),2DUP(1,2)如图右所示
2)表达式赋值伪指令EQU
程序中,常有1个常量/表达式使用频繁的情况,可用EQU语句给其赋一个名字,在程序中直接用这个名字,需要更改时,只须在此语句中更改即可,不须一一更改。
格式;符号名EQU表达式
例:
P8EQU256
IEQU7*WEIGHT
●EQU语句中如果有变量式标号的表达式,则在该语句前先定义,否则
出错。
另;表达式赋值也可以用“=”。
例:
P8=256
区别:
EQU赋值后(相当于定义一个常量),不可以改值,
而等号赋值后(相当于定义一个变量),则可以重新定义其值。
3)段定义伪操作
格式:
段名SEGMENT
-----
段名ENDS
成对使用,定义一个段,但并未指明定义的段作什么段使用,必须用ASSUME来分配。
格式;ASSUME段寄存器名:
段名,段寄存器名:
段名---
例:
D1SEGMENT
---
D1ENDS
D2SEGMENT
---
D2ENDS
D3SEGMENT
---
D3ENDS
ASSUMECS:
D2,DS:
D1,ES:
D3
说明:
D2段做代码段,D1为数据段,D3为附加数据段;
ASSUME指令必须放于代码段中,否则出错。
上述操作只是定义了段并将各段分配使用,但是并没有将段地址装入相应的段寄存器,必须在程序中将段地址装入段寄存器,指令如下;
D1SEGMENT
XDB5
D1ENDS
DESEGMENT
ASSUMECS:
DE,DS:
D1;必须在代码段中
MOVAX,D1
MOVDS,AX
MOVAX,DE;不需要,程序初始化时自动完成,但其它段必须有
MOVCS,AX
---
DEENDS
程序中常用ORG指令来规定段的起始地址。
例:
DATA1SEGMENT
---
DATA1ENDS
ORG0100H
DATA2SEGMENT
---
DATA2ENDS
则DATA1从0000H开始,DATA2从0100H开始。
4)程序结束伪操作END
格式:
END[标号]
表示程序结束。
汇编程序遇到END语句时,结束汇编,后面的语句将被忽略。
标号指向第一条指令,如果用多个模块连接,则只在主程序中用标号,子模块中只用END。
例:
试编程序求数OPR1与OPR2之和的绝对值,结果保存在RESULT单元。
DATASEGMENT
OPR1DW?
OPR2DW?
RESULTDW?
DATAENDS
STACKSEGMENT
BUFDW50DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
ORG200H
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,OPR1
ADDAX,OPR2
JGESTORE
NEGAX
STORE:
MOVRESULT,AX
RET
CODEENDS
ENDSTART
5)子程序定义伪指令
格式:
程序名PROCFAR/NEAR
---
RET
程序名ENDP
子程序中,最后一条指令一般是RET指令,返回主程序;
若无属性,则默认为NEAR属性。
第二节汇编语言程序的上机过程
一、汇编程序的作用
编辑程序——*.ASM——汇编程序——*.OBJ——连接程序——*.EXE
源程序目标文件可执行文件
汇编语言是助记符,标号,符号等符号语言,写成源文件后,不能由CPU执行,必须经过汇编程序翻译成机器语言,生成二进制代码文件*.OBJ,汇编过程中,汇编程序可指出源程序中的错误。
*.OBJ是二进制文件,也不能直接运行,必须经过连接,将目标文件与库文件,其他目标文件连接文件生成可执行文件*.EXE。
二,上机过程
由上述流程可知,为运行汇编语言程序至少需要下列文件:
QE.COM/EDIT.COM/EDLIN.COM……用于编辑源程序,也可以在WINDOWS下的TEXT。
TC必须以.ASM后缀。
ASM.EXE或MASM.EXE………………汇编程序ASM.EXE不支持宏汇编,
LINK.EXE………………………………连接程序.
另外,可有以下辅助程序:
DEBUG.COM……………………………调试工具
EXEZBIN.EXE…………………………将EXE文件转换为.COM文件,也是一种可执行文件.(详情不讲).
步骤:
1)建立源文件
用各种文本编辑软件编写源文件,但必须用*.ASM为后缀,不能是WORD等格式。
2)用ASM或(MASM.EXE)产生目标文件.
例:
C:
>ASMMY.ASM回车
则显示以下内容:
版本号(略)
OBJECTFILENAME[MY.OBJ]——目标文件名,必须有,可回车生成MY。
OBJ或输入新的目标文件名后回车。
SOURCELISTING[NUL.LST]——LST文件即列表文件,列出源程序与目标机器语言清单,给出符号表,可有可无,不要则回车确认.
CROSSREFERENCE[NUL.CRF]用于产生交叉引用表;一般不要可回车跳过.
WARRINGERRORS---警告错误
SEVEREERRORS----严重错误;一般在其后给出错误行号与错误类型.
3)用LINK文件产生*.EXE文件
C:
>LINKMY.OBJ
版本号
RUNFILE[MY.EXE]:
——可执行文件名可回车默认MY.EXE也可以回车.
LBTFILE[NUL.MAP]:
——列表文件,给出每个段在存储器中的分配情况,不要则回车
LIBRARIES[.LIB]:
——程序运行所须的库文件,一般没有,回车跳过.
WARNING:
NOSTACKSEGMENT:
——程序中如无定义堆栈段,会出现此情况,不影响程序运行.
THEREWASNERRORSDETECTED:
连接时发现N个错误.
4)程序执行
C:
>MY回车
注:
①第二步,第三步时可直接在文件名后加”;”.以默认以下各项,不用一一回车。
②若第二步有错误,应不执行第二步,而是先修改源程序.
③执行程序时不要输入.EXE等后缀.
第三节DOS系统功能及BIOS功能调用
基本内容:
DOS功能调用使用方法;DOS的键盘输入(1#,8#调用);字符串输入(10#9#调用);常用BIOS调用.
重点内容:
DOS调用的1、2、8、9、10#调用,从键盘接收字符并处理。
基本要求:
掌握常用的DOS功能调用如1号、2号、9号、10号的使用方法;会使用DOS功能调用来进行输入、输出程序设计。
难点内容:
9号、10号功能的缓冲区设置;字符的存放和处理。
系统功能调用是DOS为用户提供的一组子程序模块,用INT21H进入,用不同的功能号进入各子程序,方法如下:
1)在AH寄存器中设定所需调用的功能号。
2)根据功能的规定设定入口参数。
3)用INT21H进入子程序。
4)根据规定,从相应的寄存器取得返回值。
常用的几个DOS调用如下:
功能号(AH)
功能
调用参数
返回参数
01
键盘输入并回显
AL=输入字符
02
显示输出
DL=输出字符
08
键盘输入,无回显
AL=输入字符
09
显示字符串
DS:
DX=串地址
“$”结束字符串
0A
键盘输入字符串到缓冲区
DS:
DX=缓冲区首地
DS:
DX=缓冲区最大字符数
DS:
DX+1=实际输入字符数
1、1号调用
等待从键盘输入一个字符,如果是数字、字母则在屏幕显示,并将其对应字符的ASCII码送AL。
例:
MOVAH,1
INT21H;若键入A,则屏幕显示A,AL中内容为41H
2、2号调用
将DL中内容对应的字符显示在屏幕上。
如:
MOVAH,2
MOVDL,‘A’
INT21H;则屏幕显示A。
3、8号调用:
类似1号调用,但屏幕不显示。
4、9号调用
显示多个字符到屏幕,即字符串。
要求:
串的段地址在DS,偏移地址在DX,字符串必须以$结尾.
例:
MESSAGDB‘HOWDOYOUDO!
’,13,10,’$’
MOVAH,9
MOVDX,SEGMESSAG
MOVDS,DX
MOVDX,OFFSETMESSAG
INT21H
5、10号调用
从键盘接收一串字符存入用户定义好的缓冲区中
要求:
定义的缓冲区第一字节为保存最大字符数(用户写入,实际输入大于此数时)发“嘟”声光标止,第二字节为实际输入的字符个数,系统添入字符串从第三个字节开始存入,最后的回车符也占一个字节
例:
向指定的存储单元送10个字符,并将其显示出来
DATASEGMENT
BUFDB12
DB0
DB12DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA;BUF的段地址已在DS
MOVDS,AXMOVAH.,OFFSETBUF;偏移地址送DS
MOVAH,OAH
INT21H
LEADX,BUF+1
MOVBX,DX
MOVAL,[BX];输入的字符数送入AL
MOVAH,0
ADDBX,AX;BX值+送入字符数
INCBX;BX+1指向串尾
MOVAL,’$’
MOV[BX],AL;添加串结束标志
MOVAH,9
INCDX;DX指向串首
INT21H;显示字符串
RET
MAINENDP
CODEENDS
ENDSTART
例2:
将CL中的低四位在屏幕上显示出来.
分析:
CL中的低四位可能为0—9,A—F,而屏显时要用其ASCII码,只要将其值转化为ASCII码后即可用DOS的2#功能将其显示,
方法:
建立一个对应的ASCII码表格。
DATASEGMENT
TABLEDB‘0’,‘9’,‘A’,‘B’,---‘E’,‘F’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
ANDCL,0FH
MOVBX,OFFSETTABLE
MOVCH,0
ADDBX,CL
MOVAL,[BX]
MOVAH,2
INT21H
RET
MAINENDP
CODEENDS
ENDSTART
例:
将CL中内容在屏幕上显示出来。
要求:
学生根据上例,自己动手编程,并找同学解释!
有关BIOS调用不讲,学生课余参考清大版《IBM-PC-设计》沈美明等编。
作业:
1、2
第四节循环程序设计
一、程序设计的一般步骤
⑴分析题意,确定算法。
恰当的算法及适当的数据结构可以使程序简洁易读、执行效率高,是编制高质量程序的关键。
⑵画出程序流程图
减少出错,思路清晰。
⑶根据流程图编制程序。
⑷上机调试。
二、循环程序设计的基本形式
一般情况下,循环程序设计有两种形式:
⑴DO_WHILE结构
控制条件在循环程序的入口,先判断入口条件,满足则执行循环体,不满足条件则退出循环。
N
Y
N
Y
DO_WHILE结构DO_UNTILL语句结构
⑵DO_UNTILL语句结构
先执行一次循环体,再判断控制条件。
如:
LOOP循环
三、实例分析
例一:
试编制程序把BX寄存器内的二进制以十六进制形式在屏幕上显示出来。
分析:
1、二进制到十六进制显示必须转换成ASCII码,即0—9、41H—46H
2、BX寄存器为16位,共有4组4位二进制位,可用一个循环次数为4的循环逐一显示。
3、取出四位二进制位可以用循环左移指令,再将高四位与0FH相与。
程序清单:
CODESEGMENT;定义代码段,无需其他段
ASSUMECS:
CODE;段分配
MAINPORCFAR;定义主程序
START:
PUSHDS
MOVAX,0
PUSHAX
MOVCH,4;循环次数为4
LOOP1:
MOVCL,4
ROLBX,CL;BX循环左移四位
MOVAL,BL
ANDAL,0FH;取其低四位
ADDAL,30H;转换为ASCII码
CMPAL,3AH
JLDISP;若小于10,转换完毕
ADDAL,7;若大于10,需转换到A—F
DISP:
MOVDL,AL
MOVAH,2
INT21H;显示
DECCH;循环次数减一
JNZLOOP1;循环完成否?
否,则继续循环
RET;完成则退出
MAINENDP
CODEENDSY
ENDSTART
例二、设有数组X与Y,分别有X1~X10与Y1~Y10个元素,试编程计算
结果存放到Z数组。
分析:
可以用循环实现,循环次数为10,先算出
再算出
,但是应该注意:
循环体内部有两种操作,应该加以判断。
判断方法:
设定一个逻辑尺,给定每一步骤要进行的操作。
如0011011100其中0表示执行加法,1表示执行减法。
(重点掌握此方法技巧)
因为有数组的定义,所以此程序中应定义数据段。
程序清单:
DATASEGMENT
XDBX1,X2,X3,X4,X5,X6,X7,X8,X9,X10
YDBY1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10
ZDW10DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MIANPROCFAR
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVBX,0
MOVCX,10
MOVDX,0000000011011100B
NEXT:
MOVAX,Y[BX]
SHRDX,1
JCSUBXY
ADDAX,Y[BX]
JMPOK
SUBXY:
SUBAX,Y[BX]
OK:
MOVZ[BX],AX
ADDBX,2
LOOPNEXT
RET
MAINENDP
CODEENDS
ENDSTART
很多情况下,循环体中也嵌套有循环,此时应注意从外层循环再次进入内层循环时,一定要注意重新设定内层循环条件。
例三、分析下列程序段,指出此程序段的功能是什么?
执行结果是什么?
MOVAX,1000H
MOVDS,AX;DS=1000H
MOVSI,2000H
MOVCX,100
MOVAL,[SI];将[DS*16d+SI]给AL
LP:
CMPAL,[SI+1];[12000H]与[12001H]比较
JGENEXT;大于则与下一个比较
MOVAL,[SI+1];小于则将[12001]存入AL
NEXT:
INCSI
LOOPLP
MOVMIN,AL
MOVAX,4C00H
INT21H
结果:
MIN单元存放100个字节中的最大数。
功能:
从12000H开始的单元的100个字节中找出最大数存放到MIN单元。
例五、编程将从S1单元开始的连续存放的8字节数与从S2开始连续存放的8字节数相减,结果存放到S1开始的单元中(低位在前,高位在后)。
分析:
S1、S2分别为8字节数,目的是球差,多位数相减时应考虑借位。
S1第7字节第6字节第5字节……第1字节第0字节
+S2第7字节第6字节第5字节……第1字节第0字节
S1第7字节第6字节第5字节……第1字节第0字节
程序清单:
DATASEGMENT
S1DB8DUP(?
)
S2DB8DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,8
LEASI,S1
LEABX,S2
NEXT:
MOVAL,[SI]
SBBAL,[BX]
MOV[SI],AL
INCSI
INCBX
LOOPNEXT
RET
MAINENDP
CODEENDS
ENDSTART
第五节分支程序设计
在程序设计中,往往要根据不同的情况来选取某一种操作,一般的,分支结构有IF_THEN_ELSE和CASE两种形式。
YN
IF_THEN_ELSECASE
第一种适用于2分支结构,第二种适用于多分支结构。
一般用条件转移指令来实现分支程序设计。
例一、编程求函数
X由XX单元给出,Y由存放到YY单元。
程序清单:
DATASEGMENT
XXDB10
YYDB?
DATAENDS
CODESEGMENT
ASSUMECD:
CODE,DS:
DATA
MAINPROCFARN
START:
PUSHDS
MOVAX,0Y
PUSHAX
MOVAX,DATAY
MOVDS,AXN
MOVAX,XX
CMPAL,0
JGEBIGER
MOVAL,0FFH
JMPOK
BIGER:
JE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 教案 第四 OK