微机原理第4章_第1页
微机原理第4章_第2页
微机原理第4章_第3页
微机原理第4章_第4页
微机原理第4章_第5页
已阅读5页,还剩120页未读, 继续免费阅读

下载本文档

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

文档简介

第4章

汇编语言程序设计1主要内容汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计2§4.1汇编语言源程序了解:汇编语言源程序的结构汇编语言语句类型及格式3计算机的语言1.机器语言用二进制码表示指令和数据的语言。计算机能直接识别和执行。2.汇编语言用指令助记符、符号地址、标号和伪指令等来书写程序。3.高级语言接近人类的语言4一、汇编语言源程序结构51.汇编语言源程序与汇编程序汇编语言源程序汇编程序用助记符编写汇编程序汇编语言源程序机器语言目标程序源程序的翻译程序62.汇编语言程序设计与执行过程输入汇编语言源程序(EDIT)汇编(MASM)链接(LINK)调试(TD,DEBUG)源文件.ASM目标文件.OBJ可执行文件.EXE最终程序73.汇编语言源程序结构数据段名SEGMENT…数据段名ENDS附加段名SEGMENT…附加段名ENDS堆栈段名SEGMENT…堆栈段名ENDS代码段名SEGMENT…代码段名ENDS

END

8汇编语言源程序结构一个源程序由多个逻辑段组成。可以有多个代码段、多个数据段、附加段和堆栈段。一个源程序模块只能可以有一个代码段,一个数据段,一个附加段,一个堆栈段。源程序的结构框架:9段名1SEGMENT段名1ENDS段名2SEGMENT段名2ENDS段名NSEGMENT段名NENDS10二、汇编语言语句类型及格式111.汇编语言语句类型指令性语句指示性语句CPU执行的语句,能够生成目标代码CPU不执行,而由汇编程序执行的语句,不生成目标代码12指示性语句称:伪指令伪操作语句132.汇编语言语句格式

指令性语句:[标号:][前缀]助记符[操作数][,操作数]][;注释]指令的符号地址标号后要有冒号操作码注释前加分号14指示性语句格式[名字]伪指令助记符操作数[,操作数,…][;注释]变量的符号地址其后不加冒号指示性语句中至少有一个操作数153.标号、名字标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。由英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。 164.操作码指令码伪指令助记符指示汇编程序要完成的操作。作用:定义变量分配存储单元指示程序开始和结束等命令CPU要完成的操作175.注释用分号作为注释的开始;用于说明程序或语句的功能,以便于阅读和理解186.操作数寄存器存储器单元常量变量或标号数据项表达式19三.数据项及表达式201、常量数字常量,可用不同进制表示:B,D,H.字符串常量例:‘A’MOVAL,’A’例:’ABCD’汇编时被译成对应的ASCII码41H,42H,43H,44H用单引号引起的字符或字符串212、变量代表内存中的数据区,程序中视为存储器操作数变量的属性:变量所在段的段地址变量单元地址与段首地址之间的位移量。字节型、字型和双字型等段值偏移量类型223、标号代表一条指令的存储单元的符号地址。具有三种属性:段属性、偏移属性、类型(NEARFAR)。234、表达式求值的计算交给汇编程序完成

244、表达式算术运算逻辑运算关系运算取值运算和属性运算其它运算25算术运算和逻辑运算符算术运算符+,-,*,/,MOD逻辑运算符AND,OR,NOT,XOR例:MOVAL,8AND4MOVAL,8+4-126问题(1)变量和标号各有那三种属性?汇编语言有那几种语句类型?27关系运算符表示关系是否成立的运算符参与关系运算的必须是两个数值关系成立,结果=FFFFH关系不成立,结果=0。运算符:EQ,NE,LT,GT,LE,GE例:MOVAL,3LT428取值运算符取得其后变量或标号的偏移地址取得其后变量或标号的段地址

用于分析存储器操作数的属性OFFSETSEG29取值运算符例

MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATA

LEABX,DATA等价于30属性运算符用于指定其后存储器操作数的类型运算符:PTR例:

MOVBYTEPTR[BX],12HCALLDWORDPTR[BX]

(改变变量的属性)31其它运算符方括号:存储器操作数[]段重设符

段寄存器名:[]方括号中内容为操作数的偏移地址用于修改默认的段基地址32§4.2

