版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
汇编语言程序设计
教学目标:掌握常用程序设计方法和保护方式下的编程、模块化程序设计以及汇编语言和C语言的混合编程。教学重点:循环程序设计教学难点:循环程序设计
5.1顺序程序设计
C.Bohm在1966年就提出:每个程序都由三种基本结构组成:◆
顺序结构:按先后顺序执行的语句体;◆
选择结构:根据条件选择两个或若干个分支之一来执行的语句结构;◆
重复结构:满足条件重复执行某个语句体的语句结构。这三种控制结构的一个共同点就是:每种结构只有一个入口和一个出口。顺序结构是程序设计中最简单最基本的结构,在顺序结构中程序的执行流程按各条指令存储的先后顺序依次进行,不产生分支和转移。5.2分支程序设计分支程序有单路分支、两路分支和多路分支,如下图所示,它们相当于高级语言中IF-THEN、IF-THEN-ELSE和CASE语句。1.用转移指令实现分支
分支程序——判断标志位的状态是否满足条件来实现流程的分支。
因此,在一条对FL状态标志位产生影响的指令后面,用判断标志位状态的条件转移指令都可能使程序产生分支。
无条件转移指令也使程序产生分支,为使程序流程清晰,无条件转移指令应尽量少用,多用将破坏程序的结构。编程举例:对ASCII字符串加偶校验计算机系统中常用一个字节的七位(D6~D0)表示
ASCII字符,余下的最高位(D7)用作奇偶校验(paritycheck)位。所谓的奇(或偶)校验,就是对奇偶校验位(D7)赋“1”或“0”以使每字节8bit中“1”的总数为奇(或偶)数个;通过检查数据的奇偶性来判断其在传送、存储过程中是否正确。设从STRING单元开始存放一个ASCII字符串,已知字符串以ASCII码24H(字符"$")结束,请编程对该字符串加偶校验。具体作法是:取出一个字符,判断其是否为$,若是则结束;否则先将D7位置“1”,再判奇偶标志PF,若PF=1(偶)则将已加偶校验的数送回原单元,若PF=0(奇)则说明原数中“1”的个数已为偶数,所以原单元的内容不变;重复以上操作,直到结束。按照以上算法(请读者画出流程图)编制程序如下。DATA SEGMENTSTRING DB36H,57H,73H,56H,29H,96H,3EH,7FH,30H DB20DUP(?) DB'Thisisacomputor',24HDATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX LEA BX,STRING MOV DL,24H ;结束标志送DLAGAIN: MOV AL,[BX] CMP AL,DL ;与结束标志比较
JZ DONE ;AL为结束标志转结束
OR AL,80H ;把AL的D7值1
JNP NEXT ;PF=0(为奇)则转移至NEXT MOV [BX],AL ;为偶则送回已加校验的字符NEXT: INC BX ;指向下一单元
JMP AGAIN ;继续DONE: MOV AH,4CH INT 21HCODE ENDS END START2.用MASM6.x条件控制伪指令实现分支
MASM6.x引入了IF条件控制伪指令,类似于高级语言的分支语句功能。在汇编时,该伪指令语句自动展开,生成比较和条件转移指令序列,实现程序流程分支,简化了分支结构的编程。
条件控制伪指令语句格式如下(尖括号内是必选项,方括号内是可选项): .IF<条件表达式1>
┆{分支体1} ;条件1为真(非0),执行分支体1[[.ELSEIF<条件表达式2>
┆ {分支体2}] ;条件1为假,条件2为真,执行分支体2.ELSE
┆{分支体3}] ;条件1和条件2都为假,执行分支体3 .ENDIF5.3循环程序设计(续)1.用条件转移或循环控制指令实现循环
例:将十进制数BUFD转换成二进制数,存入BUFB。十进制数转换成二进制数可以用“按权展开相加”法。设AX中四位无符号BCD数的码元分别为ABCD,则其值为:A*103+B*102+C*10+D=(((0+A)*10+B)*10+C)*10+D。按照上面公式,先将四位十进制数保存到BX中;
AX作为中间结果(乘10加下一位BCD数)和最后结果的存储单元先清零;然后将BX中的高位BCD数移至DX(移4次,一位十进制数);
加到AX中,AX再乘10;如此反复4次(四位十进制数)。
乘10用加法进行:10x=2x+8x(x分别左移2位和3位再相加)。
因为加和乘都是按二进制运算规则进行的,所以最后在AX中得到转换后的二进制结果,将其存入BUFB单元。程序如下:.MODEL SMALL.386.DATA BUFD DW 5189H BUFB DW ?5.3循环程序设计(续) .CODE .STARTUPMOV BX,BUFD MOV AX,0 MOV CH,4 ;四位BCD数共需移位4次(控制外循环)
LOP1: MOV DX,0
MOV CL,4 ;移一位BCD数的移位次数(控制内循环)LOP2: ROL BX,1 ;分离十进制的各位(移一位BCD数)
RCL DX,1 DEC CL JNZ LOP2 ;一位BCD数移完否?未完继续
ADD AX,DX ;加下1位BCD数
CMP CH,1 ;CH=1则AX已加完最低位的BCD数
JZ DONE;加完最后一位BCD数就转DONE(结束)
ADD AX,AX ;开始做*10运算
MOV SI,AX ;存*2的结果
ADD AX,AX ;*4 ADD AX,AX ;*8 ADD AX,SI ;*8与*2相加
DEC CH ;外循环变量减1
JMP LOP1 ;未加完全部BCD数,再继续
DONE: MOV BUFB,AX ;存结果.EXIT0 ;返回操作系统
END5.3循环程序设计(续)例:将二进制数NUMB转换成十进制数NUMD设AX中为16位无符号二进制数,将其转换成BCD数的算法也可以用“按权展开”,具体计算公式为:(…((0+D15)*2+D14)*2+……+D1)*2+D0。
AX所能表达二进制无符号数范围为0-FFFFH,转换成十进制数后范围为0-65535,超出两字节,所以按通用情况考虑,结果要存放在DXAX中。将二→十转换先定义成一个过程BTOD——
◆AX保存到BX后清零,通过BX左移将二进制数的Di移入CF,执行指令ADC
AX,0来实现AX+Di;
◆再AX←AX*2;
◆反复做AX←AX+Di和AX←AX*2,前者做16次、后者做15次;
◆实际上要考虑转换结果超过16位,即达到五位十进制数,超过的部分放入
DX中,所以对DX也要像对AX一样做+CF进位标志和*2操作。
◆因为要得到十进制结果,所以每次相加之后都要进行十进制调整,但基本
集指令DAA只能对AL中的内容进行调整,为要对AX和DX中的内容进行调
整,在程序开始部分定义了一个宏“XDAX”,用DAA指令逐次完成之。
◆按题目要求,主程序将二进制数NUMB送到AX中,调用二→十转换的过程
BTOD,最后存DXAX中结果。 .MODEL SMALL .486 XDAX MACRO ;定义对AX和DX进行十进制调整的宏
DAA XCHG AH,AL ADC AL,0 DAA XCHG AH,AL XCHG AX,DX ADC AX,0 DAA XCHG AH,AL ADC AL,0 DAA XCHG AH,AL XCHG AX,DX ENDM .DATA NUMB DW 8AB9H NUMD DW ?,? .STACK .CODE .STARTUP MOV AX,NUMB CALL BTOD MOV NUMD,AX ;保存转换结果
MOV NUMD+2,DX .EXIT0 FBTOD LABEL FAR ;该过程也可为其他段调用(共享)
BTOD PROC NEAR MOV BX,AX MOV AX,0 MOV DX,0 MOV CX,16 ;+Di和*2反复做16次和15次
NEXT: ROL BX,1 ;CF←Di ADC AX,0 ;AX←AX+Di XDAX ;十进制调整
CMP CX,1 ;做完否?
JZ DONE ;加完16次则转DONE(结束返回)
ADD AX,AX ;低位部分AX*2 XDAX LOOP NEXT ;未完继续
DONE: RET BTOT ENDP END2.用MASM6.x循环控制伪指令实现循环
(1).WHILE——.ENDW伪指令语句格式: .WHILE<条件表达式> ;条件为真执行循环体┆{循环体} .ENDW条件表达式与条件控制语句中的相同。(2).REPEAT——UNTIL伪指令语句格式: .REPEAT ;重复执行循环体
┆{循环体} .UNTIL<条件表达式> ;直到条件为真结束循环(3).REPEAT——UNTILCXZ伪指令语句格式: .REPEAT
┆{循环体} .UNTILCXZ[条件表达式]语句中[条件表达式]是可选项,没有[条件表达式]将汇编成一条LOOP指令(重复执行直到CX减1后等于0),带[条件表达式]时循环结束的条件是CX减1后等于0或条件为真。(4)其它控制循环执行的伪指令语句.BREAK ;无条件退出当前循环.CONTINUE ;转入循环体的开始处,进入下一轮循环
例5-47求10!和1~10的整数和。用.WHILE——ENDW伪指令 用.REPEAT——UNTIL伪指令 ┆ ┆ MOV EAX,1 MOV EAX,1 MOV BX,0 MOV BX,0 MOV CX,1 MOV CX,1 .WHILE CX<=10 .REPEAT MUL CX MUL CX ADD BX,CX ADD BX,CX INC CX INC CX .ENDW .UNTIL CX>10 MOV MEMDD,EAX ;存阶乘积 MOV MEMDD,EAX MOV MEMWD,BX ;存累加和 MOV MEMWD,BX ┆ ┆5.4保护方式编程
32位微处理器只有工作在保护方式下,才能发挥其本身的强大功能。
在保护方式下:◆
32/36条地址线有效,可寻址4GB/64GB物理地址空间;◆
扩充的存储器分段和可选的分页机制,硬件上实现了存储器的保护和
共享,支持实现虚拟存储器;◆
支持多任务,可快速进行任务切换,实现任务环境的保护;◆
具有四个特权级和完善的特权检查机制,在进行资源共享的同时有效
地实现了任务隔离,保证代码和数据的安全;◆
支持虚拟86方式,在保护方式下可同时执行多个8086程序。1.方式的切换(1)切换到保护方式从实方式切换到保护方式,要设置相应的段描述符和全局描述符表GDT。为此,要先建立64位长的段描述符结构和48位长的伪描述符结构。
DESCRIPTORSTRUC ;段描述符共8个字节
LIMIT DW0 ;16位段界限
BASEL DW 0 ;段基址低16位
BASEM DB 0 ;段基址16~23位
ATTRIBUTES DW 0 ;16位段属性
BASEH DB 0 ;段基址24~31位
DESCRIPTORENDS
5.4保护方式编程(续)伪描述符在装入48位全局描述符表寄存器GDTR时要用到。
PDESCRIPTOR STRUC LIMIT DW 0 ;16位段界限
BASE DD 0 ;32位段基址
PDESCRIPTOR ENDS切换到保护方式,必须将控制寄存器CR0的第0位置1,打开A20地址线(在实方式下A19~A0有效,可寻址1MB存储空间),同时保证段间跳转将代码段的选择子装入到CS寄存器。为此分别定义了三个宏,如下所示。
TO_PROTECT MACRO ;使CR0.0置1的宏
MOV EAX,CR0 OR EAX,1 MOV CR0,EAX ENDM
ENABLE_A20 MACRO ;打开A20的宏
PUSH AX IN AL,92H OR AL,2 ;将D1置为1
OUT 92H,AL ;输出到92H端口,打开A20 POP AX ENDM
5.4保护方式编程(续)
JUMPFARMACROselector,offsets DB 0EAH ;JMP指令的机器码11101010
DW offsets ;偏移地址
DW selector ;段选择子
ENDM(2)切换回实方式切换回实方式,所做的操作与上述的相反。其中段间跳转的宏JUMPFAR的传递参数选择实方式下的段选择子和偏移量即可,只须再定义CR0.0清0和关闭A20的两个宏。
TO_REAL MACRO ;CR0.0清0的宏
MOV EAX,CR0 AND EAX,0FFFFFFFEH MOV CR0,EAX ENDM DISABLE_A20 MACRO ;关闭A20的宏
PUSH AX IN AL,92H AND AL,0FDH ;将D1清0
OUT 92H,AL ;输出到92H端口,关闭A20 POP AX ENDM2.保护方式编程举例
下面程序描述了如何从实方式转换到16位段的保护方式,以及再怎样返回实方式。.386P ;使用386指令集 DATA SEGMENT USE16 ;16位数据段
GDT LABEL BYTE ;定义全局描述符表,GDT为BYTE类型
EMPTY DESCRIPTOR{} ;第一个描述符是空的
CSEG DESCRIPTOR{0FFFFH,,,98H,} ;定义代码段描述符,32位段基址未设置
C_SEL=CSEG-GDT ;代码段描述符选择子
DSEG DEISCRIPTOR{0FFFFH,0,68H,92H,} ;数据段描述符
D_SEL=DSEG-GDT ;数据段描述符选择子
GDTLEN=$-GDT ;求GDT实际长度(+1)
VGDTRPDESCRIPTOR{GDTLEN-1,};伪描述符,其段界限为GDT的实际长度
;32位段基址未设置(暂为缺省值0)
DATA ENDS CODE SEGMENTUSE16 ;定义16位代码段
ASSUMECS:CODE,DS:DATA ;段关联2.保护方式编程举例(续)START:MOVAX,DATA MOVDS,AX MOVBX,16 MULBX ;在实方式下,段基址左移4位
ADDAX,offsetGDT ;得到全局描述符表GDT基址(32位)
ADCDX,0 MOVwordptrVGDTR.BASE,AX ;设置全局描述符段基址的低16位
MOVwordptrVGDTR.BASE+2,DX;设置全局描述符段基址的高16位 MOV AX,CS ;以下设置代码段
MUL BX MOV CSEG.BASEL,AX ;设置代码段段基址低16位
MOV CSEG.BASEM,DL ;设置代码段段基址16~23位
MOV CSEG.BASEH,DH ;设置代码段段基址24~31位
LGDT fwordptrVGDTR ;加载48位GDTR寄存器,使之指向GDT CLI ;关中断
ENABLE_A20 ;打开A20地址线
TO_PROTECT ;CR0.0置1,切换到保护方式
JUMPFARC_SEL,<offset_protect>;保护方式下段选择子和偏移
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金属打火机制作工岗前安全检查考核试卷含答案
- 盐斤分装设备操作工安全生产意识强化考核试卷含答案
- 锻压模具工安全技能强化考核试卷含答案
- 2026年活动庆典舞台设备租赁协议
- 会计结算试题及答案分析
- 《12 祝福》教案、导学案、同步练习
- 《贵州林东矿业集团有限责任公司百里杜鹃风景名胜区金坡乡红林煤矿(变更)矿产资源绿色开发利用方案(三合一)》评审意见
- 广州市广州市番禺区2021-2022学年七年级上学期期末生物试题(含答案)
- 4.1区域发展对交通运输布局的影响课件高中地理人教版必修二
- 城市轨道交通应急处理课件 项目五-任务5 列车自动防护(ATP)系统故障应急处理-信号设备故障应急处理
- 16.2 《六国论》课件(内嵌视频)2025-2026学年统编版高一语文必修下册
- 6S管理-机修间6S整理标准
- 四年级道德与法治这些东西哪里来教案统编版
- 《经济地理学》第五章 多部门企业(公司)区位 第1节
- YC/T 520-2014烟草商业企业卷烟物流配送中转站管理规范
- 马工程《刑法学(下册)》教学课件 第21章 侵犯财产罪
- GB/T 3452.1-2005液压气动用O形橡胶密封圈第1部分:尺寸系列及公差
- GB/T 27065-2015合格评定产品、过程和服务认证机构要求
- GB/T 20043-2005水轮机、蓄能泵和水泵水轮机水力性能现场验收试验规程
- 钢结构平台施工方案
- 2017年高中生物学联赛北京初赛竞赛试题
评论
0/150
提交评论