版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基本概念:,汇编语言:用指令的助记符、符号地址、标号 等来编写的语言。,汇编语言源程序:用汇编语言编写的程序(*.asm),汇编程序:将汇编语言源程序翻译成目标目标程序(代码),这个翻译过程称为汇编,翻译软件就叫汇编程序。,第四章 汇编语言程序设计,DATA SEGMENT ;定义数据段 SUM DW ? ;变量SUM用来保存结果 DATA ENDS STACK SEGMENT STACK ;定义堆栈段 DB 100 DUP(0) STACK ENDS CODE SEGMENT CODE ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,
2、DATA MOV DS,AX MOV CX,1 CYCLE: ADD SUM,CX ;加上当前数 INC CX ;产生下一个新数 CMP CX,11 ;比较(CX)和12看是否可以结束 JLE CYCLE ;未结束转CYCLE继续,MOV AX,SUM AAM ;将该值转化为BCD数字 ADD AX,3030H ;转化为ASCII码 MOV BX,AX ;数字存于BX中 MOV AH,2 ;显示高位数字 MOV DL,BH INT 21H MOV DL,BL ;显示低位数字 INT 21H MOV AH,4CH ;返回操作系统 INT 21H CODE ENDS END START,一个完整的
3、汇编语言的语句由下列几部分组成:标号和变量、指令助记符、界符、常数和注释,所有这些都称为标记。,4-1 汇编语言的标记,一、标号和变量 表示指令性语句的符号地址或表示一个数据单元的符号地址。,二、指令助记符 指出指令的性质(功能),三、界符 作为一个程序中或一条指令中两个部分的分隔符号用。,四、常数 二进制:01001101B 十进制:2000或2000D 八进制:1700Q 十六进制:1200H,0FFH 串常数:ABCD ,五、注释 用;开头后面的内容可随意,用来增加程序可 读性的。,表达式由运算对象和运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数来使用。,4-
4、2 汇编语言中的表达式,运算对象:常数、标号或变量,一、算术运算符 有:+、-、*、/、MOD(模,即取除法运算结果之余数)、SHL(左移,左移1位相当于乘2)、SHR(右移,右移1位相当于除以2)。,二、逻辑运算符 有:AND(与)、OR(或)、NOT(非)、XOR(异或),逻辑运算符是按位运算的,只能对常数进行运算,得到结果也是常数。,例4-5 IN AL,PORT AND DX,PORT AND 0FEH OUT DX,AX 前一个AND是指令助记符,而后一个AND是 逻辑运算符。,三、关系运算符 有:EQ(相等)、NE(不等)、LT (小于)、GT(大于),LE(小于或等于)、 GE(
5、大于或等于)。,四、数值返回运算符 数值返回运算符也经常称作分析运算符 有:OFFSET、SEG、TYPE、LENGTH、 SIZE 5种,它们加在变量或标号前,返回运 算对象的某个参数值,例如偏移地址值、段 地址值、类型属性、变量包含的单元数等。,1.OFFSET 格式:OFFSET 变量或标号 OFFSET 返回标号或变量的偏移地址值。,2.SEG 格式:SEG 变量或标号 SEG 返回标号或变量的段地址值。,3.TYPE 格式:TYPE 变量或标号,TYPE加在变量前,返回变量的类型属性。,TYPE加在标号前,返回标号的距离属性。,例4-9 A1 DB 1,2,3;变量 A2 DW 12
6、34H;变量 A3 DD 6 DUP(?);变量 L1:MOV AH,TYPE A1;标号 MOV BH,TYPE A2 MOV CH,TYPE A3 MOV DH,TYPE L1 MOV DX,TYPE L1,4.LENGTH 格式:LENGTH 变量,5.SIZE 格式:SIZE 变量,五、修改属性运算符 修改属性运算符也经常称作综合运算符 有:段操作符、PTR、THIS、HIGH、LOW 、SHORT 6种,可以在程序运行过程中,通 过修改属性运算符来修改变量或标号的属性, 包含段属性、偏移地址属性、类型属性等。,1.段操作符 格式: 段前缀:变量或地址表达式 段前缀有段寄存器CS、DS
7、,ES,SS后跟冒号 :,用来表示某个变量或地址被修改到哪个 段寄存器提供的段地址。,2.PTR 格式: 类型/距离:PTR 变量或标号,4-3 伪指令语句,伪指令语句没有对应的机器代码,并不 像指令语句那样由CPU来执行,它是MASM 汇编程序对源程序汇编期间进行处理的。主 要完成变量定义、存储器分配、指示程序开 始和结束、段定义、段分配等。伪指令有以 下几种类型:,一、数据定义语句 格式1:变量名 助记符 操作数,操作数 格式2:变量名 助记符 n DUP(操作数,操作数),例4-21 操作数是常数或表达式 DA1 DB 10H,20H DA2 DW 1122H,34H DA3 DD 5*
8、10H,1234H,例4-22 操作数是字符串 FIRST DB HELLO SECOND DW OK THIRD DB OK,注意:用DW定义字符 串时,只允许包含两个 字符,多于两个字符时, 只能用DB来定义。,例4-23 操作数用?定义不确定值的变量,用 作保留存储空间,以便存放运算结果。 M1 DB ?,? M2 DW 1234H,?,例4-24 操作数用DUP来定义重复变量 ONE DB 5 DUP(0) TWO DW 10 DUP(?) THREE DB 3 DUP(1,2),FOUR DB 2 DUP(1,3 DUP(10H);DUP 嵌套,二、表达式赋值语句 表达式赋值语句有两
9、种,赋值语句EQU和等号语句=,它们均不占用内存。,1.赋值语句EQU 格式:符号名 EQU 表达式 功能:用来给变量、标号、常数、指令、表达式等定义一个符号名,程序中用到EQU左边的变量、标号时可用右边的常数值或表达式代替,但一经定义在同一个程序模块中就不能重新定义。,2.等号语句= 等号语句=与EQU语句具有相同功能,区别在于EQU中左边的标号不允许重新定义,而用=定义的语句允许重新定义。,1.段定义语句 SEGMENTENDS,功能:将一个逻辑段定义成一个整体。,三、段定义语句,段名 SEGMENT 定位类型 组合类型 分类名 段名 ENDS,2.段分配语句ASSUME,例4-29通过表
10、转换指令来实现将57的7段显示段码送到BX寄存器中。,格式: 过程名 PROC 属性 ;过程内容 RET N 过程名 ENDP,四、过程定义语句,例4-30 近过程定义及调用格式 CCODE SEGMENT ABC PROC NEAR RET ABC ENDP CALL ABC CCODE ENDS,例4-31 远过程定义及调用格式 C1CODE SEGMENT KKK PROC FAR RET KKK ENDP C1CODE ENDS C2CODE SEGMENT CALL KKK C2CODE ENDS,例4-32 过程嵌套调用格式 CCODE SEGMENT KKK PROC NEAR
11、CALL LLL RET KKK ENDP LLL PROC NEAR RET LLL ENDP CCODE ENDS,五、程序开始和结束语句,1.NAME 格式:NAME 程序名 功能:为源程序目标模块赋名字。 2.TITLE 格式:TITLE 文本名 功能:将文本名赋给源程序目标模块作名字。,3.ORG 格式:ORG 表达式,4.END 格式:END 标号名 功能:标记汇编源程序结束,4-4 DOS系统功能调用和BIOS中断调用,一、DOS系统功能调用,DOS系统功能调用分别实现设备管理、文件读/写、文件管理和目录管理等功能。每个子程序对应一个功能号,所有的系统功能调用的格式是一致的,按下
12、面4步进行:,(1)系统功能号送到AH寄存器;,(2)入口参数送到指定寄存器中;,(3)用INT 21H指令执行功能调用;,(4)根据出口参数分析功能调用执行情况。,4-5 程序设计方法,前面几章已讨论了指令系统和汇编语言设计基础,而设计出一个好的程序不仅要能正常运行,完成要求的功能,还应该具有下列特点:,(1)程序结构模块化,程序易读,易调试及 维护。,(2)执行速度快。,(3)占用内存空间小。,尤其是结构化设计,在程序复杂的情况下尤为重要。一般来说设计汇编语言源程序的基本步骤如下:,(1)分析问题,抽象出描述问题的数学模型,并确定实现数学模型的算法。,(2)绘制程序流程图,通常先画粗框图,
13、在结构模块中再细画框图。框图一般有起始框,执行框,判断框和终止框。,(3)分配存储空间及工作单元。分配数据段,堆栈段,代码段各在内存什么位置,各个寄存器主要起什么作用。,(4)按流程图设计编写程序。,(5)静态检查,上机调试。,(6)程序运行,结果分析。,在进行汇编语言源程序设计时,通常用到四种程序结构:顺序结构;分支结构循环结构;子程序结构。下面分别加以说明。,一、顺序结构,顺序结构的程序一般是简单程序,程序顺序执行,无分支,无循环,也无转移,图中没有判断框。,例4-64 内存中TABLE开始存放09的平方值,通过人机对话,当任给定一个数X(09),查表得X的平方值,放在AL中。(见程序流程
14、图),DATA SEGMENT TABLE DB 0,1,4,9,16,25,36 DB 49,64,81 BUF DB Please input one number(09): DB 0DH,0AH,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA MOV AX,DATA MOV DS,AX ;获得段地址,MOVDX,OFFSET BUF;显示字符串 MOV AH,9 INT 21H MOVAH,1 ;1号功能调用,键入数送 AL中 INT 21H MOVAH,0 ;查表得键入数的平方值 AND AL,0FH ADD BX,AX MOV AL,
15、BX MOV AH,4CH INT 21H CODE ENDS END,二、分支结构,1.分支结构 一般情况下,程序顺序执行,但经常要求程序根据不同条件选择不同的处理方法,这就需要用到分支结构。,例4-65 编程实现以下函数:,核心代码如下:,MOVAL,X CMP AL,0 JG ZHSHU SUBAL,5 JMPOUT ZHSHU:ADDAL,3 OUT:MOVY,AL,2. 多分支,有的分支结构为多分支,可以利用多个条件转移指令来实现,依次测试条件是否满足,若满足转入相应分支入口,若不满足继续向下测试,直到全部测试完。这种方法编程简单、直观,但运行速度慢,要依次检查才能进入要求的入口。,
16、例4-66 有8个加工子程序,入口地址分别为P1,P2,P8编程实现检测键盘输入命令,使系统分别转向8个加工子程序。(键值为1转向P1,键值为2转向P2,等等。),MOV AH,1 INT 21H CMP AL,1 JE P1 CMP AL,2 JE P2 ,CMP AL,8 JE P8 JMP ST P1: P2: P3: P8: ST: HLT,3. 跳转表实现多分支,利用跳转表实现多分支,就克服了上面 的缺点,可以直接找到相应入口。利用这种 方法要在存储器中先建立一个跳转表,表中包括每个分支的入口地址,跳转指令或关键 字,利用此表就可以实现分支结构。,(1)根据表中入口地址实现分支,跳转
17、表中存放了每个分支程序的入口地址,只要找到表地址,在将其内容取出,即可得到每个分支的入口地址。 表地址=跳转表的首地址+偏移量,例4-67 将例4-66 中程序改成用跳转表来实现:,BASE DW P1,P2,P3,P4 DW P5,P6,P7,P8 ,(2)根据表中指令机器码实现分支,跳转表中存放的是转移指令机器码,查表后程序转到相应的子程序。图4-15给出了转移指令跳转表存放形式。,例4-68 将例4-66 程序用跳转表存放转移指令 机器码实现分支。,MOV AH,1 INT 21H AND AL,0FH MOV AH,0 MOV BL,AL ;将键值保存到BL中 ADD AL,AL AD
18、D AL,BL ;偏移量=键值3 MOV BX,OFFSET BASE ADD BX,AX JMP BX,跳转表中存放关键字,及相应分支地址,图4-16给出了关键字跳转表的格式,图4-17给出了关键字分支流程图。,(3)根据表中关键字实现分支,例4-69 将例4-66用关键字跳转表方式实现分支,BDATASEGMENT BASEDB 31H ;关键字 DW P1 ;P1入口地址 DB 32H DW P2 DB38H DWP8 BDATAENDS,LOP:MOV AH,1 INT 21H CMP AL,0 JE LOP MOV BX,OFFSET BASE NEXT:CMP AL,BX JE D
19、O ADD BX,3 ;加3调整指针 JMP NEXT DO:JMP WORD PTR BX+1 ,三、循环程序结构,1. 循环程序结构形式,循环程序有两种结构形式:一种是“先执行,后判断”结构,另一种是“先判断,后执行”结构。图4-18给出了两种循环程序结构框图。,无论哪种循环结构都包括以下四个部分:,(1)初始化:为循环作准备,设置循环计数值,设置变量 初值。,(2)循环体:循环部分的核心,包括循环的全部执行指令。,(3)修改参数:修改操作数地址,为下次循环作准备。,(4)循环控制:修改计数器值,判断循环控制条件,决定是否跳出循环。,程序流程图如下所示: (先执行,后判断结构),例4-70
20、 将BX中的16进制数转换为ASCII码,存放到BUF开始的内存单元中去,并在屏幕显示出数值。,MOVSI,OFFSET BUF MOV CH,4 NEXT:MOV CL,4 ROLBX,CL MOV AL,BL AND AL,0FH ADDAL,30H CMPAL,3AH JLSTORE ADDAL,7 STORE:MOV SI,AL MOV AH,2 MOV DL,AL INT21H INCSI DECCH JNZNEXT HLT,例4-71 AX寄存器中有一个16位二进制数,编程统计其中1的个数,结构放到CL寄存器中。,MOV CL,0;初始化 L1: AND AX,AX;控制循环 JZ
21、 STOP SALAX,1 ;循环体 JNCL2 INCCL L2: JMP L1 STOP:HLT,此程序采用先判断,后执行的循环结构。,2 . 用逻辑尺的方法控制循环,循环控制条件是循环程序设计的关键,必须结合对算法的分析来选择控制条件。有时程序要求按不同次序处理两种函数操作,可以采用逻辑尺的方法控制循环。,DATASEGMENT LOGRULEQU0011010110000000B COUNT EQU10 ;循环次数 BUFDB 20 DUP(?);采集数据 BLOCK DB 20 DUP(?);处理后数据 DATA ENDS,MOV DX,LOGRUL;逻辑尺DX MOV CX,COU
22、NT ;设循环次数 MOV SI,OFFSET BUF MOV DI,OFFSET BLOCK NEXT: MOV AX,WORD PTR SI ROL DX,1 ;左移一位 JC FUN2 ;进位为1转FUN2 FUN1: ADD AX,5 JMP NEXT1 FUN2: SUB AX,3 NEXT1:MOV WORD PTRDI,AX;送结果 INC SI ;修改地址指针 INC SI INC DI INCDI LOOP NEXT ,3. 多重循环,(2)内循环可以嵌套在外循环中,也可几个内循环并列在外循环中,但各层循环之间不能交叉,可以从内循环跳到外循环,不可以从外循环中直接跳进内层循环
23、。,有些循环结构比较复杂,需要用多重循环完成。多重 循环设计方法与单循环设计方法相同,但应注意:,(1)各重循环的初始控制条件及程序实现。,(3)防止出现死循环,即不能让循环回到初始条件,引起死循环。,例4-72 存储器数据段从BUF开始存放一个字数组,数 组中第一字是存放该数组的长度N,编制一个程序使此数 组中的数据按照从小到大的次序排列。,采用冒泡排序算法。从第一个数据开始相邻的数进行比 较,若次序不对,两数交换位置。第一遍比较(N-1)次 后,最大的数已到了数组尾,第二遍仅需比较(N-2)次 就够了,共比较(N-1)遍就完成了排序,这样共有两重 循环。图4-20给出了程序流程图。,开始,
24、数I数I+1?,结束,初始化 数组起始地址BX 内循环次数N-1CX 外循环次数N-1DX,I=0,地址加2,两数位置交换,内循环计数CX-1,外循环计数DX-1,CX=0?,DX=0?,A,A,Y,N,N,N,Y,Y,图4-20 数组排序冒泡算法流程图,ADATASEGMENT BUFDW N,15,37,8600,0A768H DW3412H,1256H,76H ADATAENDS ASTACKSEGMENT STACK STACK;定义堆栈段 SADB 100 DUP(?) TOP LABEL WORD ASTACK ENDS ACODESEGMENT ASSUME CS:ACODE,D
25、S:ADATA,SS:ASTACK MAINPROC FAR START:MOV AX,ASTACK;将堆栈段段地址送SS MOV SS,AX MOV SP,OFFSET TOP;堆栈指针指向栈顶 PUSH DS ;为返回DOS作准备 SUB AX,AX PUSH AX,MOV AX,ADATA;将数据段段地址送DS MOV DS,AX MOV BX,0;指向BUF第一个字 MOV CX,BUFBX DEC CX ;设计数器CX,内循环次数 L1:MOV DX,CX ;设计数器 DX,外循环次数 L2:ADDBX,2 MOV AX,BUFBX;取BUFI CMP AX,BUFBX+2;若BUF
26、I BUFI+2转 JBE CONTI XCHG AX,BUFBX+2;否则两数交换 MOV BUFBX,AX CONTI:LOOP L2 ;内循环 MOV CX,DX;外循环次数CX MOV BX,0 ;地址返回第一个数据 LOOP L1 ;外循环,RET MAINENDP ACODEENDS END START,四、子程序结构,1. 子程序使用,(1)功能描述:子程序的名称、功能及性能,(2)子程序中用到的寄存器和存储单元,(3)子程序的入口参数,出口参数,(4)子程序中调用其他子程序的名称,例4-74 有一个子程序说明如下: ;名称:BCD2BIN ;功能:将一个字节的的BCD码转换成
27、二进制数 ;所用寄存器:CX ;入口参数:AL存放两位BCD码 ;出口参数:AL存放二进制数 ;调其他子程序:无,子程序形式如下: BCD2BINPROC NEAR(FAR) PUSH CX MOV CH,AL AND CH,0FH;取BCD码低位 MOV CL,4 ;设置移位次数 SHRAL,CL;取BCD码的高位 MOVCL,10 MULCL ;高位10+低位 ADDAL,CH POPCX RET BCD2BIN ENDP,过程调用时,主程序使用CALL指令, 调用中要处理好三个问题:,1. 用寄存器传递参数:适合于参数较少的场合。,2. 用存储器传递参数:适合参数较多的场合,需要事先在存储器中建立一个参数表。,3. 用堆栈传递参数:适合参数较多的场合,尤其在子程序嵌套与递归调用的情况下,比较不容易出错。,例4-76 通过堆栈传递参数,实现十进制数数组求和,要求主程序和子程序不在同一代码段中,要进行段间调用。,源程序如下: MDATASEGMENT ARY1DB 20 DUP(?);定义数组1 SUM1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 从书中学会的成长心得分享(9篇)
- 电子商务平台运营方案优化策略工具
- 跨文化沟通与合作框架工具
- 企业信息数据化管理工具
- 河南省平顶山汝州市重点达标名校2026年初三下学期5月模拟考试语文试题含解析
- 四川省遂宁中学2026届初三第二学期月考英语试题试卷含解析
- 浙江省宁波镇海区六校联考2026届初三4月质量检查生物试题含解析
- 吉林省农安县新阳中学2025-2026学年初三5月检测试题语文试题含解析
- 资源开发合作契约承诺函(4篇)
- 2026年湖南省怀化市初三4月模拟考试(一模)语文试题含解析
- 餐厨废弃物综合处理项目突发环境事件应急预案
- 冷作工工艺展开放样
- 电信网络诈骗防范指南
- 2023年土地复垦技术标准
- 2024高考数学讲义:三角函数及其解题
- MOOC 跨文化交际通识通论-扬州大学 中国大学慕课答案
- 《低压配电设备安装与调试》课件 劳动 学习任务2 挂壁式配电箱安装与调试
- 入职申请表(完整版)
- 人教版2023七年级上册英语单词表
- 医院保洁员院感知识培训课件
- 招标邀请函模板范文
评论
0/150
提交评论