伪指令掌握:伪指令的格式及实现的操作伪指令的应用33伪指令由汇编程序执行的指令,CPU不执行。作用:定义变量;分配存储区定义逻辑段;指示程序开始和结束;定义过程等。34常用伪指令数据定义伪指令符号定义伪指令段定义伪指令结束伪指令过程定义伪指令宏命令伪指令35一、数据定义伪指令用于定义数据区中变量的类型及大小格式:

[变量名]伪指令助记符操作数,…;[注释]表示符号地址定义变量类型定义变量值及区域大小361.数据定义伪指令助记符DB

定义的变量为字节型DW

定义的变量为字类型(双字节)DD

定义的变量为双字型(4字节)DQ定义的变量为4字型(8字节)DT定义的变量为10字节型37数据定义伪指令例DATA1DB11H,22H,33H,44HDATA2DW11H,22H,3344HDATA3DD22H,33445566H以上变量在内存中的存放形式38数据定义伪指令的几点说明伪指令的性质决定所定义变量的属性;定义字符串必须用DB伪指令,DW最多两个字符。例:

DATA1DB‘ABCD’,66H‘A’‘B’‘C’‘D’41H42H43H44H66H392.重复操作符DUP作用:为一个数据区的各单元设置相同的初值目的:常用于声明一个数据区格式:

[变量名]伪指令助记符nDUP(初值,…)n为重复次数,圆括号中为重复内容。可嵌套。例:

DW20DUP(0)

403.“?”的作用表示随机值,用于预留存储空间MEM1DB34H,’A’,?DW20DUP(?)预留40个字节单元,每单元为随机值随机数占1个字节单元41数据定义伪指令例M1DB‘Howareyou?’M2DW3DUP(11H),3344H

DB4DUP(?)M3DB3DUP(22H,11H,?)变量在内存中的分区42数据定义伪指令例M1‘H’‘o’‘w’‘‘‘a’M211H11H00H44H33H‘r’‘e’‘‘‘y’‘o’‘u’‘?’11H00H00H随机数M311H22H11H22H11H22HXXXXXXXXXXXXXX43二、符号定义伪指令1.格式:

符号名EQU 表达式操作:用符号名取代后边的表达式,不可重新定义例:

CONSTANT EQU 100

VAREQU30H+99HEQU说明的表达式不占用内存空间44二、符号定义伪指令2.符号名=表达式可对同一符号重新定义。45三、段定义伪指令说明逻辑段的起始和结束;说明不同程序模块中同类逻辑段之间的联系形态源程序由许多逻辑段组成,段定义伪指令定义逻辑段。46段定义伪指令格式段名SEGMENT[定位类型][组合类型][’类别’]

┇段名ENDS说明逻辑段的起点说明不同模块中同名段的组合和连接方式47定位类型(了解)PARA:段的起点从节边界开始(16个字节为1节)BYTE:段的起点从存储器任何地址开始WORD:段的起点从偶地址开始PAGE:段的起点从页边界开始(256个字节为1页)48组合类型(了解)与其它模块中的同名段在满足定位类型的前提下具有的组合方式:NONE:不组合PUBLIC:依次连接(顺序由LINK程序确定)COMMON:覆盖连接STACK:堆栈段的依次连接AT表达式:段定义在表达式值为段基的节边界MEMORY:相应段在同名段的最高地址处。第1个为MEMORY,其他为COMMON49类别(了解)不同模块连接时将相同类别的段放在连续的内存区域中50段定义伪指令例DATASEGMENTPUBLIC‘CODE’MEM1DB11H,22HDATAENDSPUBLIC依次连接51四、设定段寄存器伪指令说明所定义逻辑段的性质,段名与段寄存器联系起来.格式:

ASSUME段寄存器名:段名[,段寄存器名:段名,…]52段寄存器的初始化除CS自动装入外,其他由用户装入段地址。53五、结束伪指令表示源程序结束格式:

END[标号]54五、结束伪指令标号表示程序执行的开始。END将标号的段地址和偏移地址分别装入CS和IP中。55一个完整源程序结构例DSEGSEGMENTDATA1DB1,2,DATA2DW1234HDSEGENDSESEGSEGMENTDB20DUP(?)ESEGENDSSSEGSEGMENTSTACK‘STACK’DB200DUP(?)SSEGENDS56一个完整源程序结构例

CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG,SS:SSEG

START:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AX┇CSEGENDS

