微机原理——汇编语言程序设计基本方法_第1页
微机原理——汇编语言程序设计基本方法_第2页
微机原理——汇编语言程序设计基本方法_第3页
微机原理——汇编语言程序设计基本方法_第4页
微机原理——汇编语言程序设计基本方法_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言程序设计基本方法第四章 汇编语言程序设计基本方法41 汇编语言基本概念汇编语言与机器语言4.1.1 编语言与机器语言 汇编语言是用意义明确的助记符来表示指令的操作码、操作数。汇编语言是面向机器的语言,不同的机器有不同的汇编语言。用汇编语言编写的程序具有执行速度快、占用存储空间小、实时性能好等待点。汇编语言放大量用于编写计算机系统程序、实时控制程序等。 用汇编语言编写的程序称为汇编语言源程序(简称汇编语言程序)。计算机必须将汇编语言程序翻译成由机器代码组成的目标程序才能执行。这个翻译过程称为汇编。自动完成汇编过程的软件叫汇编程序。汇编语言的语句有两种基本类型:指令与伪指令。4.1.2 编

2、语言中语句的组成名称空格:操作助记符空格操作数;注释例如: CYCLE: ADD AX ,02;(AX)ß(AX)+02 DATA1 DB 20H,30H,40H,50H1 名称 1)组成名字的字符(1)字母AZ(2)数字0一9;(3)专用字符?、. 、_、$ 2)组成名称的规则 (1)除数字0一9外所有字符都可以放在名字的第一个位置。(2)使用字符“时必须放在名字的第一个位置。(3)名字最多可以使用31个字符、汇编程序不能识别多余的字符。3)以冒号分割时,名称是一个标号;以空格分割时,名城既可以使标号,也可以是变量。2 操作助记符(助记符)操作助记符将指出该语句的基本操作功能。必须

3、存在。操作符可以是指令、伪指令或宏指令的助记符。3 操作数操作数可以表示数字本身,也可以是指出如何获得操作数的信息。操作数不是必需的,操作数多于两个时,中间用逗号分割,操作数与操作助记符之间必须用空格分割。4 注释近用作语句或程序的说明,不产生目标代码。411 汇编语言中的常数与表达式1 常数B:表示二进制数 10110011BD:表示十进制数179D或179O:表示八进制数263OH:表示十六进制数B3H用单引号“”括起来的一串字符称为字符串常量2 表达式表达式由操作数和操作符组成操作数可以是常数或标识符、表达式操作符:算术操作符、关系操作符、属性操作符及其它操作符等() 算术操作符:、,双

4、操作数操作符,操作数必须为数字操作数,的两个操作数必须都为正整数。例如:79 MOD 16 0B5H MOD 10H() 逻辑操作符:(与)、(或)、(非)、(异或)。操作数必须为两个数字,按位运算。例如: 11001100B AND 11110000B结果:11000000B11001100B OR 11110000B结果:11111100BNOT 11110000B结果:00001111B11001100B XOR 11110000B结果:00111100B注意:逻辑操作符同时也是逻辑运算指令的操作助记符。例如:AND AL,0CH OR 0FH() 关系操作符:(相等)、(不等)、(小于

5、)、(大于)、(不大于)、(不小于);关系运算的操作数必须为数字,当关系成立时,其结果为全;当关系不成立时,其结果为全。汇编语言中表达式不能单独构成语句,只能是语句的一部分。例如:MOVAX,BUF+2ADDAL,VAL AND 0FHJMPAGAIN+3MOVBL,VB LE VA412 标号、变量及伪指令1 标号标号是由标识符表示的指令的名称,指示对应指令的位置(地址)。标号的三个属性:段地址、偏移地址和类型。标号的类型属性:和;:段内使用;:段间使用标号定义的基本方法:指令的助记符前加上标识符和冒号,例如:2 变量() 变量的定义变量通过伪指令定义:变量名表达式;定义字节变量变量名表达式

