微机原理及应用第四章.ppt

上传人:苏美尔 文档编号:7198260 上传时间:2020-11-05 格式:PPT 页数:57 大小:1.81MB
返回 下载 相关 举报
微机原理及应用第四章.ppt_第1页
第1页 / 共57页
微机原理及应用第四章.ppt_第2页
第2页 / 共57页
微机原理及应用第四章.ppt_第3页
第3页 / 共57页
微机原理及应用第四章.ppt_第4页
第4页 / 共57页
微机原理及应用第四章.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《微机原理及应用第四章.ppt》由会员分享,可在线阅读,更多相关《微机原理及应用第四章.ppt(57页珍藏版)》请在三一文库上搜索。

1、南京理工大学机械学院,Nanjing University of Science 偏移地址:是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。 类型: NEAR:段内转移或调用,只需要改变IP值,不需要改变CS值。标号返回值为-1(0FFFFH) FAR:指段间转移和调用。IP和CS都将改变,标号返回值为-2(0FFFEH),汇编语言的运算符,宏汇编允许对常量进行算术、逻辑和关系3种运算,构成的数值表达式在汇编时完成计算。 算术运算符:+、*、/、MOD、SHL和SHR 如:PI EQU 31416/10000 逻辑运算符:AND、OR、NOT、XOR 如:AND AL,MAS

2、KB AND OFH 和逻辑运算指令的区别:由逻辑运算符构成的表达式在汇编时完成计算,而指令在运行时才会执行 。 关系运算符:EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于) 注:关系运算符比较两个操作数并产生一个逻辑值。如果关系成立,则结果为真(0FFFFH);否则为假(0000H)。,汇编语言的运算符,值返回运算符 1$ 运算符:返回汇编器当前地址计数器的值。 如:BLOCK DB Read after me! NUM EQU $-BLOCK 结果NUM的值为字符串的长度14 又如:W2 DW -5,1994H C1 EQU ($-W2)/2;

3、C1表示变量W2中元素的个数。 2SEG和OFFSET运算符:返回变量或标号的段地址和偏移地址。例如:MOV AX,SEG TABLE MOV BX,OFFSET TABLE (相当于LEA BX,TABLE),汇编语言的运算符,3TYPE运算符:用于返回变量和标号的类型 例如:MOV AX,TYPE TABLE 若TABLE为字节变量,则返回值为1 4LENGTH和SIZE运算符 LENGTH:返回分配给该变量的元素的个数; SIZE:返回分配给该变量的字节数。即返回变量的长度LENGTH与类型TYPE之积。 说明:这两个运算符只对用DUP定义的变量有意义。 例如: TABLE DW 100

4、 DUP (?) MOV CX, LENGTH TABLE ; CX=100 MOV DX, SIZE TABLE ; DX=200,汇编语言的运算符,属性运算符 1PTR运算符:忽略变量或标号的当前属性,而给出一个临时的类型或属性。 例1: SLOT DW 25 MOV AL, BYTR PTR SLOT 例2: MOV BYTE PTR BX,5 或 MOV WORD PTR BX,5 2THIS运算符:可用来建立一个特殊的变量,而不为其分配存储空间。该变量的段地址和偏移地址就是后面一个变量的段和偏移地址,其类型在THIS运算符后面指定。 例:F1 = THIS BYTE F2 DW 12

5、34H MOV AX, TYPE F1; AX=1 MOV BL, F1; BL=34H,汇编语言的段定义,段定义伪指令 格式:段名 SEGMENT 定位类型组合类型类别 段名 ENDS 说明:三个可选项一般情况下可不用。但如果需要用连接程序把本程序与其它程序模块相连接时,就需要使用这些说明。,汇编语言的段定义,定位类型:如何将组合后的段定位到存储器中。 PARA:这是隐含的定位方式,段首址的最低4位为0; BYTE:本段可从任何地址开始; WORD:本段要从偶地址开始; PAGE:段首址的低8位为0。 连接方式:表明本段和其它段的组合关系(共6种,见P119) 类别:必须用单引号括起来,连接

6、时LINK将类别名相同的所有段(它们不一定同段名)存放在连续的存储区域中。典型的类别名有:data, stack, code。,汇编语言的过程定义,过程定义伪指令 一个代码段可以由一个或几个过程组成。 过程的定义格式形式如下: 过程名 PROC NEAR或FAR RET 过程名 ENDP NEAR:默认状态,为段内过程 FAR:为段际过程,设定段寄存器伪指令ASSUME,几乎所有访问存储器的指令都仅使用偏移地址。而段地址来自某个段寄存器,所以源程序在程序代码段的开始就要对段寄存器与段之间的关系做假定。 确定段寄存器与段的关系的伪指令ASSUME 格式:ASSUME SEGREG NAME:SE

