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

下载本文档

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

文档简介

7.1

汇编语言程序及开发过程一、基本概念机器语言:指令,是CPU唯一能识别的语言,用二进制表示;汇编语言:是机器语言的一种助记符形式,与机器语言一一对应;汇编程序:把汇编语言翻译成机器语言的程序。(翻译、直译)特点:5.编程调试稍难。与硬件平台有关;2.可读性好于机器语言;3.不能直接在机器上运行,必须经过汇编程序的汇编后才能执行;4.执行效率高;应用场合1.程序要求快、占用较小的存储容量。操作系统的核心程序段实时控制系统的软件智能仪器仪表的控制程序2.程序要直接、有效地控制硬件I/O接口的初始化程序段外设的低层驱动程序3.没有合适的高级语言时开发最新的处理器程序4.其它:加密解密软件、分析和防治计算机病毒二、汇编语言的开发过程名称程序名生成汇编程序MASMa.obj连接程序LINKa.exe调试程序DEBUG初学程序设计最有效方法1.阅读源程序:掌握程序的一般结构学习实现经典算法2.上机调试:掌握指令的语法格式、功能避免常见的语法错误训练调试技巧DATA SEGMENT STRING DB ‘HelloWorld!’,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX

MOV DX,OFFSETSTRING MOV AH,9 INT 21H MOV AX,4C00H INT 21HCODE ENDSSTACK SEGMENT STACK DB 256DUP(?)STACK ENDS END START例:显示信息

7.2指令格式及寻址方式一、指令格式操作码:执行什么性质的操作;操作数:对什么样的对象进行操作。每条指令只有一个操作码,但可以有多个操作数,8086指令系统中,操作数的数目有0~2个

汇编指令格式双操作数指令OPR DEST,SRC单操作数指令OPRDEST无操作数指令OPROPR:指令操作码(指令助记符)DEST:目的操作数SRC:源操作数1数据传送类指令

2算术运算类指令

3位操作类指令

4控制转移类指令

5串操作类指令

6处理机控制类指令二、8086指令集

传送指令MOV语句格式:MOVOPD,OPS功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。例:MOVAX,03HMOVAX,X数据交换指令XCHG语句格式:XCHGOPD,OPS功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。例寄存器与存储器之间数据交换。MOV AX,5678H ;MOV BX,0FFFFH ;XCHG AX,BX ;(AX)=0FFFFH,(BX)=5678H输入指令IN从指定的外设寄存器取信息送入累加器。四种形式:(1)语句格式:IN AL,PORT

功能:(PORT) →AL(2)语句格式:IN AX,PORT

功能:(PORT) →AX(3)语句格式:IN AL,DX

功能:([DX]) →AL(4)语句格式:IN AX,DX

功能:([DX]) →AL输出指令OUT把累加器的内容送往指定的外设存储器,四种形式:(1)语句格式:OUT PORT,AL

功能:(AL) →PORT(2)语句格式:OUT PORT,AX

功能:(AX) →PORT(3)语句格式:OUT DX,AL

功能:(AL) →[DX](4)语句格式:OUT DX,AX

功能:(AX) →[DX]例:MOVAX,28HINDATA_WORD,AX把端口28的内容经过AX传送到存储单元DATA_WORD中。加1指令INC语句格式:INCOPD功能:将目的操作数加1,结果送目的地址。即(OPD)+1→OPD。例:INCBX,即(BX)+1→BX。可用于对计数器和地址指针进行调整。减1指令DEC加指令ADD语句格式:ADDOPD,OPS功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。即(OPD)+(OPS)→OPD。减指令SUB带进位加指令ADC语句格式:ADCOPD,OPS功能:将目的操作数加源操作数再加低位进位,结果送目的地址。即(OPD)+(OPS)+CF→OPD。例无符号双字加法运算MOV AX,4652H ;(AX)=4652HADD AX,0F0F0H ;(AX)=3742H,CF=1MOV DX,0234H ;(DX)=0234HADC DX,0F0F0H ;(DX)=0F325H,CF=0求补指令NEG语句格式:NEGOPD功能:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。即(OPD)+1→OPD。例求补运算。MOV AX,0FF64HNEG AL ;(AX)=0FF9CHSUB AL,9DH ;(AX)=0FFFFHNEG AX ;(AX)=0001H带借位减指令SBB语句格式:SBBOPD,OPS功能:目的操作数减源操作数再减低位借位CF,结果送目的地址。即(OPD)―(OPS)―CF→OPD比较指令CMP语句格式:CMPOPD,OPS功能:目的操作数减源操作数,结果只影响标志位,不送入目的地址。即(OPD)-(OPS)。例比较AL的内容数值大小。CMP AL,50 ;(AL)-50JB BELOW ;(AL)<50,转到BELOW处……BELOW: …无符号数乘法指令MUL语句格式:MULOPS功能:若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。即字节乘法:(AL)*(OPS)→AX,字乘法:(AX)*(OPS)→DX,AX例无符号数0A3H与11H相乘。MOV AL,0A3H ;(AL)=0A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H有符号乘指令IMULIMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。例有符号数0B4H与11H相乘。MOV AL,0B4H ;(AL)=B4HMOV BL,11H ;(BL)=11HIMUL BL ;(AX)=0FAF4H无符号除指令DIV语句格式:DIVOPS功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)字除法:(DX、AX)/(OPS)→AX(商)、DX(余数)有符号除指令IDIV字节转换成字指令CBW语句格式:CBW功能:将AL中的符号位数据扩展至AH。例将字节数据扩展成字数据。MOV AL,0A5H ;(AL)=0A5HCBW ;(AX)=0FFA5H将字转换成双字指令CWD语句格式:CWD功能:将AX中的符号位数据扩展至DX。例将字数据扩展成双字数据。MOV DX,0 ;(DX)=0MOV AX,0FFABH ;(AX)=0FFABHCWD ;(DX)=0FFFFH(AX)=0FFABHAND,OR,XOR,NOT,TEST

