微机原理汇编语言程序设计基本方法.docx
- 文档编号:11092407
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:74
- 大小:647.66KB
微机原理汇编语言程序设计基本方法.docx
《微机原理汇编语言程序设计基本方法.docx》由会员分享,可在线阅读,更多相关《微机原理汇编语言程序设计基本方法.docx(74页珍藏版)》请在冰点文库上搜索。
微机原理汇编语言程序设计基本方法
第四章汇编语言程序设计基本方法
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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 汇编语言 程序设计 基本 方法