6、;定义字变量变量名表达式;定义双字变量变量名表达式;定义长字变量变量名表达式;定义一个十字节变量变量名是一个标识符,变量的类型与关键字、有关。表达式的表示: 一个或多个常数或表达式 带引号的字符串 一个问号“?” 重复方式重复次数(表达式)例如:DATA1DB20HDATA2DW0204H,1000HDATA3DB(-1*3),(15/3)DATA4DD12345HDATA5DB 0123DATA6DWAB,C,DDATA7DB?DATA8DD?DATA9DB 5 DUP(00)DATA10DW3DUP(?)“?”:表示其值不确定当表达式的值为字符串时,字节类型与字类型不同处理。图4.1 P5

7、7页 () 变量的属性 段地址(SEG):变量所在段的段地址 偏移地址(OFFSET):变量所在段内的偏移地址。 类型(TYPE):变量所占据的字节数DBà1 DWà2 DDà4 DQà8 DTà10 长度(LENGTH):一个变量明所定义的变量的个数,用DUP为重复的个数。 大小(SIZE):类型与长度的乘积前三个为主属性,后两个为辅助属性变量名段地址偏移地址类型长度大小DATA1DATA2DATA3DATA4DATA5DATA6DATA10413 属性操作符及表达式1 获取属性的操作符SEG(变量名或标号)所在段的段地址OFFSET(变量名

8、或标号)再段内的偏移量TYPE(变量名或标号)类型LENGTH(变量名)长度SIZE(变量名)大小例如:SEG DATA1OFFSET DATA1LENGTH DATA6TYPE DATA6SIZE DATA9 例如:MOVAX, SIZE DATA9MOVAX, SEG DATA1MOVBL,TYPE DATA 例如: DAT1DB02H DAT2DW 0F00H DAT3 DW5 DUP(?) DAT4DB LENGTH DAT3;存放变量DAT3的长度5 DAT5DW DAT3;2 PTR操作符格式:类型PTR表达式类型:BYTE WORD DWORD NEAR FAR功能:重新定义已定

9、义的变量或标号的类型MOVBYTEPTR DAT3AL42 8086/8088指令系统指令类型:() 数据传送指令() 算术运算指令() 逻辑运算指令() 移位指令() 标志处理指令和CPU控制指令() 转移和循环控制指令() 调用和返回指令() 字符串操作指令() 输入、输出指令421 数据传送类指令通用传送指令包括:传送指令、进栈指令、出栈指令和交换指令。1 传送指令(MOV)MOVDST,SRC(DST)ß(SRC)其中SRC表示源操作数,DST表示目的操作数。功能:将源操作数SRC的一个字节或一个字传送到目的操作数DST所指单元。源操作数:通用寄存器、段寄存器、立即数和内存单

10、元。目的操作数:通用寄存器、段寄存器和内存单元。(1) 累加器和存储器单元之间的传送(2)存器之间的传送() 寄存器和存储器单元之间的传送() 立即数传送() 段寄存器和通用寄存器之间的传送() 段寄存器和存储器单元之间的传送例如:MOVAX,BXMOVAL,DLMOVAX,02MOVSI,BXMOVAL,4DIMOVAX,BX+2MOVBXDI,DX重点讲述后三条指令 又例如:变量的定义:DATA1DW20H,30HDATA2DB 50H,60H,70HDATA3 DW 10H DUP(?)相应传送指令: MOVAX,DATA1MOVDATA3,BXMOVAL,DATA2DIMOVDATA3

11、SI,DXMOVCX,LENGTH DATA3MOVBX,SIZE DATA3MOVSI,OFFSET DATA2指令中传送的是一个字还是一个字节,通常由操作数的类型确定。下列指令中,没有确定的类型,是错误的。MOVDATA3SI,02HMOV2SI,ALMOV4DI,02可以采用如下方式纠正: MOVBYTE PTR 4DI,02如果两个操作数的类型不一致,也是错误的: DATA1DW05H DATA2DB 0FH,10H,0AH DATA3DB 5 DUP(?) MOVAX,BL MOV AL,DATA1 MOVBX,DATA3SI可以采用如下方式纠正: MOVAL,BYTE PTR DA