逻辑运算SHR,SHL,SAR,SAL

移位指令ROR,ROL,RCR,RCL

循环移位

位运算指令CLC,STC,CMC 设定进位标志CLD,STD 设定方向标志CLI,STI

设定中断标志CMP

比较JMP

跳往指定地址执行JXX

条件转移指令LOOP

循环指令LOOPE(Z) 条件循环指令CALL,RET

子程序调用,返回指令INT,IRET

中断调用及返回指令

程序流程控制指令

MOVSB,MOVSW,MOVSD 字符串传送

CMPSB,CMPSW,CMPSD 字符串比较SCASB,SCASW 字符串搜索指令

LODSB,LODSW 字符串载入指令

STOSB,STOSW 字符串存贮指令

REP,REPE,REPNE 重复前缀指令字符串操作指令三、寻址方式寻址方式

确定本条指令的操作数地址下一条欲执行指令的指令地址指令寻址数据寻址寻址方式7种4种寻址方式,会影响机器运行的速度和效率1、操作数寻址方式1)立即寻址操作数存放在指令中,紧跟在操作码之后,作为指令的一部分存放在代码段中。MOVAX,0102H这种操作数被称为立即数imm它可以是8位数值i8(00H~FFH)也可以是16位数值i16(0000H~FFFFH)立即数寻址方式常用来给寄存器赋值三、寻址方式2)寄存器寻址源操作数和目的操作数均为寄存器,不需要访问存储器,执行速度最快。MOVAX,BX

操作数存放在通用寄存器中,可以是:16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL 以下的寻址方式都不是直接给出要访问的数据,而是给出要访问数据的内存地址。指令中给出操作数的主存地址信息(偏移地址,称之为有效地址EA),而段地址在默认的或用段超越前缀指定的段寄存器中物理地址(PA):=段地址*16+有效地址有效地址(EA)=基址+变址+偏移量基址寄存器:BX,BP变址寄存器:SI,DI偏移量: 8位或16位数字寻址方式没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个:CS: ;代码段超越,使用代码段的数据SS: ;堆栈段超越,使用堆栈段的数据DS: ;数据段超越,使用数据段的数据ES: ;附加段超越,使用附加段的数据MOVAX,[2000H] ;AX←DS:[2000H];从默认的DS数据段取出数据MOVAX,ES:[2000H] ;AX←ES:[2000H];从指定的ES附加段取出数据访问存储器的方式默认可超越偏移地址取指令CS无IP堆栈操作SS无SP一般数据访问DSCSESSS有效地址EABP基址的寻址方式SSCSESDS有效地址EA串操作的源操作数DSCSESSSSI串操作的目的操作数ES无DI段寄存器的使用规定3)直接寻址: 操作数的有效地址只包含位移量一项,偏移量即为有效地址。

MOVAX,[2000H]

INCADDR;ADDR为符号地址变量

INCBYTEPTR[4A03H]其中PTR属性操作符用来指定存储单元的类型。当目的操作数为存储器,源操作数为立即数时,必须指明操作的类型。MOVBYTEPTR[1000H],8;字节型传送,表示将08传送到1000H单元中MOVWORDPTR[1000H],8;字传送,将08传送到1000H单元,将00传送到1001H单元4)寄存器间接寻址: 操作数在存储器中,而操作数的地址在某个寄存器中。可用寄存器BX,BP,SI,DI。操作数的有效地址只包括基址寄存器或变址寄存器。

MOVAX,[BX]5)寄存器相对寻址: 有效地址包括基址寄存器或变址寄存器以及偏移量两部分。

有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI有效地址=BX/BP/SI/DI+8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变。

MOVAX,[SI+06H]6)基址变址寻址: 有效地址包括基址寄存器和变址寄存器两部分。MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BP+DI] ;AX←SS:[BP+DI]MOVAX,DS:[BP+DI];AX←DS:[BP+DI]7)相对基址变址寻址 有效地址包括基址寄存器、变址寄存器和偏移量三部分。有效地址=BX/BP+SI/DI+8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变MOVAX,[BX+SI+06H];AX←DS:[BX+SI+06H]相对基址变址寻址用符号表示位移量在寄存器相对寻址或相对基址变址寻址方式中,位移量可用符号表示:MOVAX,[SI+COUNT];COUNT是事先定义的变量或常量(就是数值)MOVAX,[BX+SI+WNUM];WNUM也是变量或常量多种表达形式同一寻址方式可以写成不同的形式:MOVAX,[BX][SI]

;等同于MOVAX,[BX+SI]MOVAX,COUNT[SI]

;等同于MOVAX,[SI+COUNT]MOVAX,WNUM[BX][SI]

;等同于MOVAX,WNUM[BX+SI]

