微机原理-第4章汇编语言程序设计.ppt

上传人:小飞机 文档编号:6284412 上传时间:2023-10-13 格式:PPT 页数:68 大小:1,005KB
返回 下载 相关 举报
微机原理-第4章汇编语言程序设计.ppt_第1页
第1页 / 共68页
微机原理-第4章汇编语言程序设计.ppt_第2页
第2页 / 共68页
微机原理-第4章汇编语言程序设计.ppt_第3页
第3页 / 共68页
微机原理-第4章汇编语言程序设计.ppt_第4页
第4页 / 共68页
微机原理-第4章汇编语言程序设计.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《微机原理-第4章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《微机原理-第4章汇编语言程序设计.ppt(68页珍藏版)》请在三一办公上搜索。

1、1,第4章汇编语言程序设计,本 章 重 点汇编语言源程序的基本语法常用的指示性语句基本的DOS功能调用基本的程序设计,2,本 章 内 容,4.1 汇编语言的格式4.2 语句行的构成4.3 指示性语句4.4 指令语句4.5 汇编语言程序设计及举例,3,4.1.1 8086汇编语言程序的一个例子(P90),MY_DATA SEGMENT;定义数据段SUM DB?;为符号SUM保留一个字节MY_DATA ENDS;定义数据段结束MY_CODE SEGMENT;定义码段 ASSUME CS:MY_CODE,;规定CS和DS的内容 DS:MY_DATAPORT_VAL EQU 3;端口的符号名GO:MO

2、V AX,MY_DATA;DS初始化为MY_DATA MOV DS,AX MOV SUM,0;清SUM单元CYCLE:CMP SUM,100;SUM单元与100相比较 JNA NOT_DONE;若未超过,转至NOT_DONE MOV AL,SUM;若超过,把SUM单元的内容 OUT PORT_VAL,AL;通过AL输出 HLT;然后停机NOT DONE:IN AL,PORT_VAL;未超过时,输入下一个字节 ADD SUM,AL;与以前的结果累加 JMP CYCLE;转至CYCLEMY_CODE ENDS;码段结束 END GO;整个程序结束,4,8086的汇编语言的源程序是分段的,由若干个段

3、形成一个源程序。源程序的一般格式为:NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END标号(第一条可执行指令),5,4.1.汇编语言的格式,汇编语言源程序的结构,数据段,6,二.段与过程的定义,1.段的定义,2.过程(子程序)的定义,过程定义设计具有一定功能的程序段,或称为子程序。,段内过程的定义:过程名 PROC NEAR,段交叉过程的定义:过程名 PROC FAR,7,标号:前缀 操作码 操作数,操作数;注释名字 伪操作操作数,操作数;注释空格作为间隔,由以上实例可知,每一语句行由4部分组成:,4.2 语句行的

4、构成,指令性语句是计算机可执行的,指示性语句(伪指令)不能执行,用来定义变量,分配存储单元,指示程序开始和结束等,这两种语句的差别:在形式上:带不带冒号,是否可转向它.在本质上:汇编时能否形成对应的机器码.,8,标号:前缀 操作码;注释名字 伪操作操作数,操作数;注释操作数,操作数 标号和名字(标识符)的规定:英文字母、数字及专用字符最大长度不能超过 31 个且不能由数字打头不能用保留字(如寄存器名,指令助记符,伪指令)(P93),由以上实例可知,每一语句行由4部分组成:,4.2 语句行的构成,操作数,操作数,9,(2)字符串常量 用单引号括起来的字符或字符串 汇编时被翻译成对应的ASCII码

5、,数据项操作数包括常量、变量、标号及表达式,1.常量(1)数字常量 二进制常量 以B结尾 十进制常量 以D结尾或省略 八进制常量 以字母Q(或字母O)结尾 十六进制常量 以H结尾,10,变量是内存中的数据区在程序中作为存储器操作数来使用变量有三种属性段 值变量所在段的首地址偏移量变量单元地址与段首地址之间的位移量类 型字节、字和双字,2.变量,11,标号是指令所存放单元的符号地址,可作为转移指令或CALL指令的转移地址。标号也有三种属性:段值总是在CS段寄存器中,偏移量概念与变量同,类型分NEAR和FAR两种。若没有对类型进行说明,默认为NEAR。,3.标号,12,4.表达式,(1)算术运算符