12、TA1内容归纳:() 两操作数进行数据传送的正常通路() 寄存器间接寻址、寄存器相对寻址、基址变址寻址和基址变址相对寻址方式只能使用变址寄存器DI,SI和基址寄存器BX,BP。() 寄存器相对寻址和寄存器基址变址相对寻址方式的位移量DISP可以是常量、变量,并且有多种素、书写方式MOVAX,DISPBXMOVAX,BX+DISPMOVAX,BX.DISPMOVAX,BX+DISP (4) 段寄存器不是DS,而是ES时,用如下方式表示: MOVAX,ES:SI对BP寄存器 MOVAL,DATA2BP;对应DS段 MOVAL, 10BP; 对应SS段2 取有效地址指令(LEA)功能:将源操作数SR

13、C的有效地址(偏移地址)送入寄存器REG中。MOVAX,10HDILEAAX,10HDI上面两条指令的功能是完全不同的。一个取数值,一个取偏移地址。下面的指令也可以使用:LEADI,DATA1LEABX,AGAIN下面两条指令等价:MOVAX,OFFSETDATA1LEAAX,DATA13 取地址指针指令(LDS,LES)功能:将源操作数SRC的有效地址所对应的内存单元中的32位内容分别送到DS(或ES)和指令中所指出的寄存器REG中。TABLEDB10H,20H,30H,40H,50HPOINT1DD02001000HPOINT2DDTABLELDSDI,POINT1LESSI,POINT2

14、只能用于DI和SI两个段寄存器。4 标志传送指令(LAHF,SAHF)LAHF:PSW中低8位内容送入寄存器AHSAHF:将AH中的8位内容送入标志寄存器的低8位中。5 数据交换指令(XCHG)功能:完成寄存器与寄存器或寄存器与存储单元之间内容交换。要求:两个操作数必有一个寄存器(非段寄存器)XCHGAX,BXXCHGCX,DIXCHGBX,DATA16 字节转换指令(XLAT)隐含寻址方式,EA=(BX)+(AL)功能:将EA所对应的内存单元中一个字节送入AL中。例如:求CODE1代码中的5所对应的CODE2代码。 MOVAX,SEG TABLE MOVDS,AXMOVBX,OFFSET T

15、ABLEMOVAL,06XLATCODE1和CODE2的代码表参见P67表4.67 堆栈操作指令() 堆栈定义:以后进先出(LIFO)的规则存取信息的一种存储机构。堆栈指示器(堆栈指针):管理堆栈中存取地址的一个专门地址寄存器。它始终指向堆栈中最后存入信息的那个单元,该单元称为堆栈顶。8086/8088CPU中,堆栈指针为寄存器SP(16位地址寄存器),用来寄存堆栈区的偏移地址,段地址存放在段寄存器SS中。() 堆栈操作指令(A) 压入指令(PUSH)将SRC或标志寄存器FLAG的内容送入堆栈,并修正堆栈指针的内容,双字节操作(字类型)。PUSHAX;PUSHDSPUSHSI地址内容00F8H

16、0800F9H0700FAH0600FBH0500FCH0400FDH0300FEH0200FFH010100HPUSHF例如: MOVAX,0FFFFHPUSHAX(B) 弹出指令(POP)将SP所指的栈顶的内容取出,并送入DST所指寄存器、内存单元或标志寄存器FLAG,并修正SP内容。例如:MOVSP,0100HPUSHAXPUSHBXPOPAXPOPBX 下面的指令是错误的: PUSH1234H PUSHAL422 算术运算类指令1 加法和减法指令ADDDST,SRC(无进位加法)ADCDST,SRC(带进位加法)SUBDST,SRC(无借位减法)SBBDST,SRC(带借位减法)NEG