;等同于MOVAX,[BX+SI+WNUM]程序转移寻址方式顺序(PC)+1PC跳跃由转移指令指出LDA1000ADD1001DEC1200JMP7LDA2000SUB2001INCSTA2500LDA1100...0123456789PC+1指令地址寻址方式指令地址指令顺序寻址1顺序寻址2顺序寻址3跳跃寻址7顺序寻址8程序转移寻址方式

程序的执行顺序是由代码段寄存器CS和指令指针IP确定的。需要改变程序流程,要给出目标指令的段地址(CS)和偏移地址(IP)值。寻址方式有四种:段内直接寻址、段内间接寻址、段间直接寻址和段间间接寻址。段内寻址段内寻址分为段内直接寻址和段内间接寻址两种方式。其转移方式是在当前代码段64KB范围内转移,不需要更改段地址CS的值,只要改变偏移地址IP的值即可。

1)段内直接转移寻址: 以当前IP指向的地址为基准地址,加上跟在操作码后面的相对位移量,得到转移地址的偏移地址。目标地址=IP(当前值)+偏移量其中偏移量为8位或16位有符号数。若偏移量为正数,向前转移(即高地址方向);若偏移量为负数,则向后转移(即低地址方向)。对8位偏移量,其转移范围为-128~+127,称为短转移对16位偏移量,其转移范围为-32768~+32767,称为近转移。

短转移指令为2字节指令,IP的当前值为转移指令所在的IP值加2。近转移指令为3字节指令,IP的当前值为转移指令所在的IP值加3。例:

JMPSHORTDSP1

;短转移指令假设指令存放地址为1000H:0200H,偏移量DSP1为08H短转移指令执行时,当前IP值=0200H+2=0202H。

目标地址=IP(当前值)+偏移量=0202H+08H=020AH

指令执行后将转向1000H:020AH去执行。JMPNEARPTRDSP2

;近转移指令假设指令存放地址为1000H:0200H,偏移量DSP2为0012H。近转移指令执行时,当前IP值=0200H+3=0203H。

目标地址=IP(当前值)+偏移量=0203H+0012H=0215H

指令执行后将转向1000H:0215H去执行。

2)段内间接转移寻址转移的有效地址值存放在16位的通用寄存器或连续两个存储单元中。以寄存器间接寻址、变址寻址、基址寻址、基址变址寻址方式得到操作数,作为偏移地址。若有效地址在存储单元中,一定要指出存储单元为字型。

例:假设(DS)=2000H,(BX)=3000H,(23000H)=2536H,分析下列指令。JMPBX

指令执行后,将BX的内容直接赋给IP。所以,(IP)=3000H。JMPWORDPTR[BX]

指令执行后,先计算出存储单元地址23000H,再从该单元中取出内容送给IP。所以,(IP)=2536H。3)段间直接转移寻址操作数为两个16位地址,第一个为偏移地址,第二个为段地址。只要用指令中指定的偏移地址代替IP寄存器的内容,用指令中指定的段地址代替段寄存器CS的内容就可以完成从一个段到另一个段的转移操作。段间直接转移通常叫远转移(farjump),指令的操作数必须附加FARPTR操作符。例:执行如下指令

JMPFARPTRDSP假设指令存放地址为1000H:0200H,

DSP的有效地址为3620H,段地址

为2000H。则指令执行后,(IP)=3620H,(CS)=2000H。

程序转移到2000H:3620H处继续执行。4)段间间接转移寻址 用间接寻址的方式得到两个16位地址,作为跳转地址。转移目标的偏移地址和段地址存储在两个连续的字存储单元中。指令中需要用DWORDPTR操作符将存储单元指定为双字单元。执行时,根据存储单元的寻址方式计算出存储单元地址,从该存储单元取第一个字传送到IP,取第二个字传送到CS。例:

JMPDWORDPTR[BX]假设:(CS)=1000H,(IP)=0600H,(DS)=2000H,(BX)=1000H,(21000H)=3000H,(21002H)=6000H。指令执行后,(CS)=6000H,(IP)=3000H。程序转移到6000H:3000H处继续执行。汇编语言指令指令性语句指示性语句(伪指令语句/说明性语句)一般指令语句宏指令语句7.38086宏汇编语言的基本语法指令性语句:经过汇编之后有目标程序与之对应,是有实际操作的语句。指示性语句:用来对汇编时的一些情况进行说明,如起始终止信息、分段情况、变量说明、内存结构等等。不产生任何目标代码。宏指令语句简介当源程序中多处出现相同的一段代码时,可用宏来定义这段独立的代码。只需在源程序中定义一次,就可以多次调用。调用时只需要用一条宏指令语句就可以。宏定义是用一组伪操作来实现的。格式为:Macroname MACRO [dummyparameterlist]…(宏定义体)ENDM宏调用格式为:macroname [actualparameterlist]宏定义:宏展开及宏的优缺点:在汇编时就完成了参数的传递,节省保存现场的时间的开销,但如果多次调用宏,则占用内存空间大。一、指令性语句 指令性语句的格式为:[标号:][前缀]指令助记符

[操作数][,操作数][;注释]

1.标号:标号是机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:”

。2.指令助记符:指令助记符为语句的核心成分,表示了该语句的操作类型。

3.操作数:操作数表示指令助记符的操作对象。

4.注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。

[]:可选项;二、

