微机原理汇编语言程序设计基本方法.docx

上传人:b****3 文档编号:11092407 上传时间:2023-05-29 格式:DOCX 页数:74 大小:647.66KB
下载 相关 举报
微机原理汇编语言程序设计基本方法.docx_第1页
第1页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第2页
第2页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第3页
第3页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第4页
第4页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第5页
第5页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第6页
第6页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第7页
第7页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第8页
第8页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第9页
第9页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第10页
第10页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第11页
第11页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第12页
第12页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第13页
第13页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第14页
第14页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第15页
第15页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第16页
第16页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第17页
第17页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第18页
第18页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第19页
第19页 / 共74页
微机原理汇编语言程序设计基本方法.docx_第20页
第20页 / 共74页
亲,该文档总共74页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微机原理汇编语言程序设计基本方法.docx

《微机原理汇编语言程序设计基本方法.docx》由会员分享,可在线阅读,更多相关《微机原理汇编语言程序设计基本方法.docx(74页珍藏版)》请在冰点文库上搜索。

微机原理汇编语言程序设计基本方法.docx

微机原理汇编语言程序设计基本方法

第四章汇编语言程序设计基本方法

4.1汇编语言基本概念汇编语言与机器语言

4.1.1编语言与机器语言

汇编语言是用意义明确的助记符来表示指令的操作码、操作数。

汇编语言是面向机器的语言,不同的机器有不同的汇编语言。

用汇编语言编写的程序具有执行速度快、占用存储空间小、实时性能好等待点。

汇编语言放大量用于编写计算机系统程序、实时控制程序等。

用汇编语言编写的程序称为汇编语言源程序(简称汇编语言程序)。

计算机必须将汇

编语言程序翻译成由机器代码组成的目标程序才能执行。

这个翻译过程称为汇编。

自动

完成汇编过程的软件叫汇编程序。

汇编语言的语句有两种基本类型:

指令与伪指令。

4.1.2编语言中语句的组成

 名称

空格

操作助记符

空格

操作数

注释

例如:

CYCLE:

ADDAX,02;(AX)←(AX)+02

DATA1DB20H,30H,40H,50H

1.名称

1)组成名字的字符

(1)字母A—Z

(2)数字0一9;

(3)专用字符?

、.、@、_、$

2)组成名称的规则

(1)除数字0一9外所有字符都可以放在名字的第一个位置。

(2)使用字符“.“时必须放在名字的第一个位置。

(3)名字最多可以使用31个字符、汇编程序不能识别多余的字符。

3)以冒号分割时,名称是一个标号;以空格分割时,名城既可以使标号,也可以是变量。

2.操作助记符(助记符)

操作助记符将指出该语句的基本操作功能。

必须存在。

操作符可以是指令、伪指令或宏指令的助记符。

3.操作数

操作数可以表示数字本身,也可以是指出如何获得操作数的信息。

操作数不是必需的,操作数多于两个时,中间用逗号分割,操作数与操作助记符之间必须用空格分割。

4.注释

近用作语句或程序的说明,不产生目标代码。

4.1.1汇编语言中的常数与表达式

1.常数

B:

表示二进制数10110011B

D:

表示十进制数179D或179

O:

表示八进制数263O

H:

表示十六进制数B3H

用单引号“‘”括起来的一串字符称为字符串常量

2.表达式

表达式由操作数和操作符组成

操作数可以是常数或标识符、表达式

操作符:

算术操作符、关系操作符、属性操作符及其它操作符等

(1)算术操作符:

+、-、*、/、MOD,双操作数操作符,操作数必须为数字操作数,MOD的两个操作数必须都为正整数。

例如:

79MOD16

0B5HMOD10H

(2)逻辑操作符:

AND(与)、OR(或)、NOT(非)、XOR(异或)。

操作数必须为两个数字,按位运算。

例如:

11001100BAND11110000B结果:

11000000B

11001100BOR11110000B结果:

11111100B

NOT11110000B结果:

00001111B

11001100BXOR11110000B结果:

00111100B

注意:

逻辑操作符同时也是逻辑运算指令的操作助记符。

例如:

ANDAL,0CHOR0FH

(3)关系操作符:

EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(不大于)、GE(不小于);关系运算的操作数必须为数字,当关系成立时,其结果为全1;当关系不成立时,其结果为全0。

汇编语言中表达式不能单独构成语句,只能是语句的一部分。

例如:

MOVAX,BUF+2

ADDAL,VALAND0FH

JMPAGAIN+3

MOVBL,VBLEVA

 