ENDSTART源程序代码57六、过程定义伪指令用于定义一个过程体格式:

过程名PROC[NEAR/FAR]┇RET

过程名ENDPNEAR是默认类型,可以省略。可以嵌套。P162例过程入口的符号地址58嵌套NAME1PROCFAR………..CALLNAME2…….RETNAME2PROC……RETNAME2ENDPNAME1ENDP59例4-6编写1个10ms延时的子程序。程序段:DELAY

PROC

PUSHBXPUSHCXMOVBL,260例4-6NEXT:MOVCX,4167W10MS:LOOPW10MSDECBLJNZNEXTPOPCXPOPBXRETDELAY

ENDP61问题:程序1)功能

?1)

DATASEGMENTARTDW87H,18H,26H,34H,66H,……….SUMDW?

DATAENDS

CODESEGMENTASSUMECS:CODE,DS:DATA

START:MOVAX,DATA;MOVDS,AX;MOVCX,0032H;62程序1)功能?MOVBX,OFFSETART;MOVAX,0;NEXT:ADDAX,[BX];INCBX;INCBX;

LOOPNEXT;MOVSUM,AX;

CODEENDSENDSTART该程序的功能什么。63程序2)功能?

2)DATASEGMENTBUFFDW100DUP(?)BUFF2DW100DUP(?)

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA64程序2)功能?STARTPROCFAR

PUSHDS;返回DOS做准备MOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVES,AX65程序2)功能?L1:LEASI,BUFFLEADI,BUFF2CLDMOVCX,100

REPMOVSWSTARTENDP

CODEENDSENDSTART66七、宏命令伪指令

源程序中由汇编程序识别的具有独立功能的一段程序代码格式:

宏命令名MACRO<形式参数>

┇

┇ENDM宏体P163例宏67例4-7p163两个数的和的宏定义和宏调用。宏定义:DADDMARCOX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDM68例4-7调用:DADDDATA1,DATA2,SUM宏展开:MOVAX,DATA1ADDAX,DATA2MOVSUM,AX宏调用与过程调用的差别:替换、不节省内存、执行速度快。69八、其它伪指令

段内程序代码或变量的起始偏移地址格式:

ORG表达式例:

ORG2000H计算值为非负常数ORG70ORGDATASEGMENT

ORG100HARTDB12H,34H,67HDATAENDSMOVBX,OFFSETART

BX=?71其它伪指令(了解)NAME为目标程序设定一个名字格式:

NAME模块名TITLE为程序清单指定打印标题格式:

TITLE标题名可以缺省72完整程序结构的例4--8DATASEGMENTTABLEDB12H,23H,34H,45H,56HDB67H,78H,89H,9AH,0FDHSUMDW?DATAENDS;CODESEGMENT73例4-8ASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,TABLEMOVCX,10XORAX,AX

74例4-8NEXT:ADDAL,[SI]ADCAH,0INCSI

LOOPNEXTMOVESUM,AXHLTCODEENDSENDSTART75作业4.14.24.1576§4.3功能调用DOS功能调用BIOS功能调用用软中断指令INTn来实现。77DOS功能调用包含多个子功能的功能包,用软中断指令调用,中断类型码固定为21H;各子功能采用功能号来区分。附录D78DOS功能调用设备管理目录管理文件管理其它79DOS功能调用调用格式:

MOVAH,功能号<置相应参数>

INT21H80一、单字符输入功能号为1、7、8(7、8无回显)调用方法:

MOVAH,01INT21H输入的字符在AL中81单字符输入例GET_KEY:

MOV AH,1

INT 21H

CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY

YES:┇ NO: ┇交互式应答程序82二、字符串输入注意问题:调用格式字符输入缓冲区的定义831.调用格式

功能号OAH字符串的输入缓冲区存放地址INT21HAHDS:DX842.定义字符缓冲区用户自定义缓冲区格式:N1N2整个缓冲区最大可键入字符数实际键入字符数存放键入的字符存放字符个数:≤6553385输入字符串程序段DAT1DB20,?,20DUP(?)┇

LEADX,DAT1MOVAH,0AHINT21H在数据段中定义86输入缓冲区14H?20个字节定义后的输入缓冲区初始状态:87三、单字符显示输出功能号O2H、06H待输出字符INT21HAHDL88单字符显示输出例MOV AH,02MOV DL,41HINT 21H

执行结果:屏幕显示A89四、字符串输出显示

