程序设计2.ppt
《程序设计2.ppt》由会员分享,可在线阅读,更多相关《程序设计2.ppt(168页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、程序设计程序设计2 23.1 汇编语言的源程序格式汇编语言源程序由语句序列构成。每条语句一般占一行。分号(;)后面为注释。源程序可以包含若干个代码段、数据段、附加段或堆栈段。段与段之间的顺序任意。独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。所有可执行性语句必须位于某一个代码段内,说明语句性语句可根据需要位于任一段内。通常需要一个堆栈段。3.1.1 简化段定义格式.model small;定义程序的存储模式.stack 100h ;定义堆栈段(默认1KB空间).data ;定义数据段.;数据定义.code ;定义代码段.startup ;程序起点.;程序代码
2、.exit ;程序结束,返回DOS.;子程序等的代码end ;汇编结束3.1.2 完整段定义格式stack segment stack;定义堆栈段,段名stack db 1024 dup(0);分配堆栈段的大小,为1024字节stack ends ;堆栈段结束 data segment ;定义数据段,段名data .;数据定义data ends ;数据段结束 code segment code ;定义代码段,段名code assume cs:code,ds:data,ss:stack ;确定各个逻辑段的类型start:mov ax,data ;程序起点 mov ds,ax ;设置DS指向数据段
3、的段地址 .;程序代码 mov ax,4c00h int 21h ;程序结束,返回DOS .;子程序等的代码code ends ;代码段结束end start ;汇编结束,程序起始点为start1.逻辑段的完整定义段名 segment 定位 组合 类别 .;语句序列段名 ends段定位属性(默认为PARA)BYTE WORD DWORD PARA PAGE段组合属性(默认为PRIVATE)PRIVATE PUBLIC STACK段类别属性(代码段要有CODE类别)CODE DATA STACK2.逻辑段与段寄存器的对应ASSUME 段寄存器:段名,段寄存器:段名,ASSUME伪指令建立逻辑段与
4、段寄存器的对应关系,汇编程序会据此在需要时自动插入段超越前缀。ASSUME并不为段寄存器设定初值。若程序中使用数据段或附加段,必须明确地为DS和ES赋值。3.1.3 可执行程序的结构EXE程序程序在内存中的前256字节为程序段前缀PSPDS和ES指向PSPCS和IP指向代码段程序开始执行的指令SS和SP指向堆栈段若没有堆栈段,则SS=PSP段地址,SP=100H。COM程序所有段寄存器都指向PSP的段地址程序执行起点为PSP后的第一条指令,即IP100H堆栈区设在64KB物理段尾部(通常SP=FFFEH)3.2 常量、变量和标号常量表示一个固定的数值变量实质上是指内存单元的数据名字(变量名或子
5、程序名等)和标号具有逻辑地址和类型的属性3.2.1 常量常数:由各种进制表示的数值。默认为十进制。可用伪指令.RADIX改变。.RADIX n;n为216间的数值字符串:用单引号或双引号括起来的单个或多个字符,其数值是每个字符对应的ASCII码。符号常量:用标识符表达一个数值。符号名 EQU 数值表达式符号名 EQU 符号名 数值表达式EQU不能重复定义符号名,“”则允许。数值表达式:由运算符连接的各种常量所构成的表达式。算术运算符:、*、/、MOD逻辑运算符:AND、OR、XOR、NOT移位运算符:SHL、SHR关系运算符:EQ、NE、GT、LT、GE、LE3.2.2 变量变量的定义:变量名
6、 伪指令 初值表变量名表示初值表首元素的逻辑地址。可以没有变量名。初值表是用逗号(,)分割的参数,由常量或“?”组成。多个存储单元如果初值相同,可用DUP操作符定义。重复次数 DUP(重复参数)变量定义伪指令:DB、DW、DD、DF、DQ、DT。字符串的定义要用DB。可以用定位伪指令控制数据或指令的偏移地址。ORG 参数;由参数指定的偏移地址开始存放数据或指令EVEN ;由偶地址开始存放数据或指令ALIGN n ;由n的整数倍地址开始存放数据或指令符号“$”表示当前的偏移地址3.2.3 名字和标号的属性逻辑地址属性:名字和标号对应的存储单元的逻辑地址。OFFSET 名字/标号 ;返回名字/标号
7、的偏移地址SEG 名字/标号 ;返回名字/标号的段地址类型属性:变量名的类型可以是BYTE/WORD/DWORD,标号和子程序名等的类型可以是NEAR/FAR。类型名 PTR 名字/标号;将名字/标号按指定类型使用THIS 类型名 ;创建位于当前地址但为指定类型的操作数SHORT 标号 ;将标号作为短转移处理TYPE 名字/标号;返回一字型数值,表明名字/标号的类型字节/字/双字返回1/2/4,短/近/远标号为FF01H/FF02H/FF05HLENGTHOF 变量名 ;返回整个变量的数据项数SIZEOF 变量名 ;返回整个变量占用的字节数习题 3.9 mov al,23h and 45h o
8、r 67h;al=67h mov ax,1234h/16+10h;ax=0133h mov ax,23h shl 4;ax=0230h mov al,a and(not(a-A);al=41h mov ax,(76543 lt 32768)xor 7654h;ax=7654h 习题 3.10 61h 62h 63h 0ah 10h 65h 66h ffh 00h 04h 04h 04h ffh 00h 04h 04h 04h ffh 00h 04h 04h 04h 10h fch 00h 00h 00h习题 3.11my1b db “Personal Computer”my2b db 20my
9、3b db 14hmy4b db 00010100bmy5w dw 20 dup(?)my6c equ 100my7c equ 习题 3.14offset varb =0104hoffset mess=0114htype buff =1;type mess=1;type vard=4sizeof varw=4;sizeof buff=10;sizeof mess=5lengthof varw=2;lengthof vard=1习题 3.151000大于字节变量所能表示的范围OFFSET只能用于简单变量双操作数不能同时为存储器操作数数值表达式应为运算符加常量两操作数类型不一致条件跳转只能是短跳转
10、例题 3.4stack segment stack db 1024 dup(0)stack ends data segment ASCII db 30h,31h,32h,33h,46hhex db 04h,0bh data endscode segment codeassume cs:code,ds:data,ss:stack start:mov ax,data mov ds,ax mov bx,offset ASCII mov al,hex and al,0fh mov ah,2 int 21h mov ax,4c00h int 21h code ends end start3.5.3 串操
11、作指令源操作数用SI间接寻址,默认段寄存器为DS,允许段超越。目的操作数用DI间接寻址,默认段寄存器为ES,不许段超越。每执行一次串操作,SI和DI将自动修改:1或2。对于以字节为单位的串操作(指令助记符用B结尾),SI和DI修改1。对于以字为单位的串操作(指令助记符用W结尾),SI和DI修改2。当DF=0时,SI和DI将1或2。当DF=1时,SI和DI将1或2。8995、串传送指令MOVSB;ES:DI=DS:SI,SI=SI1,DI=DI1MOVSW;ES:DI=DS:SI,SI=SI2,DI=DI2STOSB;ES:DI=AL,DI=DI1STOSW;ES:DI=AX,DI=DI2LOD
12、SB;AL=DS:SI,SI=SI1LODSW;AX=DS:SI,SI=SI2REP;每执行一次操作,CX=CX1,直到CX0。MOV CX,400HREP MOVSB96101、串检测指令CMPSB;DS:SIES:DI,SI=SI1,DI=DI1CMPSW;DS:SIES:DI,SI=SI2,DI=DI2SCASB;ALES:DI,DI=DI1SCASW;AXES:DI,DI=DI2REPE/REPZ;执行一次操作,CX=CX1,直到CX0或ZF=0。REPNE/REPNZ;执行一次操作,CX=CX1,直到CX0或ZF=1。3.6 子程序设计子程序定义过程名 PROC NEAR/FAR .
13、;过程体过程名 ENDP有关子程序的说明子程序中最后应利用RET指令返回。子程序中应保持堆栈的平衡。子程序开始应保护所使用的寄存器内容,并在返回前恢复。子程序应安排在代码段的主程序之外。子程序允许嵌套和递归。子程序可以有多个出口。子程序与主程序间的参数传递用寄存器传递用共享变量传递用堆栈传递4.1 伪伪 指指 令令 一、一、汇编起始指令汇编起始指令 ORG 指令格式为:ORG nn 该指令的作用是指明后面的程序或数据块的起始地址,它总是出现在每段源程序或数据块的开始。式中,nn为 16 位地址,汇编时nn确定了此语句后面第一条指令或第一个数据的地址,此后的源程序或数据块就依次连续存放在以后的地
14、址内,直到遇到另一个ORG指令为止。例:ORG 2000H MOV SP,60H MOV R0,2FH MOV R2,0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H,即 存储器地址 目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF 二、等值指令二、等值指令EQU 指令格式:字符名称 EQU 数字或汇编符号 功能:使指令中的字符名称等价于给定的数字或汇编符号。使用等值指令可给程序的编制、调试、修改带来方便,如果在程序中要多次使用到某一地址,由EQU指令将其赋值给一个字符名称,一旦需要对其进行变动,只要改变EQU命令后面的数
15、字即可,而不需要对程序中涉及到该地址的所有指令逐句进行修改。但要注意,由 EQU等值的字符名称必须先赋值后使用,且在同一个源程序中,同一个标号只能赋值一次。例:PA8155 EQU 8001H即给标号PA8155赋值为8001H。三、三、定义字节指令定义字节指令DB 指令格式:标号:DB 8位二进制数表 功能:把 8 位二进制数表依次存入从标号开始的连续的存储单元中。格式中,标号区段可有可无,DB指令之后的 8 位二进制数表是字节常数或用逗号隔开的字节串,也可以是用引号括起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。例:ORG 1000HBUF1:DB 38H,7FH,80
16、HBUF2:DB 45H,66H ORG伪指令指定了标号BUF1的地址为1000H,而DB伪指令是将其后的二进制数表38H,7FH,80H依次存放在1000H,1001H,1002H 3 个连续单元之中,BUF2也是一个标号,其地址与前一条伪指令连续,即1003H,1004H地址单元中依次存放 45H,66H。四、四、定义字指令定义字指令DW 指令格式:标号:DW 16 位数据表 该指令的功能与DB相似,区别仅在于从指定地址开始存放的是指令中的 16 位数据,而不是字节串。每个 16 位数据要占两个存储单元,高8 位先存,低 8 位后存,这和MCS-51指令中的16位数据存放顺序是一致的。五、
17、五、汇编结束指令汇编结束指令END 指令格式:标号:END 地址或标号 格式中标号以及END后面的地址或标号可有可无。功能:提供汇编结束标志。汇编程序遇到 END后就停止汇编,对 END以后的语句不予处理,故 END应放在程序的结束处。4.2 汇编语言程序设计汇编语言程序设计 4.2.1 简单程序设计简单程序设计 例例 1 两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入 40H和41H单元中。程序如下:START:CLR C ;将Cy清零 MOV R0,41H ;将被加数地址送数据指针R0 M
18、OV R1,51H ;将加数地址送数据指针R1 AD1:MOV A,R0 ;被加数低字节的内容送入AADD A,R1 ;两个低字节相加MOV R0,A ;低字节的和存入被加数低字节中 DEC R0 ;指向被加数高位字节 DEC R1 ;指向加数高位字节 MOV A,R0 ;被加数高位字节送入AADDC A,R1 ;两个高位字节带Cy相加 MOV R0,A ;高位字节的和送被加数高位字节 RET 例例 2 将两个半字节数合并成一个一字节数。设内部RAM 40H#,41H单元中分别存放着 8 位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入 50H单元中。程序如下:START:MOV
19、 R1,40H ;设置R1为数据指针MOV A,R1 ;取出第一个单元中的内容ANL A,0FH ;取第一个数的低半字节SWAP A ;移至高半字节INC R1;修改数据指针XCH A,R1 ;取第二个单元中的内容ANL A,0FH ;取第二个数的低半字节ORL A,R1 ;拼字MOV 50H,A;存放结果RET 4.2.2 分支程序设计分支程序设计 图 4.1 分支结构框图(a)单分支流程;(b)多分支流程 例例 3 x#,y均为8位二进制数,设 x存入R0,y存入R1,求解:程序如下:START:CJNE R0,00H,SUL1;R0中的数与00比较不等转移 MOV R1,00H;相等,R
20、1 0 SJMP SUL2 SUL1:JC NEG ;两数不等,若(R0)0,则 R101H SJMP SUL2 NEG:MOV R1,0FFH;(R0)0,则 R10FFH SUL2:RET 图 4.2 例例 4 比较两个无符号数的大小。设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符号的二进制数,找出其中的大数存入外部 RAM 中的 ST3单元中。图 4.3 程序如下:ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START:CLR C ;清零Cy MOV DPTR,ST1 ;第一个数的指针 MOVX A,DPTR ;取
21、第一个数 MOV R2,A ;保存 MOV DPTR,ST2 ;第二个数的指针 MOVX A,DPTR ;取第二个数 CLR C SUBB A,R2;两数比较JNC BIG1;若第二个数大,则转XCH A,R2;第一个数大BIG0:MOV DPTR,ST3 MOVX DPTR,A;存大数RETBIG1:MOVX A,DPTR;第二个数大SJMP BIG0RET 4.2.3 循环程序设计循环程序设计 一、一、循环程序循环程序 图 4.4 循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的
22、实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。例例 5 工作单元清零。在应用系统程序设计时,有时经常需要将存储器中各部分地址单元作为工作单元,存放程序执行的中间值或执行结果,工作单元清零工作常常放在程序的初始化部分中。设有50个工作单元,其首址为外部存储器8000H单元,则其工作单元清零程序如下:CLEAR:CLR A MOV DPTR,8000H ;工作单元首址送指针 MOV R2,50;置循环次数CLEAR1:MOVX DPTR,A
23、INC DPTR ;修改指针 DJNZ R2,CLEAR1;控制循环 RET 例例 6 设在内部 RAM的BLOCK单元开始处有长度为 LEN个的无符号数据块,试编一个求和程序,并将和存入内部 RAM的 SUM单元(设和不超过 8 位)。BLOCK EQU 20H LENEQU 30H SUM EQU 40HSTART:CLR A ;清累加器A MOV R2,LEN;数据块长度送R2 MOV R1,BLOCK ;数据块首址送R1 LOOP:ADD A,R1;循环加法 INC R1;修改地址指针 DJNZ R2,LOOP ;修改计数器并判断 MOV SUM,A;存和 RET 二、二、多重循环多重
24、循环 例例 7 10 秒延时程序。延时程序与 MCS-51 执行指令的时间有关,如果使用 6 MHz晶振,一个机器周期为 2 s,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。10 秒延时程序如下:DELAY:MOV R5,100 DEL0:MOV R6,200 DEL1:MOV R7,248 DEL2:DJNZ R7,DEL2 DJNZ R6,DEL1 DJNZ R5,DEL0 RET 上例程序中采用了多重循环程序,即在一个循环体中又包含了其它的循环程序,这种方式是实现延时程序的常用方法。使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生
25、内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制的循环结构方式。例例 8 在外部 RAM中,BLOCK开始的单元中有一无符号数据块,其个数为 LEN个字节。试将这些无符号数按递减次序重新排列,并存入原存储区。ORG 1000H START:MOV DPTR,BLOCK;置地址指针 MOV P2,DPH ;P2作地址指针高字节 MOV R7,LEN ;置外循环计数初值 DEC R7 ;比较与交换 n-1次 LOOP0:CLR F0 ;交换标志清 0 MOV R0,DPL;MOV R1,DPL;置相邻两数地址指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计
限制150内