基本元素1常量(数值常量、字符串常量)2变量3标号4表达式与运算符5运算符的优先级1.数值常量表7.4各种形式数字常量格式对照表2.字符串常量字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASCⅡ码表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。(1)段属性(2)偏移地址属性(3)类型属性1.变量属性表达式项是给变量或指定存储单元赋予初值,它有以下几种形式:(1)数值表达式(2)字符串表达式(3)地址表达式(只适用DW和DD两个伪指令)(4)?表达式(5)带DUP的表达式2.变量的定义数据定义伪指令可以为一个或连续的存储单元设置数值初值。【例】为数据段分配存储单元。DATA SEGMENTA DB 11H,12H,13HB DW 1122H,3344HC DD 12345678HDATA ENDS(1)数值表达式数据段中数据存储分配图字符串表达式中的字符串必须用引号引起来。DB、DW、DD伪指令将字符串中的各字符均以ASCⅡ码形式存放在相应的存储单元,但表示形式各不相同。【例】为字符串分配存储单元。DATA SEGMENTSTR1 DB ‘1234’STR2 DW ‘AB’,‘CD’,‘A’STR3 DD ‘AB’DATA ENDS(2)字符串表达式数据段存储分配图(3)地址表达式(只适用DW和DD两个伪指令)如果该地址表达式为一变量(或标号)名,用DW伪指令则是取它的偏移地址来初始化变量,用DD伪指令则是取它的段首址和偏移地址来初始化变量。例如:

BUF1 DW ABUF2 DD B(4)?表达式定义的数据项无确定的初值如:NUMDB?为连续的存储单元提供重复数据,其格式为:

NDUP(表达式)N为重复因子,只能取正整数,表示定义了N个重复数据存储单元,其类型由它前面的数据定义伪指令确定,而每个数据存储单元中的初值由DUP后面圆括号中的表达式给定。例如:BUFDB100DUP(0)定义了以BUF为首址,大小为100个字节,初值为0的数据存储单元。(5)重复数据操作符DUP标号标号是一条指令语句的符号地址。只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。【例】符号地址表示。 ┆NEXT:MOV AL,[SI] ;带标号NEXT的指令 ┆

DECCXJNENEXT ;标号NEXT作转移指令的操作数表达式与运算符1.算术运算符2.逻辑运算符3.关系运算符4.属性运算符5.数值返回运算符算术运算符包括:+(加)、-(减)、*(乘)、/(除)、MOD(求模)、SHL(左移)、SHR(右移)几种,它既可以用于数值表达式又可用于地址表达式。1.算术运算符 ┆NUM1 EQU 25*4–50 ;NUM1=50NUM2 EQU NUM1/7 ;NUM2=7NUM3 DB NUM1MOD7 ;NUM3=1VAR1 DB 1,2,3,4,5VAR2 DB ‘12345’NUM4 EQU VAR2-VAR1 ;NUM4=5【例】用算术运算符进行数值表达式运算。逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。【例】用逻辑运算符进行运算。MOV AL,34HAND0FH ;04H→ALMOV BL,05HOR30H ;35H→BLMOV CX,NOT00FFH ;0FF00H→CXMOV DX,789AHXOR000FH ;7895H→DX2.逻辑运算符关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。3.关系运算符4.属性运算符(1)PTR运算符格式:类型PTR地址表达式(1)SEG运算符(2)OFFSET运算符(3)TYPE运算符(4)LENGTH运算符(5)SIZE运算符(6)字节分离运算符5.数值返回运算符(1)SEG运算符格式:SEG变量或标号功能:分离出其后变量或标号所在段的段首址。例如:MOV AX,SEG ARRMOV DS,AX(2)OFFSET运算符格式:OFFSET变量或标号功能:分离出其后变量或标号的偏移地址。例如:

MOVBX,OFFSETBUF(3)TYPE运算符格式:TYPE变量或标号功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。(4)LENGTH运算符格式:LENGTH变量功能:取出变量所含的数据存储单元个数。【例】取出变量占存储单元个数。DATA SEGMENTA DB ‘ABCDEF’B DW 10 DUP(1,2DUP(2))C DB 3,20 DUP(0)DATA ENDS ┆ MOV AX,LENGTHA ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX ┆(5)SIZE运算符格式:SIZE变量功能:取出变量所含的数据存储区大小。其返回值为:

LENGTH变量*TYPE变量例如:上例中A、B、C三变量:SIZEA=LENGTHA*TYPEA=1SIZEB=LENGTHB*TYPEB=20SIZEC=LENGTHC*TYPEC=1(6)字节分离运算符字节分离运算符包括:HIGH和LOW。格式:HIGH常量或地址表达式

LOW常量或地址表达式功能:HIGH用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。运算符的优先级 用来对汇编时的一些情况进行说明,如起始终止信息、分段情况、变量说明、内存结构等等。指示性语句不产生任何目标代码。分为:

数据定义伪指令符号定义伪指令段定义伪指令SEGMENT/ENDS

假定伪指令ASSUME

置汇编地址计数器伪指令ORG

源程序结束伪指令END三、指示性语句1)段起始和结束伪指令 段名SEGMENT

段名