功能号O9H待输出字符串的偏移地址INT21HAHDS:DX90字符串输出显示被显示的字符串必须以‘$’结束,且所显示的内容不应出现非可见的ASCII码.字符串结束前可加回车与换行的ASCII码0DH与OAH。91字符串输出显示例DATA SEGMENTMESS1DB‘InputString:’0DH,0AH,’$’DATAENDSCODESEGMENT

┇MOV AH,09MOV DX,OFFSETMESS1INT 21H

┇92§4.4汇编语言程序设计设计步骤:根据实际问题抽象出数学模型确定算法画程序流程图分配内存工作单元和寄存器程序编码调试93程序流程图符号起始:功能:判断:子过程:94问题(3)说明程序段功能并说明程序段完成什么功能。

SORTPROCFARPUSHDXPUSHAXMOVDX,08EAHCOM1:INAL,DX95说明程序段功能问题TESTAL,80H

JZCOM1;b7=0MOVDX,08E8H;b7=1INAX,DXMOVBUFF,ALPOPAXPOPDXRETSORTENDP96汇编语言程序结构顺序结构.P172例4--14循环结构.P176先判定型后判定型分枝结构.P173单分枝多分枝子程序结构.P17897顺序结构例4—14(1)编写计算S=86H*34H-21H的程序。三个操作数是无符号数,结果是字类型。DATASEGMENTNUMDB86H,34H,21H;三个操作数RESULTDW?;存结果DATAENDS98例4—14(2)CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,NUMLEADI,RESULT99例4—14(3)MOVAL,[SI]MOVBL,[SI+1]MULBL;AX86H*34HMOVBL,[SI+2]MOVBH,0;BX21HSUBAX,BXMOV[DI],AXMOVAH,4CH;返回DOSINT21HCODEENDSENDSTART100分枝结构根据不同的条件转移到不同的程序段执行。基本结构P174图4--5101例4—16(1)

以BUFFER为首地址的100个字节清零。DATASEGMENTBUFFERDB100DUP(?) COUNTDW100;数据区长度DATAENDS;STACKSEGMENTDW32DUP(?)STACKENDS

102例4—16(2)CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;装填DS,SSMOVDS,AXMOVAX,STACKMOVSS,AXMOVCX,COUNT

LEABX,BUFFER

ADDCX,BX103例4—16(3)AGAIN:MOVBYTEPTR[BX],0;清0INCBXCMPBX,CX

JBAGAIN;BX<CXMOVAH,4CH;BX=CXINT21HCODEENDSENDSTART104循环结构由三部分组成:循环初始化、循环体、循环控制。两种类型:1.先执行循环体,再判断条件

2.先检查条件,再是否执行循环体。

P176图4--6105例4--18100个无符号数从小到大排列。是一个双重循环程序。106例4—18(1)DSEGSEGMENTMEMDW100DUP(?)DSEGENDS;107例4—18(2)CSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AX

LEADI,MEMMOVBL,99108例4—18(3)外循环开始NEXT1:MOVSI,DIMOVCL,BL109例4—18(4)内循环开始NEXT2:MOVAX,[SI]ADDSI,2CMPAX,[SI]JNCNEXT3;大于,不交换MOVDX,[SI];交换MOV[SI-2],DXMOV[SI],AXNEXT3:DECCLJNZNEXT2内循环完110例4—18(5)DECBLJNZNEXT1外循环完MOVAH,4CHINT21HCSEGENDSENDSTART111子程序设计注意三点:参数的传递。相应寄存器的内容的保护。子程序可以嵌套。112例4—19(1)从一个字符串中删除一个字符。利用堆栈的方式实现参数的传递$是地址计数器,当前位置。DATASEGMENTSTRINGDB‘EXXPERINCE’LENGDW$-STRINGKEYDB‘X’DATAENDS113例4—19(2)CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVES,AX

LEABX,STRINGLEACX,LENG114例4—19(3)

PUSHBXPUSHCXMOVAL,KEY

CALLDELCHARMOVAH,4CHINT21HMAINEND115例4—19(4)

DELCHARPROC

PUSHBPMOVBP,SP;BP指向栈顶

PUSHSIPUSHDICLDMOVSI,[BP+4]116例4—19(5)MOVCX,[SI];取串长MOVDI,[BP+6];STRING的地址

REPNESCASB;找字符

JNE

温馨提示

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

评论

0/150

提交评论