7、GNAME, 例如:assume ss:stack, cs:code, ds:data 注意:伪指令ASSUME只是指定某个段分配给哪个段寄存器,它并不能把段地址装入到段寄存器中。因此要在程序中用两条MOV指令完成这一操作,但代码段不需要这样做,CS的内容将程序初始化时由系统自动完成。,汇编语言源程序结构,RAM底端 DS、ES CS RAM高端,EXE文件:分段结构的可执行文件。EXE文件除了程序、数据外,还包含了一个文件头,叫程序段前缀PSP (program segment prefix),占256个字节。 PSP的256个字节包含三部分的信息:有被装入程序与操作系统连接时使用的信息,有

8、供装入程序使用的参数,还有供操作系统本身使用的信息。,标准程序前奏,当执行EXE文件时,操作系统像调用子程序一样,把控制权转移给EXE文件,EXE文件执行完之后也应像子程序返回调用程序一样将控制权返回操作系统。 EXE文件返回DOS的两种方法: (1)使用4CH功能调用 即在EXE文件的最后使用以下指令: MOV AH,4CH INT 21H (2)用软中断INT 20H,其指令机器码是CD20,标准程序前奏,PSP的头两个字节即为一条INT 20H指令,即返回操作系统指令。当程序运行结束时,可以通过把程序流程转移到PSP的这条指令而终止自己的进程。因此需要在程序一开始把PSP的起点地址压入堆

9、栈: PUSH DS XOR AX, AX PUSH AX 这三条指令称为标准程序前奏。这样当程序执行到最后一条RET指令时,它将从堆栈顶部弹出PSP的起点地址送CS和IP,使得INT 20H指令得以执行, 从而把控制权交还给操作系统。 当不把代码段中的程序写成过程时,这三行语句是不必要的,但若将其写成DOS调用的过程,则必须加上这三条标准程序前奏。,结束用户程序返回DOS的方法,1INT 20H 2程序转移到程序段前缀PSP的开始处来返回DOS, 在子程序中应有如下程序段: PUSH DS XOR AX, AX PUSH AX MOV AX,DATA MOV DS,AX RET 3用4CH功

10、能调用 MOV AH, 4CH INT 21H,若程序中用到附加段ES,则还应有将附加段首址送ES的指令,ORG伪指令,ORG:伪指令用于指定段内程序或数据代码存放的起始偏移地址,即用语句中表达式的值作为起始偏移地址,此后的程序或数据代码将连续存放,除非遇到另一个新的ORG语句。一般格式为: ORG 例如: DATA SEGMENT BUFF1DB23,56H,EOF ORG2000H BUFF2DBSTRING DATA ENDS,汇编结束伪指令语句END,汇编结束伪指令语句END END伪指令用在源程序的最后,用以表示整个源程序的结束,即告诉汇编程序,汇编工作到此结束。 格式:END 表达

11、式 说明:表达式为程序第一条可执行指令的地址。如果不带表达式,则该程序不能单独执行,只是供其他程序调用的子模块。,汇编语言源程序结构,RAM底端 CS,DS,ES,SS IP=0100H SP=0FFFEH RAM高端,COM文件 所占存储空间比EXE文件小,不允许超过64K。 COM文件不分段,且不允许定义堆栈段,占有的空间所有的过程均应定义为NEAR,其入口点必须是0100H。 只能用来编制较小的程序。由于其小而简单,装入速度比EXE文件要快。,64KB,例题详解,某程序中的数据定义如下: DAT1 DW ?,18 DUP(9) DAT2 DB 90,67,12,176,100,8 DAT

12、3 DD ?,?,15 CNT1 EQU $-DAT2 CNT2 EQU $-DAT3 问CNT1、CNT2的值以及上述数据定义占用多少字节的内存?,答案:CNT1=18 CNT2=12 共占用字节:56个字节,执行以下程序段后,AX的内容为: ORG 0000H TABLE DW 12H,34H,56H,$+1018,78H,90H COUNT EQU 3 LEA BX,TABLE MOV DX,4BX MOV AX,BX+2*COUNT SUB AX,DX,BX = 0000H DX = 0056H AX = 0400H AX = 03AAH,注意:$+1018中的1018是十进制数,即十

13、六进制数3FA,例题详解,执行以下程序段后,CL和AX的内容各为: STR1DWAB STR2DB 16 DUP(?) CNTEQU$-STR1 MOV CX,CNT MOV AX,STR1 HLT,答案: CL = 12H AX = 4142H,例题详解,求下列数据段中每个符号或变量所对应的值: DATASEGMENT ORG1000H MAXEQU 0FFH ONEEQU MAX MOD 10 TWO EQU ONE*4 SIZEEQU(TWO LT 20H) AND 10H)+10H BUFDB SIZE*2 DUP(?) COUNT EQU $-BUF DATA ENDS,MAX=FF