ENDS1.段名2.定位方式(边界类型)3.类别4.组合方式(连接方式)1、段定义伪指令1.段名段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。2.定位方式(1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。(3)BYTE:表示本段起始地址可以从任一地址处开始存放。(4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。【例】对连接程序进行连接后存储区各段相对位置分布。DATA1 SEGMENT ‘DATA’CODE SEGMENT ‘CODE’STACK1 SEGMENT ‘STACK’DATA2 SEGMENT ‘DATA’STACK2 SEGMENT ‘STACK’经连接程序连接后,各段的相对位置如下:DATA1 SEGMENT ‘DATA’DATA2 SEGMENT ‘DATA’STACK1 SEGMENT ‘STACK’STACK2 SEGMENT ‘STACK’CODE SEGMENT ‘CODE’3.类别组合方式有六种类型可供选择。(1)“不选择”(2)PUBLIC(3)STACK(4)COMMON(5)MEMORY(6)AT表达式4.组合方式2)段寄存器与段关系说明伪指令ASSUME 段寄存器:段名,段寄存器:段名,…功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。【例】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。DATA1 SEGMENTA DB1,2,3DATA1 ENDSSTACK SEGMENTSTACKDB 200DUP(0)STACK ENDSDATA2 SGEMENTB DB‘123ABCDATA2 ENDSDATA3 SEGMENTC DB?,?,?DATA3 ENDSCODE SEGMENT ASSUME DS:DATA1,ES:DATA2,CS:CODE,SS:STACKSTART: MOV AX,DATA1 MOV DS,AX ;DATA1→DS MOV AX,DATA3 MOV ES,AX ;DATA3→ES ┆Q1: MOV AL,AQ2: MOV C,AL ASSUME DS:DATA2 ;建立DS与B段的对应关系

MOV AX,DATA2 MOV DS,AX MOV AL,B MOV C,AL ┆CODE ENDS END START

3)置汇编地址计数器伪指令ORG格式:ORG数值表达式功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0~65535之间的非负整数。【例】给汇编地址计数器赋值。DATA SEGMENTORG 10 ;置$值为10VAR1 DW100H,200HORG $+5 ;置$的值为14+5,即为19VAR2 DB1,2,$+1,$+2N EQU$-VAR2 ;($)=23DATA ENDS1常量定义 格式: 表达式名 EQU 表达式

2数据定义 格式:变量名(标号)数据类型定义伪指令表达式

DB 1个字节,8位

DW 2个字节,16位

DD 4个字节,32位

DQ 8个字节,64位

DT 10个字节,80位4)数据定义伪指令3重复伪指令 格式: 重复次数 DUP (重复内容)4变量或标号的地址定义

DW和DD伪指令可以用来定义变量或标号的偏移地址和段地址。5地址计数器

$:表示正在汇编的当前地址四、DOS系统功能调用1简介2常用的DOS系统功能调用1简介对8086系列机来说,MS-DOS操作系统是最主要的操作系统。MS-DOS为各种应用程序、外围设备等提供软件接口。它由三部分组成:IO.SYS、MSDOS.SYS以及COMMAND.COM。DOS系统功能调用步骤:①设置所要调用功能的入口参数。②在AH寄存器中存入所要调用功能的功能号。③INT21H指令自动转入中断子程序入口。④相应中断子程序运行完毕,可按规定取得出口参数。2常用的DOS系统功能调用1.单字符输入(1号调用)2.单字符显示(2号调用)3.打印输出(5号调用)4.结束调用(4CH号调用)5.显示字符串(9号调用)6.字符串输入(10号调用)1.单字符输入(1号调用)格式:MOV AH,1

INT 21H功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。

2.单字符显示(2号调用)格式:MOVDL,待显示字符的ASCII码

MOVAH,2

INT21H功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。3.打印输出(5号调用)格式:MOV DL,待打印字符的ASCII码

MOV AH,5

INT 21H功能:将DL寄存器中的字符送打印机打印。4.结束调用(4CH号调用)格式:MOV AH,4CH

INT 21H功能:终止当前程序并返回调用程序。5.显示字符串(9号调用)格式:LEA DX,待显示字符串首偏移地址

MOV AH,9

INT 21H功能:将当前数据区中以‘$’结尾的字符串送显示器显示。6.字符串输入(10号调用)格式:LEA DX,缓冲区首偏移地址

MOV AH,10INT 21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。DOS程序的结束方式

方式一

MOV AH,4CH INT 21H方式二 主程序名 PROC FAR PUSH DS MOV AX,0 PUSH AX … RET

主程序名 ENDP … END 主程序名

1.程序计数器$

表示位置计数器的当前值,“$”出现在表达式里,它的值为程序下一个所能分配的存储单元的偏移地址。

2.ORG伪指令

ORG是起始位置设定伪指令,用来指出源程序或数据块的起点。利用ORG伪指令可改变位置计数器的值。

【例】给汇编地址计数器赋值。DATA SEGMENTORG 10 ;置$值为10VAR1 DW100H,200HORG $+5 ;置$的值为14+5,即为19VAR2 DB1,2,$+1,$+2N EQU$-VAR2 ;($)=23DATA ENDS7.4顺序结构程序设计一、数据传送指令1、一般传送指令格式: MOV 目的,源功能:该指令将源内容送至目的地址中

说明:①源操作数和目的操作数的操作类型必须明确且一致;当指令中只有一个操作数的类型明确时,另一个操作数被视为同一类型;当两操作数类型均不明确时,必须用“BYTE

PTR”或“WORD

PTR”将一个存储器操作数定义为字节或字类型。②指令执行后,源操作数内容不变。说明:③

指令执行后,对标志寄存器各位无影响。④