17、DST(取负)目的操作数DST:通用寄存器、任一寻址方式所指定的内存单元。源操作数SRC:立即数、通用寄存器和任一寻址方式所指定的内存单元。不能从内存到内存。ADDAL,BLADDCX,08HADDAX,SIADDAX,BXDISUBAL,CLSUBBX,DXADCAX,0SBBCX,DATA11)ADDAX,SI目的操作数的寻址方式为寄存器方式,源操作数的寻址方式为寄存器间接方式。功能:将AX的内容与寄存器SI的内容所指的内存单元中的16位数相加,结果送入AX,并设置标志寄存器FLAG的各位。算术运算对标志寄存器中的DF、IF、TF均不产生影响。CF进位(或借位)与OF的区别MOVAX,0F

18、DAAHMOVBX,0FBCEHADDAX,BX结果:(AX)=0F978H,(BX)=0FBCEH,CF=1,OF=02)SBBCX,DATA1带借位的16位数减法指令。目的数的寻址方式为寄存器方式,源操作数的寻址方式为直接方式。指令执行前,(CX)=3F50H,变量DATA1在数据段内的偏移地址为0006H,对应单元中16位数为1728H,借位标志(CF)=1,指令执行过程如下:结果:(CX)=0010100000100111(FLAG)=XXXX0···00X1X1X0带进位的加、减法指令主要用于多位数的加、减运算。例如:在内存中偏移地址为ADR1开始的连续

19、单元中存放着两个4字节操作数A和B,求该两数之和,并将结果放入ADR2开始的连续单元中。假设操作数由变量定义的方式存入内存,并且其段地址已送入DS,偏移地址ADR1已送入寄存器DI。MOVAX,4DIADDAX,DIMOVADR2,AXMOVAX,6DIADCAX,2DIMOVADR2+2,AX对指令的执行进行说明NEGDST指令称为取负指令,是一条单操作数指令。它的功能是将目的操作数的值取负。正数-该数的负数的补码,负数(补码)-该数的正数。指令中操作数的寻址方式可采用除立即数外的各种寻址方式,但不能是段寄存器。NEGAXNEGBYTEPTRDINEGWORDPTR 4BXNEGDAT1SI

20、例如:第一条指令,设(AX)=00F2H,则结果(AX)=FF0EH,同时CF=1,SF=1,AF=1,PF=0,OF=0,ZF=0。2 比较指令格式:CMPDST,SRC;DST-SRC并设置标志位指令的功能:目的操作数减去源操作数,并根据相减结果设置各标志位。CMPAL,BLCMPAL,DICMPAX,CXCMPAX,06H3 增量和减量指令INCDSTDECDST均为单操作数指令。操作数的寻址方式为除立即数和段寄存器外的其他各种寻址方式。指令的功能是对目的操作数加1或减1。标志位初CF外都受影响。INCALINCBXINCWORDPTR4BXDECCX4 乘法与除法指令MULSRCIMU

21、LSRC ;有符号乘法,操作数同上。例:MULDAT1IMULCLMULBYTEPTRBX() 带符号运算时,操作数和结果均以补码表示,结果的符号按一般的运算规则确定。() 乘法指令中的目的操作数的寻址方式是隐含的,并且一定是累加器AX或AL。源操作数的寻址方式可采用除立即数和段寄存器外的各种寻址方式。() 指令是字运算或字节运算由源操作数的类型确定。字运算:AX-DX:AX ,字节运算:AL-AX() 乘法指令执行后,标志寄存器中只有CF和OF位有意义,其它各位不确定。MUL指令,结果中的高16位(字运算)或高8位(字节运算)均为0时,CF和OF被置0,否则置1。IMUL指令:结果中高16位

22、(字运算)或高8位(字节运算)为低16位或低8位的符号扩展时,CF和OF被置0,否则CF和OF置1。乘除法指令分带符号运算和不带符号运算两种。例:比较MUL与IMUL乘法的不同:DAT1DW8004HMOVAX,05HMULDAT1MOVAX,05HMULBYTEPTRDAT1MOVAX,05HIMULBYTEPTRDAT1MOVAX,05HIMULWORDPTRDAT14条指令的运行() 无符号字运算() 无符号字节运算() 带符号字节运算() 带符号字运算除法指令中的目的操作数的寻址方式也是隐含的,并且一定是DX:AX或AX。5 符号扩展指令CBWAL的符号据扩展到Ah中CWDAX中的符号