6、+、-、*、/,以及MOD 例 MOV AL,2*7 LEA SI,SUM+3(2)逻辑运算符AND、OR、XOR和NOT 例 MOV CL,36H AND 0FH注意:逻辑运算符也是8086/8088的指令助记符运算符在汇编时进行指令在执行时进行,13,(3)关系运算符EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)关系为真,结果为0FFFFH关系为假,结果为0例:MOV BX,PORT_VAL GE 5,14,(4)取值运算符和属性运算符(P103)取值运算符获得存储器操作数的属性OFFSET获得标号或变量的偏移地址SEG获得标号或变量的段地址

7、例:MOV SI,OFFSET STRI1与 LEA SI,STRI1 类似属性运算符PTR指定操作数的类型例:MOV AL,BYTE PTR VAR,15,(5)其它运算符1)方括号“”表示存储器操作数,方括号里的内容表示操作数的偏移地址。,(2)段超越运算符“:”“:”跟在某个段寄存器名之后表示段超越用来指定一个存储器操作数的段属性,而不管其原来隐含的段是什么。,16,4.3 指示性语句(伪指令),常用的伪指令有:符号定义伪指令数据定义伪指令段定义伪指令过程定义伪指令宏定义伪指令结束语句,17,4.3.1 符号定义语句(P99),1.等值伪指令EQU格式:符号名EQU表达式 或:新符号名

8、EQU 老符号名例:CONSTANTEQU100NEW_PORTEQUPORT_VAL+1注意:EQU伪指令在未解除前,不能重新定义。2.解除伪指令PURGE例:PURGENEW_PORT NEW_PORTEQUPOTR_VAL+8,18,3.等号(=)伪指令与EQU类似,但允许重新定义例:EMP=7;值为7EMP=EMP+1;值为8,19,4.3.2 数据定义伪指令,格式:变量名 伪指令 操作数;注释其中变量名用符号地址表示,后面不能跟冒号伪指令助记符 DB用来定义字节DW用来定义字DD用来定义双字例1:DATA_BYTE DB 10,5,10H DATA_WORD DW 100H,100,

9、-4 DATA_DW DD 2*30,0FFFBH,20,汇编后:,DATA_BYTE,DATA_DW,DATA_WORD,10,5,10H,100H,100,-4,60,0FFFBH,DATA_BYTE DB 10,5,10HDATA_WORD DW 100H,100,-4DATA_DW DD 2*30,0FFFBH,21,例2:操作数可以是字符串STR DBHELLO,STR,H,E,L,L,O,22,?操作数用来保留存储空间,但不存入数据.例3:ABCDB0,1,?,?,?LPIDW?,54,?汇编后:,数据定义中的三个特殊符号:?,DUP,$,23,复制操作符DUP(P101)例4:A

10、BC DB 0,1,3 DUP(?)例5:DO-2 DB 2 DUP(0,1,2,?)与 DO-2 DB0,1,2,?,0,1,2,?等价$:表示的是地址计数器的当前值 例:BUFFER DW 3,4,$+3 设BUFFER的偏移地址为0088H,则汇编后$+3的值为多少,24,例:BUFFER DW 3,4,$+3设BUFFER的偏移地址为0088H,则汇编后如下图所示:,25,例:分析下面申请数据区的存储内容,NUM DB 75H;申请一字节,数为“75H”,ARRY DW 20H DUP(0);申请20H个字,数均为“0”,ADR1 DW NUM;申请一字,预置NUM的偏移地址,ADR2

11、 DD NUM;申请双字,预置NUM的逻辑地址,ADR3 DW ARRY+2;申请一字,预置ARRY的偏移地址加2,设:NUM的段地址为0915H,NUM的偏移地址为0004H。,75,DS:NUM,DS:ARRY,DS:ADR1,DS:ADR2,DS:ADR3,40H 个单元,0400,04001509,0700,0915:0004,0915:0005,0915:0045,0915:0047,0915:004B,0915:0000,26,分析运算符(P.103,也称为数值返回运算符)在源程序中,只对存储器进行操作,读取存储器的属性。,(1)SEG 运算符求取某存储器单元的段地址。例:MOV