立即数、CS段寄存器不能作为目的操作数,。源操作数和目的操作数不能同时为存储器、两个段寄存器操作数。例:①

MOV

AH,DL②MOVAX,CX

③把A字单元内容传送到B字单元中:

MOVAX,A

MOVB,AX④

两个段寄存器之间数据传送,将DS送入ESMOVAX,DSMOVES,AX

而:

MOVAL,1000H;非法指令,例:若要设置数据段寄存器DS的初值为2000H,不能直接用指令

MOVDS,2000H

可用如下两条指令表示:

MOVAX,2000HMOVDS,AX2.交换指令XCHG格式:XCHG操作数1,操作数2功能:将源操作数和目的操作数的内容互换。说明:①操作数可以是字,也可以是字节。

②不允许两个存储单元之间直接交换数据。

③指令执行后不影响状态标志位。例:①

XCHGAL,AH②XCHGBUF[SI],BX③XCHGCH,VAR[DI]格式:PUSH 源操作数

POP 目的操作数功能:数据压入堆栈和数据弹出堆栈。PUSHF 标志寄存器FR内容压入堆栈 POPF 将栈顶内容送回标志寄存器3、堆栈操作指令PUSHFMOVBP,SPAND[BP],FEFF POPF

修改标志寄存器内容OFDFIFTFSFZFAFPFCF将TF强制置0,TF=0,CPU正常工作不产生陷阱。1)取16位偏移地址指令格式:LEA 16位寄存器,变量名功能:变量的偏移地址存入16位寄存器中同OFFSET指令相比,LEA指令功能更强,变量名可以有偏移量。例:LEABX,TABLE[SI];将TABLE的偏移地址+SI的内容送入BX4、地址传送指令2)取32位地址指令格式:

LDS 16位寄存器,变量名

LES 16位寄存器,变量名功能:将变量中保存的32位数作为32位地址取入指定的寄存器。4、地址传送指令LDS指令格式:LDSdest

,src功能:将源操作数所指存储单元中的第一个字传送给指定的16位通用寄存器,第二个字传送给段寄存器DS,即dest

(src),DS

(src

+2)。例:LDSSI,[10H]执行前(DS)=C000(C0010)=0180H(C0012)=2000H执行后

(SI)=0180H(DS)=2000HLES指令格式:LESdest

,src功能:将源操作数所指存储单元中的第一个字传送给指定的16位通用寄存器,第二个字传送给段寄存器ES,即dest

(src),ES

(src+2)8086/8088的算术运算指令主要包括二进制运算指令和十进制调整指令。本书介绍:1二进制加减运算指令2单操作数二进制运算指令3符号扩展指令4二进制乘除法运算指令注:

除加1、减1指令不影响CF,其余指令均对CF、OF、ZF、SZ、PF、AF产生影响。二、算术运算指令指令格式:ADDdest

,src功能:将目的操作数与源操作数相加,结果保存在目的操作数单元中,源操作数保持不变。其中:

dest为目的操作数,可以是通用寄存器或存储单元;

src为源操作数,可以是立即数、通用寄存器或存储单元。指令执行后对状态标志CF、OF、ZF、SZ、PF、AF产生影响。1.加法指令ADD例:分析下列指令执行后AX、CX寄存器和标志寄存器中各状态位的值。

ADDAX,CX指令执行前,假设(AX)=022AH,(CX)=14E8H。具体执行过程用二进制表示如下:

0000001000101010B

+0001010011101000B0001011100010010B由上式可知,最高位无进位,CF=0;低四位有进位,AF=1;最高位为0,SF=0;运算结果不为0,ZF=0;运算结果中1的个数为偶数,PF=1;运算结果无溢出,OF=0。执行后,CF=0,AF=1,SF=0,ZF=0,PF=1,OF=0。(AX)=022AH+14E8H=1712H;(CX)=14E8H,内容不变。2.带进位加法指令ADC指令格式:ADCdest

,src功能:与ADD区别是ADC指令执行时要将进位标志位CF加进去。该指令主要用于多字节数或多字数的相加运算。在多字节或多字相加时,先进行低字节或低字相加(用ADD指令实现),再进行高字节或高字相加。在进行高字节或高字相加时必须加上低位的进位CF。例:分析以下程序段DATASEGMENTNUM1DW5678H,1234H;双精度数12345678HNUM2DW0ABCDH,6789H;双精度数6789ABCDHSUMDW0,0DATAENDS……MOVAX,NUM1ADDAX,NUM2;两低位字相加

MOVSUM,AX;和放在SUM中

MOVAX,NUM1+2ADCAX,NUM2+2;高位字相加,同时加上进位CFMOVSUM+2,AX……该例完成两个双精度数的加法运算。运算过程如下所示:①两低位字相加0101011001111000B5678H+0ABCDH=0245H+1010101111001101B进位CF=110000001001000101B②两高位字相加0001001000110100B1234H+6789H=79BDH

+0110011110001001B0111100110111101B再加进位CF

1B

79BDH+1=79BEH0111100110111110B3.加1指令INC指令格式:INCdest功能:操作数自身加1,结果再送回到原操作数单元中。即dest

(dest)+1。其中:INC为操作码助记符;

dest为操作数,可以是通用寄存器或存储单元,若为存储单元,必须指明其操作类型(字或字节)。该指令执行结果影响除CF外的所有条件标志,主要用于对计数器或地址指针的调整,常用在循环结构程序中。例:以下指令可实现对寄存器或存储单元加1(注意存储单元的类型)。