23、扩展到DX中6 BCD数调整指令BCD数调整指令的操作数均为隐含寻址(AL,AX)AAA加法分离BCD数调整,影响AF,CFAAS减法分离BCD数调整,影响AF,CFDAA加法组合BCD数调整,OF标志位无定义,影响其余各标志位DAS减法组合BCD数调整,OF标志位无定义,影响其余各标志位AAM乘法分离BCD数调整,影响SF,ZF,PF,但OF,AF,CF无定义AAD除法分离BCD数调整,影响SF,ZF,PF,但OF,AF,CF无定义对BCD数进行十进制运算() 对BCD数按二进制进行运算() 对运算结果进行相应的调整调整方法是: 累加器AL低4位大于9或辅助进位标志位AP1,则累加器AL加0

24、6H修正。 累加器AL高4位大于9或进位标志位CY1,则累加器AL加60H修正, 累加器AL高4位大子等于9,低4位大于9,则累加器AL进行加66H修正。BCD码是一种用二进制编码的十进制数,又称为二一十进制数。80868088中BCD码分为两种形式:其一是用四位二进制数表示一位十进制数,称为压缩的BCD码;其二是用八位二进制数表示一位十进制数、称为非压缩的BCD码,它的低四位是BcD码,高四位没有意义。AAM和AAD只能调整分离BCD码的运算。例:求两个4位组合BCD数的和BCD1DB45H,19HBCD2DB71H,12HBCD3DB2DUP(?)MOVAL,BCD1ADDAL,BCD2D

25、AAMOVBCD3,ALMOVAL,BCD1+1ADCAL,BCD2+1DAAMOVBCD3+1,AL例:设有两数X,Y,且X=85,Y=6,用分离BCD数完成X/YBCD1DB05H,08HBCD2DB06HBCD3DB3DUP(?)MOVAH,0MOVAL,BCD1+1MOVBL,BCD2DIVBLMOVBCD3+1,ALMOVAL,BCD1AADDIVBLMOVBCD3,ALMOVBCD3+2,AH423 逻辑运算类指令ANDDST,SRCANDDST,DATAORDST,SRCORDST,DATAXORDST,SRCXORDST,DATATESTDST,SRCTESTDST,DATAN

26、OTDSTSRC:立即数,通用寄存器和任一寻址方式所制定的内存单元。DST:通用寄存器和任一寻址方式所制定的内存单元,但不允许是立即数。指令可以是字节操作,也可以是字操作。NOT指令对标志位不产生影响,其余指令将使CF,OF置0,并以正常规则设置SF,ZF,PF的状态。ANDAL,01HANDAX,BXORBYTEPTR AVL,80HTESTAL,08HNOTBX(AX)=5555H,(BX)=0FF00H,AVL-09HTEST指令和AND指令的区别:TEST指令只影响标志位,不影响原目的操作数的值。逻辑运算指令可以通过选用不同的源操作数的各位代码,使目的操作数的某些位置位、清零和测试目的

27、操作数的某些位。ORCL,03HANDAL,0F5HXORAH,0FHTESTAL,02HJZZERXORAL,TEXT_CODEJZPROC1424 移位指令和循环移位指令SHRDST,CNTSHL/SALDST,CNTSARDST,CNTRORDST,CNTROLDST,CNTRCRDST,CNTRCLDST,CNT功能:将DST所指出的操作数的各位左移或右移若干位,移位的次数由CNT确定。DST:除立即数外的各种寻址方式,但不能是段寄存器。CNT可以是立即数或寄存器CL。为立即数时,只能为1。左移指令:右移指令:对标志的影响:对AF无影响,循环移位只影响CF和OF,(可能影响ZF,但无意

28、义)。只有CNT=1时,OF有意义,当操作数的最高位在移位前后不发生变化OF=0,否则OF=1。例如:SHRAX,1SALAL,CLROLSAT1SI,CL例如:将两位组合BCD码转换成ASCII码,并存放在制定单元:BCD在AL中MOVSI,0MOVBL,ALANDAL,0FHADDA,30HMOVBUFSI,ALMOVCL,04SHRBL,CLADDBL,30HINCSIMOVBUFSI,BLBUFDB2DUP(?)425 处理器控制指令与标志处理指令CLC0CFSTC1CFCMCCF取反CLD0DFSTD1DFCLI0IFSTI1IFNOP空操作HLT暂停WAIT等待LOCK总线锁定前置