14、H ONE=05H TWO=14H SIZE=20H BUF=1000H COUNT=40H,例题详解,汇编程序设计,在汇编语言程序中,最常见的结构有: l 顺序结构 l 分支结构 l 循环结构 l 子程序结构 这几种程序的设计方法是汇编程序设计的基础。,顺序结构程序设计,顺序结构程序设计是没有分支,没有循环的直线运行程序,它的执行顺序和指令的排列顺序完全一致。 例1: 利用查表法计算平方值。已知0 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X 9且为整数。 解:(1)了解平方表的存放位置; (2)根据X的值,找到X对应X2在表中位置

15、。,DATA SEGMENT SUR DB 2 DIS DB ? SQTAB DB 0,1,4,9,16,25,36,49,64,81 DATA ENDS,顺序结构程序设计,数据段的定义部分: 根据题目要求,定义SUR、DIS、SQTAB三个变量,STACK SEGMENT DB 100 DUP( ? ) STACK ENDS,堆栈段的定义部分:,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX,DATA MOV DS,AX LEA BX,SQTAB; 取平

16、方表基地址 MOVAH,0 MOVAL,SUR ; AL=X ADDBX,AX ; 计算地址偏移 MOVAL,BX ; 取出X的平方值 MOVDIS,AL RET BEGIN ENDP CODE ENDS END BEGIN,顺序结构程序设计,代码段的定义部分:,标准程序前缀,为使程序精练,可采用查表指令XLAT,代码段如下: BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA BX,SQTAB MOV AL,SUR ;AL=X XLAT SQTAB MOV DIS,AL,顺序结构程序设计,分支结构程序设计,分支结构:分支程序经常

17、利用改变标志位的指令和转移指令来实现。如采用比较指令CMP和测试指令TEST,产生相应的状态标志,选择适当的条件转移指令,实现不同情况的分支转移。,分支结构程序设计实例,例 编程实现符号函数。 1 X 0 Y= 0 X = 0 1 X 0,根据上述要求的程序段为: START:MOV AX,BUFFER; 取变量X OR AX,AX ; 产生状态标志 JE ZERO ; X = 0 则转移,ZERO: MOV BX,0,JMP CONT1,CONT1: ,JMP CONT1 ; 转向出口,JNS PLUS ; X 为正 则转移,MOV BX,0FFFFH; BX= 1,PLUS: MOV BX

18、,1,分支结构程序设计实例,循环结构,顺序结构和分支结构程序中的指令,最多只执行一次,若要重复执行某些指令,需用循环结构实现。 循环程序由4个功能部分组成:,(1)循环准备:对循环体要使用的工作单元及寄存器置初值,如建立地址指针、设置计数器初值、将工作寄存器或工作单元清零等。 (2)循环处理: 重复进行数据处理操作。 (3)循环控制:为下一轮循环处理修改数据地址指针和计数器值等,并判断结束条件是否满足。 (4)结果处理:分析并转存处理结果。,循环结构,例: 设内存BUFF开始的单元中依次存放着30个8位无符号字节数,求它们的和并存放在SUM单元中。 程序如下: MOV SI,BUFF MOVC

19、X,30 XORAX,AX AGAIN:ADDAL,SI ADC AH,0 INCSI DECCX ;可用LOOP AGAIN JNZAGAIN MOVSUM,AX,例:在DS数据段中,从偏移地址BUFFER起,顺序存放着100个无符号16位数,编写程序将这100个字数据从大到小排序。 解法一: LEADI,BUFFER ;取首地址 MOVBL,99 ;须经N-1次排序 NEXT0: MOVSI,DI ;SI恢复指向首地址 MOVCL,BL ;每次排序的比较次数 NEXT3: MOVAX,SI ;当前16位数放在AX中 ADDSI,2 ;SI指向下一个16位数 CMPAX,SI ;当前数与下一

20、个数比较 JNCNEXT5 ;大于等于则不交换 MOVDX,SI ;小于则交换 MOVSI 2,DX ;可 XCHG SI,AX MOVSI,AX ;MOV SI-2,AX NEXT5: DECCL ;计算比较次数 JNZNEXT3 DECBL ;每次排序的比较次数减一 JNZNEXT0 HLT,循环结构,解法二: LEA DI,BUFFER ;取首地址 MOV COUNT,100 ;排序元素的个数 CLD ;地址递增排序 NEXT1: MOV BX,1 ;交换标记 DEC COUNT ;每次排序的比较次数减1 JZ EXIT ;比较次数为0则结束 MOV SI,DI ;SI恢复指向首地址 M