INCALINCCXINCWORDPTR[BX]INCBYTEPTR[1000H]4.减法指令SUB

指令格式:SUBdest

,src功能:将目的操作数与源操作数相减,结果保存在目的操作数单元中,源操作数保持不变。即dest

(dest)-(src)。其中:

dest为目的操作数,可以是通用寄存器或存储单元;

src为源操作数,可以是立即数、通用寄存器或存储单元。例:分析下列指令MOVAX,8765HSUBAX,1234H上述两条指令可以对两个立即数8765H与1234H求差运算,最终结果保存在AX中,即(AX)=7531H5.带借位减法指令SBB指令格式:SBBdest

,src功能:与SUB指令基本相同,区别是SBB指令执行时要减去借位标志CF。

即dest

(dest)-(src)-CF。该指令主要用于多字节数或多字数相减运算。运算时,先进行低字节或低字相减(用SUB指令实现),再进行高字节或高字相减。在进行高字节或高字相减时,必须减去低位的借位CF。例:有两个双精度数0A1365724H和9248B578H,计算两数之差,结果的高位放在DX中,低位放在AX中。程序段如下:

MOVAX,5724HSUBAX,B578H;低字相减,有借位

MOVDX,0A136HSBBDX,9248H;高字相减,再减去借位6.减1指令DEC指令格式:DECdest功能:操作数自身减1,结果送回到原操作数单元中。其中:dest与INC指令中规定相同。注意:该指令不影响进位标志CF的状态,常用在循环结构程序中。DECCX;CX

(CX)-1DECBYTEPTR[BX];必须指明存储单元的操作类型(字或字节)例:7.求补指令NEG指令格式:NEGdest功能:将目的操作数按位取反后加1,送回原操作数单元中。即dest

0-(dest)。其中:NEG为操作码助记符;

dest与INC指令中规定相同。注意:该指令影响所有的条件标志。例:分析下列指令的执行结果。

NEGAX指令执行前,(AX)=10H指令执行后,(AX)=(0010H)+1=0FFF0H例:假设有一双精度数,低字保存在AX中,高字保存在DX中。若要求其补码,

可用如下指令实现:NEGAX MOVBX,0 SBBBX,DX MOVDX,BX符号扩展指令在实际中,有时需要将操作数由字节型转换成字型,或由字型转换成双字型。不能简单地通过在高位补0的方法实现,因为带符号数在计算机中是以补码形式存放。扩展时,正数前补0,负数前全补1。为便于扩展,8086/8088提供了两条符号扩展指令CBW和CBD。1.字节扩展指令CBW指令格式:CBW功能:将AL中数的符号位扩展到AH中。若AL中的数为正数,则(AH)=00,若AL中的数为负数,则(AH)=0FFH。MOVAL,-15;AL←0F1HCBW执行后,(AX)=0FFF1H。例:2.字扩展指令CWD指令格式:CWD功能:将AX中数的符号位扩展到DX中。若AX中的数为正数,则(DX)=0000,否则(DX)=0FFFFH。MOVDX,0MOVAX,0FA48HCWD指令执行后,(AX)=0FA48H,(DX)=0FFFFH。注意:以上两条指令在使用时均不带操作数,即它们只能对隐含的累加器中的内容进行操作。例1.无符号数乘法MUL语句格式:MULOPS功能:若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。即字节乘法:(AL)*(OPS)→AX,字乘法:(AX)*(OPS)→DX,AX

乘除指令位运算【例】无符号数A3H与11H相乘。MOV AL,A3H ;(AL)=A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H说明(1)MUL指令有两种操作类型,即字节乘和字乘,MUL操作类型取决于OPS的类型,OPS类型必须明确(2)乘数不能是立即数。(3)MUL指令只影响OF和CF位。若乘积的高一半(即字节相乘时乘积中的(AH),字相乘时乘积中的(DX))为0,则OF=CF=0,否则OF=CF=1。当CF=OF=1时,AH或DX中有乘积的有效数字,CF=OF=0时,AH或DX中无乘积的有效数字,即说字节乘以字节,积为字节或字乘以字,积为字。可用OF和CF位检查字节乘时乘积的结果是字节还是字,字乘时乘积的结果是字还是双字。2.有符号乘指令IMUL语句格式:IMULOPS功能:字节乘法:(AL)*(OPS)→AX,字乘法:(AX)*(OPS)→DX、AX。IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。【例】有符号数B4H与11H相乘MOV AL,0B4H ;(AL)=B4HMOV BL,11H ;(BL)=11HIMUL BL ;(AX)=0FAF4H说明(1)

IMUL指令也只影响OF和CF位,对其它标志位不确定。(2)若乘积的高一半(即AH或DX)是低一半(即AL或AX)的符号扩展,则OF=CF=0,否则,OF=CF=1。