29、ESC外部设备换码1 NOP指令占用机器的3个周期2 HLT指令 CPU的复位输入端RESET线上有复位信号 非屏蔽中断请求输入端NMI线上出现请求信号 可屏蔽中断输入端INTR线上出现请求信号且标志寄存器的中断标志IF=1。43汇编语言程序设计的基本方法431 汇编语言程序设计的基本步骤1 分析问题2 确定算法算法:算法描述:自然语言、类程序设计语言或流程图(本书采用)() 起始和终止框() 执行框() 判断框() 连接符3 编写程序() 了解所用CPU的编程模型、指令系统、寻址方式及有关指令() 进行存储空间和工作单元的合理分配() 子程序和宏指令() 用标号或变量来代替绝对地址和常数4

30、程序的校验5 编写说明文件432 IBM PC 汇编语言源程序的完整结构及伪指令1 段定义伪指令格式:段名SEGMENT定位类型组合类型类别段名ENDS() 段名段名:所定义的段的名称,具有:段地址、偏移地址、定位类型、组合类型和类别等属性。() 定位类型定位类型:对段的起始边界的要求,类型有PAGE、PARA、WORD、BYTE。PAGE=XXXXXXXXXXXX00000000(页)PARA=XXXXXXXXXXXXXXXX0000(节)WORD=XXXXXXXXXXXXXXXXXXX0(字)BYTE=XXXXXXXXXXXXXXXXXXXX(字节)PAGE: 段起始地址的低8位是0,其值

31、能被256整除(称为页边界)。PARA: 段起始地址的低4位是0,其值能被l 6整除(称为段边界)。此方式为系统的隐合定位方式,WORD:段起始地址的最低位是0,其值能被2整除(称为字边界)一偶地址。 BYTE:段起始地址是任意值。定义类型的默认段为PARA类型。3组台类型 为连接程序提供此段与其他段之间关系的信息共有六种选择。 NONE: 系统隐含连接方式,表示此段与其他段没有逻辑上的联系,每段多有自己的基址。 PUBLIC:指示连接程序把此段与其他同名同类别的段连接起来形成一个物理段公用一个段的起始地址。连接顺序由连接程序决定。 STACK:表示此段是堆栈段,连接方式同PUBLIC,源程序

32、至少要有一个堆栈段。连接后的段起始地址在SS寄存器中否则提示错误。通常,寄存器SS指向第一个遇到的堆栈段。 COMMON:表示此段与其他同名同类别的段共用同一个段起始地址,使这些段相互重叠,段的长度取最长段的长度。 MEMORY:表示此段在连接时定位在其他所有段之上(高地址处)。对于多个MEMORY段汇编程序将把第一个段认为是MEMORY其余为COMMON。AT表达式:表示此段定位在表达式值指定的段地址处。 (4)类别凡是类别名相同的段校先后顺序连接起来时组成一个段组共用同一个类别名。类别名必须用单引号括起来,例如,CODE、DATA、STACK。STACKSEGMENTSTACKENDSDA

33、TASEGMENTDATAENDSDATA1SEGMENTDATA1ENDSCODESEGMENTCODEENDSEND例如:TITLEADDINGPAGE60,70STACKSEGMENTPARA STACKSTACKTOPLABELWORDSTACKENDSDATASEGMENTADR1DB54H,76H,12H,00HDB21H,98H,04H,00HADR2DW4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSET TO