12、AX,SEG NUM,(2)OFFSET 运算符 求取某存储器单元的偏移地址。例:MOV AX,OFFSET NUM,(3)TYPE 运算符求取某存储器单元的类型属性。例:MOV BL,TYPE NUM,属性类型,属性值,变量,字节 01H,字 02H,双字 04H,四字 08H,十字 0AH,27,举例:,28,(4)LENGTH 运算符求某存储器/存储器数组的长度(P104)LENGTH运算符返回一个与存储器地址操作数相联系的单元数(所定义的基本单元的个数)。注意:要用LENGTH返回的存储区必须用DUP()来定义,否则返回值为1。分析运算符SIZE返回一个为存储器地址操作数所分配的字节数

13、。一般来说,若一个存储单元操作数X,则 size X=(length X)(type X),(5)SIZE 运算符求某存储器/存储器数组的长度。,29,30,合成运算符,(1)PTR运算符(P.104)格式:类型 PTR 变量/标号/存储器,变量/存储器,类型,标号,BYTE(字节)WORD(字)DWORD(双字),NEAR(短调用)FAR(长调用),PTR举例,NUM1 DB 20H DUP(?)NUM2 DW 10H DUP(0),MOV AX,WORD PTR NUM1 MOV BYTE PTR NUM2,BL,临时修改操作数的属性,并不分配存储器,31,(2)THIS属性运算符伪指令(

14、P106),为当前存储单元定义一指定变量的类型,并不分配存储空间段地址和段内偏移是汇编时的当前值,格式:变量/标号 EQU THIS 类型,例:WBUFFER1 EQU THIS WORD BUFFER1 DB 100 DUP(0),字节操作采用BUFFER1,字操作采用WBBUFFER1,合成运算符,32,4.3.3 段定义语句(P106),因8086/8088 CPU的存储器是分段的,这就需要有段定义语句。与段有关的伪指令有:SEGMENT、ENDS、ASSUME 段定义伪指令的格式如下:段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS例:MY_SEG SEGMENT PAR

15、A AT 1A2BH,33,段定位(P109),表示对逻辑段起始边界的选择,可为:PAGE 段从一个页边界开始(XXX00H,256Bytes/Page)PARA段节边界16倍数地址开始(XXXX0H)DWORD段从一个4倍数地址开始WORD 段从一个偶地址开始BYTE 段可以从任意单元开始完整段定义伪指令的默认定位属性是PARAMY_SEG SEGMENT PARA AT 1A2BH段的起始边界为16倍数地址开始,段地址为1A2BH,34,成对出现前面的段名一致二者之间的部分对数据段、附加段及堆栈段,一般是符号、变量定义等伪指令。对于代码段则是指令及伪指令。段和段寄存器的关系,可由ASSUM

16、E语句来实现,SEGMENT 和 ENDS,35,设定段寄存器伪指令ASSUME,ASSUME 段寄存器名:段名,段寄存器名:段名,.,ASSUME 伪指令应放在可执行程序开始位置的前面,36,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。将段基址装入段寄存器 MOVAX,DATA MOVDS,AX MOVES,AX 注意:代码段不需要用户装,由初始化程序装入,由程序员把段地址装入段寄存器(称为段初始化),37,例:,CODESEGMENT ASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATA/段初始化 MO

17、V DS,AXMOV ES,AXLEA SI,SUM CODE ENDS END START,38,ORG(origin),规定了段内的起始地址。一般格式:ORG表达式此语句指定了段内在它以后的程序或数据块存放的起始地址,即以语句中的表达式的值作为起始地址,连续存放,除非遇到一个新的ORG语句MY_SEG SEGMENT AT 1A2BHORG 0003H;/段内从偏移量0003H开始MY_SEG ENDS,伪指令ORG(origin),39,4.3.4 过程定义伪指令(P112),格式:过程名 PROCNEAR或 过程名PROC FAR RET;过程返回 过程名ENDP;过程结束调用一个过程

