CH4(2) 汇编语言程序设计_第1页
CH4(2) 汇编语言程序设计_第2页
CH4(2) 汇编语言程序设计_第3页
CH4(2) 汇编语言程序设计_第4页
CH4(2) 汇编语言程序设计_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计第四章4.0概述4.1汇编语言程序格式4.2MASM中的表达式4.3

伪指令语句4.4程序设计方法4.5DOS系统功能调用4.4程序设计方法一、汇编语言源程序设计基本步骤

1、明确任务,确定算法。

2、画流程图。

3、分配存储空间及工作单元分析需要定义的段、变量、变量类型、长度;规划各寄存器的使用等

4、编写源程序(.ASM)、汇编(.OBJ)、连接(.EXE)。

5、程序调试。主要采用DEBUG来调试。开始执行框判断二、基本程序结构顺序结构分支结构循环结构子程序结构DATASEGMENT………DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX……………

MOVAH,4CHINT21HCODEENDS

ENDSTART……………顺序结构分支结构循环结构子程序结构顺序结构顺序结构分支结构循环结构子程序结构两个分支YN三个分支YYNN顺序结构分支结构循环结构子程序结构循环初始设置循环体循环条件判断?YNYN循环初始设置循环体循环条件判断?顺序结构分支结构循环结构子程序结构codeSEGMENT…begin:…CALL

sub1…

CALLsub2

…MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPcodeENDSENDbegin1、顺序结构例1:已知当前数据段中有一个十进制数字0~9的七段代码表,其数值依次为40H、79H、24H、30H、19H、12H、02H、78H、00H、18H。要求用XLAT指令将十进制数57转换成相应的七段代码值,存到BX寄存器中,编写完整的汇编源程序。分析:先求5的七段代码值,再求数字7的;需定义数据段、七段代码表:TAB,字节变量;关键指令XLAT,表偏移地址放BX,原数字放入AL;三、程序举例源程序清单:DATASEGMENTTABDB40H,79H,24H,30HDB19H,12H,02H,78HDB00H,18HDATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

(转右)

MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART

MOVBX,OFFSETTAB

MOVAL,5XLATMOVAH,ALMOVAL,7XLATMOVBX,AX2、分支结构程序根据不同条件选择不同处理方法三、程序举例例2:求内存中数X的绝对值,并送回原处2.根据以上分析画出流程框图3.根据流程图确定所用寄存器,并编写源程序;需定义数据段、变量X、使用寄存器AL1.分析:XX-0X0X<0|X|=

程序框图及清单:开始从内存取数X0?

对X求负并回送结束YN

DATASEGMENT

XDB?

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;MOVDS,AX将数据段段地址送入DSMOVAL,[X]CMPAL,00H

;与0比较JGERETURNNEGAL

;求负MOV[X],AL

;回送结果RETURN:MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART

;结束源程序3、循环结构两种形式:1)“先执行,后判断”:进入循环后至少要执行一次循环体,再判断循环是否结束。---用于循环次数固定的程序(简单)(掌握)2)“先判断,后执行”:进入循环后,先判断循环结束条件,再决定是否执行循环体,可能循环体一次也不执行。

---用于循环次数不确定的程序三、程序举例(a)“先执行,后判断”结构(b)“先判断,后执行”结构初始化部分入口循环体修改参数出口循环条件?YN初始化部分入口循环体修改参数出口YN循环条件?两种循环结构都包括四部分:1)初始化---设置计数值、地址指针2)循环体---循环部分的核心:循环的全部执行指令3)修改参数---改地址指针,为下次循环做准备4)循环控制---修改计数值,进行判断(LOOP)例3:将附加段起始地址为DA1的100个字节的存储区内容清0。DATASEGMENTDA1DB100DUP(?)DATAENDSCODESEGMENT

ASSUMECS:CODE,ES:DATASTART:MOVAX,DATAMOVES,AX

(转右边)

MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART读程序:分析程序执行过程、功能及特点

MOVAL,00HMOVCX,0064HLEABX,DA1;初始化LP:MOVES:[BX],AL;循环体INCBX;修改参数

LOOPLP;循环控制

例4:编程在一串给定个数的数据区BUFF中寻找最小数,结果存放至MIN单元中!(循环+分支结构)

DATASEGMENTBUFFDB42H,56,34,-5,-9,-78CONTEQU$-BUFFMINDB00H

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(转下页)