4.1.2标号、变量及伪指令

1.标号

标号是由标识符表示的指令的名称,指示对应指令的位置(地址)。

标号的三个属性:

段地址、偏移地址和类型。

标号的类型属性:

NEAR和FAR;

NEAR:

段内使用;FAR:

段间使用

标号定义的基本方法:

指令的助记符前加上标识符和冒号,例如:

START:

PUSHDS

2.变量

(1)变量的定义

变量通过伪指令定义:

变量名DB表达式;定义字节变量

变量名DW表达式;定义字变量

变量名DD表达式;定义双字变量

变量名DQ表达式;定义长字变量

变量名DT表达式;定义一个十字节变量

变量名是一个标识符,变量的类型与关键字DB、DW、DD、DQ、DT有关。

表达式的表示:

1一个或多个常数或表达式

2带引号的字符串

3一个问号“?

4重复方式     重复次数   DUP(表达式)

例如:

DATA1DB20H

DATA2DW0204H,1000H

DATA3DB(-1*3),(15/3)

DATA4DD12345H

DATA5DB‘0123’

DATA6DW‘AB’,‘C’,‘D’

DATA7DB?

DATA8DD?

DATA9DB5DUP(00)

DATA10DW3DUP(?

“?

”:

表示其值不确定

当表达式的值为字符串时,字节类型与字类型不同处理。

图4.1P57页

(2)变量的属性

1段地址(SEG):

变量所在段的段地址

2偏移地址(OFFSET):

变量所在段内的偏移地址。

3类型(TYPE):

变量所占据的字节数

DB→1DW→2DD→4DQ→8DT→10

4长度(LENGTH):

一个变量明所定义的变量的个数,用DUP为重复的个数。

5大小(SIZE):

类型与长度的乘积

前三个为主属性,后两个为辅助属性

变量名

段地址

偏移地址

类型

长度

大小

DATA1

DATA2

DATA3

DATA4

DATA5

DATA6

DATA10

4.1.3属性操作符及表达式

1.获取属性的操作符

SEG(变量名或标号)所在段的段地址

OFFSET(变量名或标号)再段内的偏移量

TYPE(变量名或标号)类型

LENGTH(变量名)长度

SIZE(变量名)大小

例如:

SEGDATA1

OFFSETDATA1

LENGTHDATA6

TYPEDATA6

SIZEDATA9

例如:

MOVAX,SIZEDATA9

MOVAX,SEGDATA1

MOVBL,TYPEDATA

例如:

DAT1DB02H

DAT2DW0F00H

DAT3DW5DUP(?

DAT4DBLENGTHDAT3;存放变量DAT3的长度5

DAT5DWDAT3;

2.PTR操作符

格式:

类型PTR表达式

类型:

BYTEWORDDWORDNEARFAR

功能:

重新定义已定义的变量或标号的类型

MOVBYTEPTRDAT3AL

4.2

8086/8088指令系统

指令类型:

(1)数据传送指令

(2)算术运算指令

(3)逻辑运算指令

(4)移位指令

(5)标志处理指令和CPU控制指令

(6)转移和循环控制指令

(7)调用和返回指令

(8)字符串操作指令

(9)输入、输出指令

4.2.1数据传送类指令

通用传送指令包括:

传送指令、进栈指令、出栈指令和交换指令。

1.传送指令(MOV)

MOVDST,SRC(DST)←(SRC)

其中SRC表示源操作数,DST表示目的操作数。

功能:

将源操作数SRC的一个字节或一个字传送到目的操作数DST所指单元。

源操作数:

通用寄存器、段寄存器、立即数和内存单元。

目的操作数:

通用寄存器、段寄存器和内存单元。

(1)累加器和存储器单元之间的传送

(2)存器之间的传送

(3)寄存器和存储器单元之间的传送

(4)立即数传送

(5)段寄存器和通用寄存器之间的传送

(6)段寄存器和存储器单元之间的传送

例如:

MOVAX,BX

MOVAL,DL

MOVAX,02

MOVSI,[BX]

MOVAL,4[DI]

MOVAX,[BX+2]

MOV[BX][DI],DX

重点讲述后三条指令

又例如:

变量的定义:

DATA1DW20H,30H

DATA2DB50H,60H,70H

DATA3DW10HDUP(?

相应传送指令:

MOVAX,DATA1

MOVDATA3,BX

MOVAL,DATA2[DI]

MOVDATA3[SI],DX

MOVCX,LENGTHDATA3

MOVBX,SIZEDATA3

MOVSI,OFFSETDATA2

指令中传送的是一个字还是一个字节,通常由操作数的类型确定。

下列指令中,没有确定的类型,是错误的。

MOVDATA3[SI],02H

MOV2[SI],AL

MOV4[DI],02

可以采用如下方式纠正:

MOVBYTEPTR4[DI],02

如果两个操作数的类型不一致,也是错误的:

DATA1DW05H

DATA2DB0FH,10H,0AH

DATA3DB5DUP(?

MOVAX,BL

MOVAL,DATA1

MOVBX,DATA3[SI]

可以采用如下方式纠正:

MOVAL,BYTEPTRDATA1

内容归纳:

(1)两操作数进行数据传送的正常通路

(2)寄存器间接寻址、寄存器相对寻址、基址变址寻址和基址变址相对寻址方式只能使用变址寄存器DI,SI和基址寄存器BX,BP。

(3)寄存器相对寻址和寄存器基址变址相对寻址方式的位移量DISP可以是常量、变量,并且有多种素、书写方式

MOVAX,DISP[BX]

MOVAX,[BX+DISP]

MOVAX,[BX].DISP

MOVAX,[BX]+DISP

(4)段寄存器不是DS,而是ES时,用如下方式表示:

MOVAX,ES:

[SI]

对BP寄存器

MOVAL,DATA2[BP];对应DS段

MOVAL,10[BP];对应SS段

2.取有效地址指令(LEA)

功能:

将源操作数SRC的有效地址(偏移地址)送入寄存器REG中。

MOVAX,10H[DI]

LEAAX,10H[DI]

上面两条指令的功能是完全不同的。

一个取数值,一个取偏移地址。

下面的指令也可以使用:

LEADI,DATA1

LEABX,AGAIN

下面两条指令等价:

MOVAX,OFFSETDATA1

LEAAX,DATA1

3.取地址指针指令(LDS,LES)

功能:

将源操作数SRC的有效地址所对应的内存单元中的32位内容分别送到DS(或ES)和指令中所指出的寄存器REG中。

TABLEDB10H,20H,30H,40H,50H

POINT1DD02001000H

POINT2DDTABLE

LDSDI,POINT1

LESSI,POINT2

只能用于DI和SI两个段寄存器。

4.标志传送指令(LAHF,SAHF)

LAHF:

PSW中低8位内容送入寄存器AH

SAHF:

将AH中的8位内容送入标志寄存器的低8位中。

5.数据交换指令(XCHG)

功能:

完成寄存器与寄存器或寄存器与存储单元之间内容交换。

要求:

两个操作数必有一个寄存器(非段寄存器)

XCHGAX,BX

XCHGCX,[DI]

XCHGBX,DATA1

 

6.字节转换指令(XLAT)

隐含寻址方式,EA=(BX)+(AL)

功能:

将EA所对应的内存单元中一个字节送入AL中。

例如:

求CODE1代码中的5所对应的CODE2代码。

MOVAX,SEGTABLE

MOVDS,AX

MOVBX,OFFSETTABLE

MOVAL,06

XLAT

CODE1和CODE2的代码表参见P67表4.6

7.堆栈操作指令

(1)堆栈

定义:

以后进先出(LIFO)的规则存取信息的一种存储机构。

堆栈指示器(堆栈指针):

管理堆栈中存取地址的一个专门地址寄存器。

它始终指向堆栈中最后存入信息的那个单元,该单元称为堆栈顶。

8086/8088CPU中,堆栈指针为寄存器SP(16位地址寄存器),用来寄存堆栈区的偏移地址,段地址存放在段寄存器SS中。

(2)堆栈操作指令

(A)压入指令(PUSH)

将SRC或标志寄存器FLAG的内容送入堆栈,并修正堆栈指针的内容,双字节操作(字类型)。

PUSHAX;

PUSHDS

PUSH[SI]

地址

内容

00F8H

08

00F9H

07

00FAH

06

00FBH

05

00FCH

04

00FDH

03

00FEH

02

00FFH

01

0100H

PUSHF

例如:

MOVAX,0FFFFH

PUSHAX

(B)弹出指令(POP)

将SP所指的栈顶的内容取出,并送入DST所指寄存器、内存单元或标志寄存器FLAG,并修正SP内容。

例如:

MOVSP,0100H

PUSHAX

PUSHBX

POPAX

POPBX

下面的指令是错误的:

PUSH1234H

PUSHAL

 

4.2.2算术运算类指令

1.加法和减法指令

ADDDST,SRC(无进位加法)

ADCDST,SRC(带进位加法)

SUBDST,SRC(无借位减法)

SBBDST,SRC(带借位减法)

NEGDST(取负)

目的操作数DST:

通用寄存器、任一寻址方式所指定的内存单元。

源操作数SRC:

立即数、通用寄存器和任一寻址方式所指定的内存单元。

不能从内存到内存。

ADDAL,BL

ADDCX,08H

ADDAX,[SI]

ADDAX,[BX][DI]

SUBAL,CL

SUB[BX],DX

ADCAX,0

SBBCX,DATA1

 

1)ADDAX,[SI]

目的操作数的寻址方式为寄存器方式,源操作数的寻址方式为寄存器间接方式。

功能:

将AX的内容与寄存器SI的内容所指的内存单元中的16位数相加,结果送入AX,并设置标志寄存器FLAG的各位。

算术运算对标志寄存器中的DF、IF、TF均不产生影响。

CF进位(或借位)与OF的区别

MOVAX,0FDAAH

MOVBX,0FBCEH

ADDAX,BX

结果:

(AX)=0F978H,(BX)=0FBCEH,CF=1,OF=0

2)SBBCX,DATA1

带借位的16位数减法指令。

目的数的寻址方式为寄存器方式,源操作数的寻址方式为直接方式。

指令执行前,(CX)=3F50H,变量DATA1在数据段内的偏移地址为0006H,对应单元中16位数为1728H,借位标志(CF)=1,指令执行过程如下:

结果:

(CX)=0010100000100111

(FLAG)=XXXX0···00X1X1X0

带进位的加、减法指令主要用于多位数的加、减运算。

例如:

在内存中偏移地址为ADR1开始的连续单元中存放着两个4字节操作数A和B,求该两数之和,并将结果放入ADR2开始的连续单元中。

假设操作数由变量定义的方式存入内存,并且其段地址已送入DS,偏移地址ADR1已送入寄存器DI。

MOVAX,4[DI]

ADDAX,[DI]

MOVADR2,AX

MOVAX,6[DI]

ADCAX,2[DI]

MOVADR2+2,AX

[对指令的执行进行说明]

 

NEGDST指令称为取负指令,是一条单操作数指令。

它的功能是将目的操作数的值取负。

正数---》该数的负数的补码,负数(补码)--》该数的正数。

指令中操作数的寻址方式可采用除立即数外的各种寻址方式,但不能是段寄存器。

NEGAX

NEGBYTEPTR[DI]

NEGWORDPTR4[BX]

NEGDAT1[SI]

例如:

第一条指令,设(AX)=00F2H,则结果(AX)=FF0EH,同时CF=1,SF=1,AF=1,PF=0,OF=0,ZF=0。

2.比较指令

格式:

CMPDST,SRC;DST-SRC并设置标志位

指令的功能:

目的操作数减去源操作数,并根据相减结果设置各标志位。

CMPAL,BL

CMPAL,[DI]

CMPAX,CX

CMPAX,06H

3.增量和减量指令

INCDST

DECDST

均为单操作数指令。

操作数的寻址方式为除立即数和段寄存器外的其他各种寻址方式。

指令的功能是对目的操作数加1或减1。

标志位初CF外都受影响。

INCAL

INCBX

INCWORDPTR4[BX]

DECCX

4.乘法与除法指令

MULSRC

IMULSRC

;有符号乘法,操作数同上。

例:

MULDAT1

IMULCL

MULBYTEPTR[BX]

(1)带符号运算时,操作数和结果均以补码表示,结果的符号按一般的运算规则确定。

(2)乘法指令中的目的操作数的寻址方式是隐含的,并且一定是累加器AX或AL。

源操作数的寻址方式可采用除立即数和段寄存器外的各种寻址方式。

(3)指令是字运算或字节运算由源操作数的类型确定。

字运算:

AX-》DX:

AX,字节运算:

AL--》AX

(4)乘法指令执行后,标志寄存器中只有CF和OF位有意义,其它各位不确定。

MUL指令,结果中的高16位(字运算)或高8位(字节运算)均为0时,CF和OF被置0,否则置1。

IMUL指令:

结果中高16位(字运算)或高8位(字节运算)为低16位或低8位的符号扩展时,CF和OF被置0,否则CF和OF置1。

乘除法指令分带符号运算和不带符号运算两种。

例:

比较MUL与IMUL乘法的不同:

DAT1DW8004H

MOVAX,05H

MULDAT1

MOVAX,05H

MULBYTEPTRDAT1

MOVAX,05H

IMULBYTEPTRDAT1

MOVAX,05H

IMULWORDPTRDAT1

 

4条指令的运行

(1)无符号字运算

(2)无符号字节运算

(3)带符号字节运算

(4)带符号字运算

 

除法指令中的目的操作数的寻址方式也是隐含的,并且一定是DX:

AX或AX。

5.符号扩展指令

CBWAL的符号据扩展到Ah中

CWDAX中的符号扩展到DX中

6.BCD数调整指令

BCD数调整指令的操作数均为隐含寻址(AL,AX)

AAA加法分离BCD数调整,影响AF,CF

AAS减法分离BCD数调整,影响AF,CF

DAA加法组合BCD数调整,OF标志位无定义,影响其余各标志位

DAS减法组合BCD数调整,OF标志位无定义,影响其余各标志位

AAM乘法分离BCD数调整,影响SF,ZF,PF,但OF,AF,CF无定义

AAD除法分离BCD数调整,影响SF,ZF,PF,但OF,AF,CF无定义

对BCD数进行十进制运算

(1)对BCD数按二进制进行运算

(2)对运算结果进行相应的调整

调整方法是:

累加器AL低4位大于9或辅助进位标志位AP=1,则累加器AL加06H修正。

累加器AL高4位大于9或进位标志位CY=1,则累加器AL加60H修正,

累加器AL高4位大子等于9,低4位大于9,则累加器AL进行加66H修正。

BCD码是一种用二进制编码的十进制数,又称为二一十进制数。

8086/8088中BCD码分为两种形式:

其一是用四位二进制数表示一位十进制数,称为压缩的BCD码;其二是用八位二进制数表示一位十进制数、称为非压缩的BCD码,它的低四位是BcD码,高四位没有意义。

AAM和AAD只能调整分离BCD码的运算。

例:

求两个4位组合BCD数的和

BCD1DB45H,19H

BCD2DB71H,12H

BCD3DB2DUP(?

MOVAL,BCD1

ADDAL,BCD2

DAA

MOVBCD3,AL

MOVAL,BCD1+1

ADCAL,BCD2+1

DAA

MOVBCD3+1,AL

例:

设有两数X,Y,且X=85,Y=6,用分离BCD数完成X/Y

BCD1DB05H,08H

BCD2DB06H

BCD3DB3DUP(?

MOVAH,0

MOVAL,BCD1+1

MOVBL,BCD2

DIVBL

MOVBCD3+1,AL

MOVAL,BCD1

AAD

DIVBL

MOVBCD3,AL

MOVBCD3+2,AH

4.2.3逻辑运算类指令

ANDDST,SRC

ANDDST,DATA

ORDST,SRC

ORDST,DATA

XORDST,SRC

XORDST,DATA

TESTDST,SRC

TESTDST,DATA

NOTDST

SRC:

立即数,通用寄存器和任一寻址方式所制定的内存单元。

DST:

通用寄存器和任一寻址方式所制定的内存单元,但不允许是立即数。

指令可以是字节操作,也可以是字操作。

NOT指令对标志位不产生影响,其余指令将使CF,OF置0,并以正常规则设置SF,ZF,PF的状态。

ANDAL,01H

ANDAX,BX

ORBYTEPTRAVL,80H

TESTAL,08H

NOTBX

(AX)=5555H,(BX)=0FF00H,AVL--〉09H

TEST指令和AND指令的区别:

TEST指令只影响标志位,不影响原目的操作数的值。

逻辑运算指令可以通过选用不同的源操作数的各位代码,使目的操作数的某些位置位、清零和测试目的操作数的某些位。

ORCL,03H

ANDAL,0F5H

XORAH,0FH

TESTAL,02H

JZZER

XORAL,TEXT_CODE

JZPROC1

4.2.4移位指令和循环移位指令

SHRDST,CNT

SHL/SALDST,CNT

SARDST,CNT

RORDST,CNT

ROLDST,CNT

RCRDST,CNT

RCLDST,CNT

功能:

将DST所指出的操作数的各位左移或右移若干位,移位的次数由CNT确定。

DST:

除立即数外的各种寻址方式,但不能是段寄存器。

CNT可以是立即数或寄存器CL。

为立即数时,只能为1。

左移指令:

右移指令:

对标志的影响:

对AF无影响,循环移位只影响CF和OF,(可能影响ZF,但无意义)。

只有CNT=1时,OF有意义,当操作数的最高位在移位前后不发生变化OF=0,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2