18、的格式为:CALL 过程名,过程是程序的一部分,它们可被程序调用。每次可以调用一个过程。当过程中的指令执行完后,控制返回调用它的地方。,40,4.5.7 宏命令伪指令(P136),用宏指令名来代替一个程序段,格式:宏命令名 MACRO 形式参数,.(宏定义体)ENDM,41,例4-6 两个数之和的宏定义和宏调用。宏定义为:DADD MACRO X,Y,ZMOV AX,XADD AX,YMOV Z,AXENDM,X、Y、Z是形式参数。调用宏DADD:,DADD DATA1,DATA2,SUM,DATA1,DATA2,SUM是实际参数,42,上述宏命令经汇编后展开的指令相当于源程序:MOV AX,

19、DATA1ADD AX,DATA2MOV SUM,AX,宏调用与过程调用类似,其差别是:,宏命令伪指令由宏汇编程序在汇编过理中进行替换处理;而过程调用指令CALL和返回指令RET则是CPU指令,需进行入栈和出栈处理,宏指令与过程都可以简化编程,43,4.3.5 结束语句(P113),格式为:END 表达式通常是程序第一条指令的标号,每一个结束语句都与某个开始语句成对出现:SEGMENT和ENDS,PROC和ENDP,MACRO和ENDM唯一的例外就是END语句,它标志着整个源程序的结束,它告诉汇编程序,没有更多的指令要汇编了。,44,一个完整的用汇编语言编写的源程序组成是:指令性语句:可执行指

20、令指示性语句:对符号定义、分配存储单元、分段等。一个完整的程序至少应该包含三种段:源程序行组成的代码段,堆栈操作所需要的堆栈段存放数据的数据段。,45,DATA SEGMENT.DATA ENDSSTACK SEGMENT STACK STACK.STACK ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODESTART:CODE ENDS END START,汇编源程序结构完整的段定义,表示是堆栈段,且给了一个名字“STACK”,自动进行堆栈段的初始化,即段基值SS,且自动为SP初始化,46,分段结构,stack SEGMENT stack sta

21、ck DB 100 DUP(?)stack ENDSdata SEGMENT szhello DB Hello world,0dh,0ah,$data ENDS,code SEGMENT ASSUME CS:code,DS:data,SS:stackstart:MOV AX,data MOV DS,AX MOV AH,9 MOV DX,OFFSET szhello INT 21h MOV AH,4ch INT 21hcode ENDS END start,47,4.5.6 DOS系统功能调用,系统软件中提供的功能调用D0S 功能调用(也称高级调用)BI0S 功能调用(也叫低级调用)调用系统服务

22、程序软中断指令INT nD0S系统功能调用都是用软中断指令INT 21H来实现的,48,DOS中断调用简介,中断调用DOS功能格式,入口寄存器与参数赋值,AH功能号,INT 21H(中断类型号 21H的中断功能为请求DOS功能调用),DOS中断功能举例,01H,02H,09H,0AH,键盘输入字符,显示字符,显示字符串,键盘输入字符串,AL=输入字符,DL=输出字符,DX=缓冲区首地址,DX=缓冲区首地址,25H,置中断向量,AL=中断类型号DS:DX=入口地址,35H,取中断向量,AL=中断类型号,ES:DX=入口地址,4CH,返回DOS,49,BIOS中断调用简介,中断调用BIOS功能格式

23、,入口寄存器与参数赋值,INT 中断类型号,BIOS中断功能举例,02H,01H,02H,设置光标位置,发送一字符,接收一字符,AL=字符的ASCII DX=串口代码(0,1),DX=串口代码(0,1),08H,取当前驱动器参数,DL=驱动器号(80H和81H)硬盘,AH功能号,BH=0(图形方式)DH:DL=行:列,10H,00H,读当前时钟,CX=时钟高字DX=时钟低字,1AH,AL=接收的ASCII,14H,13H,DL=驱动器数DH=最大磁头号CX=扇区数目10位,0AH,显示字符,AL=显示字符BX=0001(色彩等),50,1.DOS键盘功能调用,(1)单字符输入并回显在屏幕上入口

24、参数:AH=01;功能调用号返回参数:AL=输入字符的ASCII码中断号:21H格式:MOV AH,1 INT 21H,51,(2)输入字符串 将键盘输入的字符串存入用户定义的缓冲区。入口参数:AH=0AH DS:DX=输入字符串在内存中的首地址 中断号:21H,52,2.DOS显示功能调用,(1)显示单个字符入口参数:AH=02(或06)DL=字符(用ASCII码表示)中断号:21H例:有如下程序段MOVAH,02MOVDL,41HINT21H;显示A,53,入口参数:AH=09 DS:DX=字符串地址 中断号:21H被显示的字符串必须以$结束,且所显示的内容不应出现非可见的ASCII码,否