21、OV CX,COUNT ;每次排序的比较次数 NEXT2: LODSW ;当前数AX,SI 下一个数 CMP AX,SI ;当前数与下一个数比较 JNC NEXT3 ;大于等于则不交换 XCHG SI,AX ;小于则交换 MOV SI 2,AX ;大数存入上一位置 XOR BX,BX ;有交换则交换标记清零 NEXT3: LOOP NEXT2 ;一次排序是否结束? CMP BX,0 ;一次排序是否有交换? JE NEXT1 ;有交换则继续 EXIT: MOV AX,4C00H INT 21H,循环结构,例题详解,例:下面是实现8A0BH和D705H两个数相加的程序,请在空白处填写正确的指令:,

22、DATA SEGMENT FIRST DB _, _, 0H SECOND DB _, _ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, _ MOV SI,0 _,答案:0BH 8AH 05H D7H 2 CLC 0,NEXT: MOV AL,SECONDSI ADC FIRSTSI, AL INC SI LOOP NEXT MOV AL, 0 ADC AL, _ MOV FIRSTSI, AL MOV AH, 4CH INT 21H CODE ENDS END STAR

23、T,子程序结构,循环程序设计技术解决了同一程序中连续多次有规律重复执行某个或某些程序段的问题。但对于无规律的重复就不能用循环程序实现。 更多的情况是在不同的程序中或在同一个程序的不同位置常常要用到功能完全相同的程序段,如数制之间的转换、代码转换、初等函数计算等。 对于这样的程序段,为避免编制程序的重复劳动,节省存储空间,往往把它独立出来附加少量额外的指令,将其编制成可供反复调用的公用的独立程序段,并通过适当的方法把它和其它程序段连接起来。,子程序结构,主程序与子程序间的参数传递: (1)寄存器法:传递的参数和出口参数都在约定的寄存器中,当所传递的参数较少时,一般用这种方法。 (2)堆栈法:在调

24、用子程序前,入口参数由主程序送入堆栈中,子程序从堆栈中取得这些参数,并将处理结果送到堆栈中,返回主程序后,主程序从堆栈取得结果。 (3)参数赋值法:若主程序和子程序在同一代码段时,可把参数存放在主程序调用子程序指令后面的一串单元中。,子程序结构,各种参数传递方法的比较 优点: 在参数的传递方法中,寄存器法最简单,堆栈法最节省存储单元,参数赋值法最直观; 缺点: 寄存器法不能传递较多的参数,堆栈法和参数赋值法编程较麻烦。经验证明,参数不多时,用寄存器法最适宜;参数较多时用堆栈法或参数赋值法。,主程序和子程序公用寄存器的处理问题 子程序不可避免地要使用一些寄存器,因此子程序执行后,某些寄存器的内容

25、会发生变化,如果主程序在这些寄存器中已经存放了有用的数据,则从子程序返回主程序后,主程序的运行势必会因原存放信息被破坏而出错。,子程序结构,主程序和子程序公用寄存器的处理问题 解决这个问题的方法是使用这些寄存器之前,将其内容保存起来,使用之后再将其还原。前者称为保护现场,后者称为恢复现场。该工作一般在子程序中完成。如: PUSH AX PUSH BX POP BX POP AX,子程序结构,全国三级PC技术上机考题,题目要求: 请编制程序,其功能是:内存中连续存放着20个ASCII字符,如果是小写字母a-z之间的字符,请将其转换成相应的大写字符;若为其他字符,不作转换。 例如:内存中有61H(

26、a), 62H(b),31H(1)41H(A),42H(B)结果为41H(A), 42H(B),31H,41H(A),42H(B),全国三级PC技术上机考题,部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。 填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与IO.OBJ链接产生PR

27、OG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。,EXTRNLOAD:FAR,SAVE:FARNEQU20,全国三级PC技术上机考题,STACSEGMENTSTACK DB128 DUP(?)STACENDS,DATASEGMENTSOURCEDBN DUP(?)RESULTDBN DUP(0)NAME0DBINPUT1.DAT,0NAME1DBOUTPUT1.DAT,0DATAENDS,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACSTARTPROCFARPUSHDSXORAX,

28、AXPUSHAXMOVAX,DATAMOVDS,AX LEADX,SOURCE;数据区起始地址LEASI,NAME0;原始数据文件名MOVCX,N;字节数CALLLOAD;从INPUT1.DAT读取数据,全国三级PC技术上机考题,;*BEGIN* LEASI,SOURCE LEADI,RESULT MOVCX,NNEXT: MOVAL,SI CMPAL,a JB_ CMPAL,_ J_ UPPER2 SUB_ UPPER2: MOVDI,_ INC_ INC_ _ NEXT;*END*,全国三级PC技术上机考题,z,UPPER2,A,AL, 20H,AL,SI,DI,LOOP,LEADX,RESULT;结果数据区首址LEASI,NAME1;结果文件名MOVCX,N;字节数CALLSAVE;保存结果到文件RETSTARTENDPCODEENDSENDSTART,全国三级PC技术上机考题,The end !,E-mail : Office : 84315087,

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1