MOVAH,4CH

INT21HCODEENDSENDSTART

LEABX,BUFFMOVCX,CONTMOVAL,[BX];初始化LP:CMPAL,[BX];循环体

JLENEXTMOVAL,[BX]NEXT:INCBX;修改参数LOOPLP;循环控制

MOVMIN,AL作业补充在BLOCK开始有一个字节型数组,共有15个元素,利用汇编语言编写完整的程序,计算这个数组中奇数的个数,并将结果存入内存SUM单元。

例5:数据段从BUFF开始有一字数组,存放N个有符号数据,编程将数据按从小到大排序!(双重循环)

DATASEGMENTBUFFDW

42H,56,34,-5,-9,-78NEQU($-BUFF)/2

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(转下页)

MOVAH,4CH

INT21HCODEENDSENDSTART

MOVCX,N-1LPW:MOVBX,00HMOVDX,CX;初始化LPN:MOVAX,BUFF[BX];循环体CMPAX,BUFF[BX+2]

JLENEXTXCHGAX,BUFF[BX+2]MOVBUFF[BX],AXNEXT:ADDBX,2;修改参数DECDX;循环控制JNZLPNLOOPLPW

;循环控制(转右边)思考:1、若为无符号数?2、若要求原数据不变?4、子程序结构子程序:能完成特定功能而又经常用到的程序段,编写成独立的模块,供其它程序调用,称为子程序或过程。子程序结构的定义:使用过程定义语句PROC…ENDP。子程序属性:调用程序和过程在同一代码段中,则用NEAR属性;调用程序和过程不在同一代码段,使用FAR属性。三、程序举例过程调用和返回调用指令:CALL过程名返回指令:RET子程序说明:⑴功能描述:名称,功能⑵子程序中用到的寄存器和存储单元⑶子程序的入口参数,出口参数⑷调用其它子程序的名称子程序结构段内调用格式codeSEGMENT…begin:…CALL

sub1…

CALLsub2

…MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPcodeENDSENDbegin子程序结构段间调用格式(自学)codeSEGMENT…begin:…CALL

FARPTRsub1…MOVAH,4CHINT21HcodeENDScode1SEGMENT…sub1PROCFAR…RETsub1ENDPcode1ENDSENDbegin子程序设计注意以下三点:⑴保护调用程序的断点:由CALL指令本身完成。⑵保护某些寄存器内容(非入口/出口参数):在子程序开头,用一组PUSH指令,保护寄存器原来的内容;在子程序结尾,用一组POP指令,将寄存器原来的内容恢复。⑶主程序和子程序间的参数传递。入口参数:子程序所需的初始数据。(调用时)

出口参数:子程序运行所得结果。(返回时)参数传递常用的方法:①用寄存器传递参数:参数较少,速度较快。②用存储器传递参数:参数较多;

调用前,将参数存入内存,将参数首地址送入某一寄存器(BX、SI、DI、BP)。进入过程后可采用寄存器间接寻址方式从内存中取出。③用堆栈传递参数:参数较多,多用在子程序嵌套与递归调用中。例6:数据段定义两个字型数组,编程序实现数组分别求和(不计溢出),要求用子程序实现求和。解:通过存储器来传递参数。子程序说明如下:子程序名:SUB_SUM功能:求一数组之和所用REG:AX入口参数:数组地址指针SI、

数组长度存于CX出口参数:结果在AX中读程序:分析程序执行过程、功能及特点DATA SEGMENTARY1 DW100DUP(?) ;定义数组1SUM1DW?ARY2 DW100DUP(?) ;定义数组2SUM2 DW?DATAENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,AX(转下页)LEASI,ARY1;数组1首地址,入口参数MOVCX,LENGTHARY1;数组1长度,入口参数CALLSUB_SUM

;调用求和子程序MOVSUM1,AX;数组1之和送SUM1LEA SI,ARY2;数组2首地址,入口参数MOVCX,LENGTHARY2;数组2长度,入口参数CALLSUB_SUM

;调用求和子程序MOVSUM2,AX;数组2之和送SUM2MOVAH,4CHINT21H(转下页)SUB_SUMPROC NEAR

;子程序

XORAX,AX;AX清0L1:ADDAX,WORDPTR[SI];加数组元素

INCSIINCSILOOPL1

RET

;子程序返回SUB_SUMENDP