34、PMOVDI,OFFSETTOPMOVAX,4DIADDAX,DIMOVADR2,AXMOVAX,6DIADCAX,2DIMOVADR2+2,AXMOVAH,4CHINT21HCODEENDSENDSTART2 ASSUME伪指令格式:ASSUME段寄存器:名称,段寄存器:名称,。段寄存器:CS、DS、ES、SS名称:() 由SEGMENT伪指令定义的段名() 表达式:SEG变量名或SEG标号() GROUP伪指令定义的段组名ASSUME伪指令是使源程序中段与段寄存器发生联系3 END格式:ENDS表达式表达式:该程序运行时的启动地址,是一条可执行语句的标号4 ORG格式:ORG表达式(2字节

35、的无符号数)功能:指明该语句下面的程序在段内的起始地址5 “=”伪指令和EQU指令() “=”指令格式:名称=表达式表达式:整型常量、包含两个字符的常量、已定义的符号常量、一个由运算符构成的表达式() EQU指令格式:名称EQU表达式例如:KEQU1024MEQUK*8STRING1EQUABCDPORT2EQU40HPIEQU3.14159WPTEQUWORDPTRBPTEQUBYTEPTRBUFADDREQUBUFMOVAL,BPTBUFADDRMOVAX,BUFADDR433 顺序程序例如:写出计算Y=A*B+C-18的程序。A、B、C分别为3个带符号的8位二进制PAGE55,60CCE

36、QU18STACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDAT1DB34HDAT2DB56HDAT3DB0E7HDATYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAL,DAT1MOVBL,DAT2IMULBLMOVBX,AXMOVAL,DAT3CBWADDAX,BXSUBAX,CCMOVDATY,AXMOVAH,4CHINT21HCODEEN

37、DSENDSTART例如:要求编写一个程序,实现求N的整数平方根值。10<N<26.(自学)434 分支程序1. 程序的分支结构程序在执行过程中根据判断条件的判断结果决定程序的流向,这就是分支程序。分支可分为单分支结构和多分支结构。2. 转移指令转移指令是用来改变程序的执行顺序的,分为无条件转移指令和条件转移指令。(1) 无条件转移指令无条件转移指令的难点是:寻址方式。可分为直接转移和间接转移两种。1) 直接转移指令。段内直接转移指令JMPSHORT OPR,OPR为语句标号或语句标号加常量的表达式。指令的寻址方式为相对寻址方式。相对位移量D8的范围为-128127,D8=转向地址

38、-IP的当前值。例如:AGAIN:MOVAX,08JMP AGAIN如果JMP指令的偏移地址=0020H,AGAIN的偏移地址=0009H,D8=0009H-0022H=E7H(-19H)。段内直接近转移指令 JMP NEAR PTR OPR 除D16为16位外,其它与前一种相同。段间直接远转移指令 JMP FAR PTR OPROPR包含段地址和段内偏移地址。例如:JMPSHORTMULT1JMPNEARPTRMULT1JMPFARPTRMULT1JMPSHORTMULT1+0AH若JMP SHORT MULT1的段地址=4000H,偏移地址=0100H,它的下一条指令的IP=0102H,则

39、MULT的范围为:0181H0082H2) 间接转移指令JMP OPR1分段内间接转移和段间间接转移。OPR1:存放转向地址的单元,其寻址方式为除立即数外的所有方式。段内间接转移,16位地址。OPR1可以是寄存器,也可是字类型的变量。例如:JMPBXJMPTADRDIJMPWORD PTR BXJMPDBT1。段间间接转移OPR1必须为一个双字类型的变量例如:JMPDWORD PTR DIJMPDBT2JMPTADR1BXDBT2DD04000000HTADR1DD06000010H,06000040H,06000086H(2) 条件转移指令条件转移指令是指只有指令中给定的条件满足时才发生转移

40、。判断的依据是标志寄存器中各位的状态。指令中OPR与无条件转移指令一样,可以使标号或标号加常数的表达式。其寻址方式只有一种,即位移量为8位的相对寻址方式。1) 带符号数与无符号数情况下条件转移指令的使用JB:无符号数JL :带符号数MOVAX,VAL1MOVBX,VAL2CMPAX,BXVAL1=003AH VAL2=8003HOFDFIFTFSFZFAFPFCF110X0X0X1 VAL1与VAL2位无符号数,应用JB来判断,用CF标志 VAL1与VAL2为有符号数,应用JL来判断,用SF和OF异或的结果。2) 测试标志3) 标志位的影响 例如:MOVAX,SI指令不影响ZF标志。4) 指令