25、则产生不可预料的结果。,(2)显示字符串,54,DOS中断调用举例,例1:键盘输入字符,并显示。,键入字符时,结尾应为“$”,送缓冲区首地址,键入字符串,显示字符串,55,4.5 汇编语言程序设计基础,4.5.1 程序设计概述1.编写汇编语言的步骤(1)根据实际问题抽象出数学模型(2)确定解决此数学模型的算法(3)画出程序框图(流程图)(4)分配内存工作单元和寄存器(5)根据框图编制程序(6)上机调试,进行修改(汇编、链接),56,2.源程序的基本结构顺序程序分支程序循环程序子程序,57,3.汇编语言上机过程,汇编语言源程序(属性为.ASM)从键盘输入(如在EDIT下)汇编-经MASM的语法检

26、查和翻译 若无语法错,形成目的文件(.OBJ)链接-经LINK连接,形成可执行文件(.EXE)运行-直接键入.EXE的名字部分 若运行结果不对,可用DEBUG调试,再编辑、汇编、连接、运行直至得到正确结果。,58,4.5.5 码转换程序设计,输入输出设备以ASCII码表示字符,所以,在CPU与I/O设备之间必须要进行码的转换。实现码转换的方法有:对于有些转换,利用CPU的算术和逻辑运算指令很容易实现,故可用软件实现转换;某些更为复杂的转换,可以用查表来实现,但要求占用较大的内存空间;对于某些转换,用硬件也是容易实现的,如BCD到七段显示之间转换的译码器等。,59,利用软件实现不同码之间的转换:

27、十六进制到ASCII例4-5(P127页)若有一个二进制数码串,要把每一个字节中的二进制转换为两位十六进制数的ASCII码,高4位的ASCII码放在地址高的单元。串中的第一个字节为串的长度(小于128)。能实现这样转换的流程如图4-8所示。,60,61,name hex_change_to_asciidatasegmentl1dw 2string db 34h,98hl2dw?bufferdb 2*2 dup(?);转换好的ASCIIdataendsstacksegmentpara stack stackdb100 dup(?)stackendscodesegment assume cs:co

28、de,ds:data,es:data,ss:stack,62,startprocfarbegin:pushdsmovax,0pushaxmovax,datamovds,axmoves,axmovcx,l1;(l1)=2,字符串长度leabx,stringleasi,buffer movax,cx;ax=cx=2,63,salcx,1;(p72页)cx*2movl2,cx;(l2)=4,转换后的ASCII的个数movcx,ax;cx=2again:moval,bx;al 34hmovdl,al;dx备份ax存储的串andal,0fh;取字节的低四位callchange;低四位转换成ASCIImo

29、val,dlpushcx;cx=2,循环次数入栈movcl,4shral,cl;(p73页),右移四次popcx;cx=2,64,callchangeincbxloopagainretstartendpchangeproccmpal,10jladd_0add al,a-0-10 add_0:addal,0mov si,alinc siretchangeendpcodeendsendbegin,65,注意:以下各题只需要编写必要的指令语句(不需要段定义、数据定义等伪指令)4.1;4.3;4.7;4.11;4.21;4.27;4.36;4.42;4.57;,作业,66,补充1,注意:该题所编写的程

30、序需要包含必要的伪指令多字节加法,要求把6个字节数据(加数和被加数均为3字节数据)分配在数据区,将多字节的和存放在字节sum单元中。同时要求定义30个字节的堆栈空间。注意:sum单元需要定义四个字节的空间,67,补充2,注意:该题所编写的程序需要包含必要的伪指令在数据段中定义1个字节数据,将数据转换成16进制的ASCII码,然后在屏幕上显示这些数据。提示:显示数据用DOS功能2号调用,每个数据用空格分隔。,68,补充3,注意:该题所编写的程序需要包含必要的伪指令在数据段中有20个字节单元,保存着某一功课的成绩,统计该门功课中不及格、60-69,70-79,80-89,90-100的人数,并且求该门功课的平均值,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号