CODE ENDSEND START4.5DOS系统功能调用一、DOS中断和BIOS中断

DOS操作系统或ROMBIOS程序提供的一组子程序,用“INTN”指令调用。DOS中断:DOS操作系统提供,位于系统磁盘,主要用于I/O设备管理、目录及文件管理。BIOS中断:ROM提供,位于内存,主要用于系统加电自检、引导装入初始化程序等。二、DOS中断(占用类型号即N为:20H~3FH)DOS专用中断:INT22H,INT23H,INT24H

不能直接调用DOS可调用中断:

INT20H,INT21H,INT25H等一定条件下调用最常用的:INT21H

称为:DOS系统功能调用

21H为子程序的总入口,进入后可调用各种功能。详见“附录F,P508”表4.6DOS常用的软件中断命令CF=0成功CF=1出错CF=0成功CF=1出错相应出口号无出口参数DS:DX=程序长度驻留退出INT27HAL=驱动器号CX=写入扇区数DX=起始逻辑区号DS:BX=内存缓冲区地址写磁盘INT26HAL=驱动器号CX=读入扇区数DX=起始逻辑区号DS:BX=内存缓冲区地址读磁盘INT25H出错退出INT24HCtrl-Break处理INT23H结束退出INT22HAH=功能号,相应入口号系统功能调用INT21H无程序正常退出INT20H入口参数功能软中断命令程序前缀ProgramSegmentPrefix256个字节安排三、DOS系统功能调用的步骤及实例步骤:

1.设置入口参数

2.将功能号放入AH寄存器

3.使用指令INT21H转入子程序入口

4.获得出口参数,分析结果一般:2、3步必须有;1、4视情况而定DOS系统功能调用实例

以DOS键盘功能调用、DOS显示功能调用为例

1、单字符输入(1号功能)

2、字符串输入(0A号功能)

3、单字符显示(2号功能)

4、字符串显示(9号功能)1、单字符输入(1号功能)功能:从键盘输入一个字符到AL中,并回显入口参数:无出口参数:AL=ASCII码例:程序段

………MOVAH,01HINT21H………等待键入字符;若键‘A’,则屏幕上显示‘A’;且AL=41H2、字符串输入(0A号功能)功能:多个字符输入到缓冲区入口参数:DS:DX=输入缓冲区首地址出口参数:DS:DX=输入字符串所在缓冲区地址缓冲区定义格式:第1字节:设定允许输入字符的最大个数第2字节:预留,系统最后自动填入实际输入的字符数第3字节:开始存放输入的字符,至‘回车’键结束例:从键盘输入字符串至缓冲区BUFF………BUFFDB32DB?DB32DUP(00)………

MOVAX,SEGBUFFMOVDS,AXLEADX,BUFFMOVAH,0AHINT21H………执行结果分析:若键入WELCOME<Enter>则:屏幕每键入一个字符,光标右移一次;最后显示:WELCOME字符串内存情况如右图:……BUFF207‘W’‘E’‘L’‘C’‘O’‘M’‘E’0D3、单字符显示(2号功能)功能:在屏幕上显示一个字符入口参数:DL=ASCII码出口参数:无例:在屏幕上显示字符A………MOVDL,‘A’MOVAH,2HINT21H………4、字符串显示(9号功能)功能:多个字符输出到屏幕显示入口参数:DS:DX=输出字符缓冲区首地址出口参数:无注意:字符串以‘$’结束例:在屏幕上显示一串字符‘Howdoyoudo?’

DATASEGMENTBUFFDB‘Howdoyoudo?’,‘$’DATAENDSCODESEGMENT ASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX

LEADX,BUFFMOVAH,9INT21H ……思考:若该字符串定义在附加段,应如何修改程序?5、返回DOS操作系统

……

MOVAH,4CHINT21H……4.4.5综合举例

1.代码转换例4.67

将十六位二进制数转换成4位压缩型BCD码算法:将AX中的二进制数先后除以1000、100和10,每次除法所得的商,即是BCD码的千位、百位和十位数,余数是个位数。;子程序名:B2TOBCD;输入参数:AX=十六位二进制数;输出参数:CF=0,则AX=4位压缩型BCD码。CF=1,则要转换的数大于9999,AX不变。;使用寄存器:CX:存放除数,DX:存放中间结果B2TOBCDPROCFARCMPAX,9999JBETRANS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论