41、的多种表示方式JBSMJNAESMJCSM3. 分支程序设计分支程序设计的要点: (1)正确选择判定条件和相应的条件转移指令() 每条分支都有完整的结果() 检查和测试每一条分支例如:求X的绝对值,并送回原处。STACKSEGMENT STACKDW256 DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTXADRDW3456H,8192HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVAX,XADRANDAX,AXJNSDONENEGAXMOVXADR,AXDONE:MOVAH,

42、4CHINT21HCODEENDSEND START也可以改成: ANDAX,AXJSNEGXJMPSHORT DONENEGX:NEGAXMOVXADR,AXDONE:MOVAH,4CHINT21H例如4。3。4:写出将一位十六进制数转换成对应的ASCII码的程序(大写字母)包括09和AF六个字母。09转换成ASCII码只要加30H即可,AF必须加上37H才行。给定一个数后,现判断他的范围,再转换。程序和框图如下:4。3。5 循环程序例如:将5个数从内存的某个区域移到另一个区域程序如下:1 循环程序的基本结构() 循环准备部分() 循环工作部分() 调整部分() 循环出口部分2 循环控制命令

43、指令的寻址方式为相对寻址方式。相对位移量为8位,寻址范围为-128127。OPR为语句标号或语句标号加常量表达式。指令的功能和应用:() 将ADRS开始的100个数据送到ADRD,假设段地址为DS和ESLEASI,ADRSLEADI,ADRDMOVCX,100AGAIN:MOVAL,SIMOVES:DI,ALINCSIINCDILOOPAGAIN() 最多传送100个字节,以#结束传送。LEASI,ADRSLEADI,ADRDMOVCX,100AGAIN:MOVAL,SICMPA,#JE/JZPENDMOVES:DI,ALINCSIINCDIMOVAL,SILOOPAGAINPEND:3 循环

44、程序设计() 根据问题确定循环工作部分() 确定循环的调整部分() 确定循环的出口例436:求某数组中负数的个数。例438求一字符串的长度,并要求滤去第一个非空格字符前的所有空格。字符串以#结束。435 子程序及过程定义1. 调用与返回指令1) 调用指令CALL子程序入口地址的寻址方式与无条件转移指令的转向地址的寻址方式基本相同() 段内直接调用指令CALL OPR,OPR为子程序名(过程名),代表了子程序的入口地址,相对寻址方式,相对位移量:16位,入口地址与返回地址的差值。() 段内间接调用指令CALL OPR1。OPR1:存放子程序入口地址的单元,() 段间直接调用指令CALL FAR

45、PTR OPR 。OPR为过程名,代表子程序入口地址的段地址和偏移地址() 段间间接调用指令CALL OPR1。OPR1:32位段地址和偏移量的内存单元入口。过程名:SEARCH1 PMOVE变量:SADR0400H:0100HCALLSEARCH10400H:0103H0400H:0220HCALLFAR PTR PMOVE0400H:0225HCALLBXCALLWORD PTR BXCALLSADR2) 返回指令RET 功能:从堆栈弹出返回地址送入IP或送入IP和CS。寻址方式:以SP间接寻址。分段内返回RET和段间返回RETF。RET:2字节到IP,SP+2-SP;RETF:SP-IPSP+2-CSRET N2. 过程定义定义格式:过程名PROC类型RET过程名ENDP() 过程名具有与语句标号相同的属性:段地址、偏移量和类型。() 类型:NEAR和FAR() PROC和ENDP关键字() RET是过程的返回指令3. 主程序与子程序之间的参数传递子程序入口参数:子程序出口参数:1) 寄存器传递参数方式2) 指定内存单元传递参数方式3) 堆栈

温馨提示

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

评论

0/150

提交评论