当OF=CF=1亦标志着AH或DX中放有乘积的有效值,即标志着(AH)和(DX)不是对应的低半部分的符号扩展。3.无符号除指令DIV语句格式:DIVOPS功能:字节除法(AX)/(OPS)→AL(商)、AH(余数)字除法(DX、AX)/(OPS)→AX(商)、DX(余数)【例】无符号数0400H/0B4HMOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HDIV BL ;商(AL)=05H,余数(AH)=7CH说明(1)DIV指令有两种操作类型,即字节除和字除,DIV操作类型取决于OPS的类型,OPS类型必须明确,(2)除数不能是立即数。(3)DIV指令执行后,各标志位不确定,但商可产生溢出。一般情况下,当被除数的高一半(即字节除时为(AH),字除时为(DX))大于除数时,商就会产生溢出。若商溢出,则产生0号中断(除法出错中断),转入除法出错中断处理。4.有符号除指令IDIV语句格式:IDIVOPS功能:字节除法:(AX)/(OPS)→

AL(商)、AH(余数)字除法(DX,AX)/(OPS)→

AX(商)、DX(余数)【例】有符号数0400H/0B4HMOV AX,0400H ;(AX)=0400HMOV BX,0B4H ;(BX)=0B4HIDIV BX ;(AL)=0F3H,(AH)=24H说明:(1)IDIV指令商的符号由被除数符号与除数符号异或运算而得到,余数的符号规定与被除数的符号相同。(2)一般情况下,当被除数高一半(AH或DX)的绝对值大于除数的绝对值时,则可判断IDIV指令操作结果产生了溢出,即产生0号中断。乘、除法指令使用寄存器运算被乘/除数源操作数结果8位乘8位AL8位AX16位乘16位AX16位DX:AX16位除8位AX8位商:AL,余数:AH32位除16位DX:AX16位商:AX,余数:DX【例】编程计算:F=(V-(X*Y+Z-540))/X,其中X、Y、Z、V为16位有符号数。DATA SEGMENT X DW 25 Y DW 20 Z DW 140 V DW 50 F DW 2DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,X IMUL Y ;DX:AX=X*Y MOV CX,AX MOV BX,DX ;BX:CX=X*Y MOV AX,Z CWD ;DX:AX=Z ADD CX,AX ADC BX,DX ;BX:CX=X*Y+Z SUB CX,540 SBB BX,0 ;BX:CX=X*Y+Z-540 MOV AX,V CWD ;DX:AX=V

SUB AX,CX SBB DX,BX ;DX:AX=V–(X*Y+Z-540)IDIV X ;AX=(V-(X*Y+Z-540))/X(商) ;DX=(V-(X*Y+Z-540))/X(余数) MOV F,AX MOV F+2,DX MOV AX,4C00H INT 21HCODE ENDS END START三、位运算指令1、逻辑运算指令(1)求反指令NOT(2)逻辑乘指令AND(3)测试指令TEST(4)逻辑加指令OR(5)按位加指令XOR2、移位指令算术移位指令、逻辑移位指令、循环移位指令;分别进行左移和右移操作。(1)求反指令NOT语句格式:NOTOPD功能:将目的地址中的内容逐位取反后送入目的地址。即(OPD)→OPD【例】逻辑非运算。MOV AX,878AH ;(AX)=878AHNOT AX ;(AX)=7875H(2)逻辑乘指令AND语句格式:ANDOPD,OPS 功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。即(OPD)∧(OPS)→OPD。该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:1∧1=1,1∧0=0,0∧1=0,0∧0=0【例】将AL中第3位和第7位清零。

MOV AL,0FFHAND AL,77H(3)测试指令TEST语句格式:TESTOPD,OPS功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。即(OPD)∧(OPS)。【例】测试AX中的第12位是否为0,不为0则转L。TEST AX,1000HJNE L

(4)逻辑加指令OR语句格式:OROPD,OPS功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。即(OPD)∨(OPS)→OPD。说明:逻辑加的运算法则为:1∨1=1,1∨0=1,0∨1=1,0∨0=0。【例】将AL寄存器中第3位和第7位置1。MOV AL,0OR AL,88H(5)按位加指令XOR语句格式:XOROPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。即(OPD)⊕(OPS)→OPD。说明:按位加的运算法则为;1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。【例】按位加运算。MOV AL,45H ;(AL)=45HXOR AL,31H ;(AL)=74H2、移位指令语句格式:[标号:]操作符OPD,1或[标号:]操作符OPD,CL功能:将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。(1)算术左移指令格式:SALOPD,COUNT

功能:将目的操作数向左移动COUNT指定的位数,每左移一位,最低位补0,最高位送CF。有符号数乘2(2)算术右移指令格式:SAROPD,COUNT

功能:将目的操作数向右移动COUNT指定的位数,每右移一位,最高位均保持不变,最低位送CF。有符号数除2(3)逻辑左移指令格式:SHLOPD,COUNT

功能:SAL指令与SHL指令的功能完全相同。无符号数乘2(4)逻辑右移指令格式:SHROPD,COUNT

功能:将目的操作数向右移动COUNT指定的位数,每右移一位,最高位补0,最低位送CF。无符号数除2【例】算术右移运算MOV BH,0F4H ;(BH)=0F4HMOV CL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH,(CF)=0该例语句“SAR

BH,CL”实际上完成了(BH)/4→BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)【例】利用算术逻辑移位指令来进行乘除运算编程求F=(68*9-218)/2DATA SEGMENT X DW 68 Y DW 218 F DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,X MOV BX,X MOV CL,3

SHL AX,CL ;AX=X*8 ADD AX,BX ;AX=X*9SUB AX,Y ;AX=X*9–Y MOV CL,1 SHR AX,CL ;AX=(X*9–Y)/2 MOV F,AX MOV AX,4C00H INT 21H

温馨提示

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

评论

0/150

提交评论