汇编语言程序设计的基本方法P52.docx
《汇编语言程序设计的基本方法P52.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计的基本方法P52.docx(80页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计的基本方法P52
第四章汇编语言程序设计的基本方法P-52
4.1汇编语言基本概念P52
4.1.1汇编语言与机器语言
汇编语言机器语言
ADDAX,02H00000101
00000010
00000000
功能:
AX和数0002相加,和存放在AX中
机器语言:
用指令的机器码来编写程序,CPU能直接执行。
汇编语言:
用助机符和符号来编写程序,再由汇编程序汇编成机器语言程序。
4.1.2汇编语言中语句的组成
汇编语言语句格式:
DATA1DB20H,30H,40H;指示性语句
CYCLE:
ADDAX,02;(AX)←(AX)+0002指令性语句
1.名称
是一个标识符:
字符开始,最多31个。
CYCLE是一个标号(加冒号);DATA1是一个变量名,其他语句可引用。
(多数为标号或变量,也可有别的含义,如常数等)
2.操作助记符
指令助记符:
CPU能执行的指令。
伪指令助记符:
控制汇编过程,如DB、DW等
3.操作数
由操作助记符要求。
可以是操作数本身,也可以是表达式等。
4.注释
程序员的说明,可单独构成一行。
4.1.3汇编语言中的常数和表达式
1.常数
数值常数
◇B表示二进制数:
10110011B
◇D表示十进制数:
179D或179
◇O表示八进制数:
263O
◇H表示十六进制数:
0B3H
字符串常数:
使用单引号‘a’例:
MOVAL,‘A’
2.表达式
算术操作符:
+、─、
、/、MOD(取模)等。
ADDAL,
;即为ADDAL,42
MOVAL,79MOD16;即为MOVAL,15
逻辑操作符:
AND、OR、NOT、XOR等
ADDAL,10101010BAND00001111B
即为:
ADDAL,00001010B
关系操作符:
EQ(相等),EN(不相等),
LT(小于),GT(大于),
LE(小于等于),GE(大于等于);
如果关系式成立则为全1,否则为全0。
例:
MOVAX,BUF+2
ADDAL,VALAND0FH
JMPAGAIN+3
MOVBL,VBLEVA
注意:
此处四条不一定全讲书上没有具体解释
4.1.4标号、变量及伪指令
1.标号(后加冒号)
标号是由标识符表示的指令(CPU指令)的名称
用以指示对应的指令的位置。
标号的三个属性:
段地址(SEG):
标号所在段的段地址。
偏移地址(OFFSET):
标号所在段内的偏移地址。
类型:
NEAR(-1)类型表示在段内使用。
FAR(-2)类型表示在段间使用。
例:
START:
PUSHDS
;段寄存器DS的内容压入堆栈
2.变量(不加冒号)
1)变量定义(格式)
变量名DB表达式;定义字节变量
变量名DW表达式;定义字变量
变量名DD表达式;定义双字变量
变量名DO表达式;定义长字变量
变量名DT表达式;定义十字节变量
例4.1.4P57
DATA1DB20HDB、DW、DD,DQ、DT
DATA2DW0204H,1000H定义变量的类型分别为:
DATA3DB(-1*3),(15/3)1、2、4、8、10
DATA4DD12345HDB、DW、DD定义变量的类型
DATA5DB‘0123’通常称为BYTE、WORD、DWORD
DATA6DW‘AB’,‘C’,‘D’
DATA7DB?
DATA8DD?
DATA9DB5DUP(00)
DATA10DW3DUP(?
)
2)变量的属性
段地址(SEG):
变量所在段的段地址。
偏移地址(OFFSET):
变量所在段内的偏移地址。
类型(TYPE):
每个变量所占的字节数。
长度(LENGTH):
第一个DUP前的系数,表示变量重复次数;否则为1。
大小(SIZE):
变量所占用的字节数,SIZE=TYPE×LENGTH
表4.2部分变量的属性P58
变量名
段地址
偏移地址
类型
长度
大小
DATA1
0100H
0000H
1
1
1
DATA2
0100H
0001H
2
1
2
DATA3
0100H
0005H
1
1
1
DATA4
0100H
0007H
4
1
4
DATA5
0100H
000BH
1
1
1
DATA6
0100H
000FH
2
1
2
DATA10
0100H
001FH
2
3
6
4.1.4属性操作符及表达式
1.获取属性的操作符P58
操作符
表达式
表达式意义
SEG
SEG变量名或标号
取出变量或标号所在段的段地址
OFFSET
OFFSET变量名或标号
取出变量或标号在段内的偏移地址
TYPE
TYPE变量名或标号
取出变量或标号的类型
LENGTH
LENGTH变量名
取出变量的长度
SIZE
SIZE变量名
取出变量的大小
例
:
P59
SEGDATA1;结果为0100H
OFFSETDATA1;结果为0000H
LENGTHDATA6;结果为1
TYPEDATA6;结果为2
SIZEDATA9;结果为5
例
:
P59
MOVAX,SIZEDATA9;将DATA9的大小送AXMOVAX,5
MOVAX,SEGDATA1;将DATA1的段地址送AXMOVAX,0100H
MOVBL,TYPEDATA6;将DATA9的类型送BLMOVBL,2
例
:
P59
DAT1DB02H
DAT2DW0F00H
DAT3DW5DUP(?
)
DAT4DBLENGTHDAT3;在DAT4处存放的是DAT3的长度(5)
DAT5DWDAT3;在DAT5处存放的是DAT3的偏移地址
DAT6DDDAT3;在DAT6处存放的是DAT3的段地址和偏移地址
2.PTR操作:
重新定义变量或标号的类型
格式:
类型PTR表达式
式中的类型:
BYTE,WORD,DWORD(变量),DEAR,FAR(标号)
例:
MOVDAT3,AL;由于两者的类型不一致为非法指令
MOVBYTEPTRDAT3,AL;PTR操作使两者的类型不一致
;DAT3的类型本身没有被改变
4.28086/8088指令系统P59
指令分类:
数据传送指令
⑵算术运算指令
⑶逻辑运算指令
⑷移位指令
⑸标志处理指令和CPU控制指令
⑹转移和循环控制指令
⑺调用和返回指令
⑻字符串操作指令
⑼输入输出指令
表4.4指令中将会出现的缩写和符号P60
缩写和符号
意义
缩写和符号
意义
OPR
操作数
EA
有效地址
SRC
源操作数
SEG
段
DST
目的操作数
DATA
立即数
REG
寄存器
←→
互相交换
RSRC
源寄存器
←
替代
RDST
目的寄存器
(X)
X的内容
CNT
计数
∧
逻辑与
DISP
位移量
∨
逻辑或
D8
8位位移量
逻辑异或
D16
16位位移量
X的反码
ADDR
地址
4.2.1数据传送指令
表4.5数据传送类指令的格式与功能P61
助记符格式
功能说明
MOVDST,SRC
(DST)←→(SRC)
LEAREG,SRC
(REG)←(SRC)的有效地址
LDSREG,SRC
(REG)←(SRC),(DS)←(SRC+2)
LESREG,SRC
(REG)←(SRC),(ES)←(SRC+2)
LAHF
(AH)←(FLAG)低8位
SAHF
(FLAG)低8位←(AH)
XCHGOPR1,OPR2
(OPR1)←→(OPR2)
XLAT
(AL)←((BX)+AL))
PUSHSRC
(SP)←(SP)-2,((SP)+1:
(SP))←(SRC)
POPDST
(DST)←((SP)+1:
(SP)),(SP)←(SP)+2
PUSHF
(SP)←(SP)-2,((SP)+1:
(SP))←(FLAG)
POPF
(FLAG)←((SP)+1:
(SP)),(SP)←(SP)+2
1.通用传送指令:
MOVDST,SRC
SRC源操作数:
通用寄存器,段寄存器,内存单元和立即数
DST目的操作数:
通用寄存器,段寄存器,内存单元,但不能为立即数和CSIP
注意:
当目的操作数为段寄存器时,源操作数不能为立即数;当源操作数不为立即数时,两个操作数中必须有一个是寄存器。
例①:
MOVAX,BX;(AX)←(BX),传送一个字
MOVAL,DL;(AL)←(DL),传送一个字节
MOCAX,02;(AX)←0002H,传送一个字
MOVSI,[BX];(SI)←((BX)),传送一个字
MOVAL,4[DI];(AL)←((DI)+4),传送一个字节
MOVAX,[BX+2];(AX)←((BX)+2),传送一个字
MOV[BX][DI],DX;((BX)+(DI))←(DX)
MOVAL,4[DI]指令的操作示意图如图4.2(a)P62
例②:
假设变量定义如下:
DATA1DW20H,30H
DATA2DB50H,60H,70H
DATA3DW10HDUP(?
)
传送指令可以有:
MOVAX,DATA1
MOVDATA3,BX
MOVAL,DATA2[DI]
MOVDATA3[SI],DX
MOVCX,LENGTHDATA3
MOVBX,SIZEDATA3
MOVSI,OFFSETDATA2
注意:
两个操作数的类型必须确定,否则不合法(错误)
MOVDATA3[SI],02;对
MOV2[SI],AL;对
MOV4[DI],02;错误,类型不确定
MOVBYTEPTR4[DI],02;对
例③:
DATA1DW05H,15H,20H
DATA2DB0FH,10H,0AH
DATA3DB5DUP(?
)
MOVAX,BL;错误
MOVAL,DATA1;错误
MOVBX,DATA3[SI];错误
例④:
段前缀的使用
MOVAX,ES:
[SI]
●数据传送的正常通道(图4.3P64)
注意:
图中共有n个传送箭头,能举例说明之!
⑦JMPDWORD[DI]
CALLDWORD[SI]
2.取有效地址指令:
LEAREG,SRC
功能:
是将源操作数SRC的有效地址EA送入寄存器REG。
注意:
REG不能为段寄存器,SRC不能为立即数和寄存器。
例①:
设:
(DI)=0500H,(DS)=0200H,(0200H:
0510H)=00FFH
MOVAX,10H[DI];执行后(AX)=00FFH
LEAAX,10H[DI];执行后(AX)=0510H
例②:
LEADI,DATA1
LEABX,AGAIN
3.取地址指令:
LDSREG,SRC
LESREG,SRC
功能:
是将源操作数SRC所对应的内存单元中的32位数据送DS/ES和REG。
注意:
REG不能为段寄存器,SRC不能为立即数和寄存器。
例①:
TABLEDB10H,20H,30H,40H,50H
POINT1DD02001000H
POINT2DDTABLE
|
LDSDI,POINT1;(DS)=0200H,(DI)=1000H
LESSI,POINT2;(ES)=SEGTABLE,(SI)=OFFSETTABLE
4.标志传送指令
LAHF;(AH)←(FLAG)低8位
SAHF;(FLAG)低8位←(AH)
5.数据交换指令XCHGOPR1,OPR2
注意:
两个操作数中必须有一个是寄存器,不允许同时为段寄存器
例①:
XCHGAX,BX
XCHGAX,[2000H]
6.字节转换指令(查表指令)
XLAT;(AL)←((BX)+AL))
例①:
TABLEDB05,08,06
DB04,09,01
DB02,03,00,07
‖
MOVAX,SEGTABLE
MOVDS,AX
MOVBX,OFFSETTABLE
MOVAL,05
XLAT
思考题:
求
=X.X二位BCD数或X.XXX三位BCD数如何解决?
7.堆栈操作指令
堆栈:
以后进先出(LIFO)的规则存取信息的一种存储机构(一部分存储器),
均为字操作,向下生成。
压栈指令:
PUSHSRC;SP)←(SP)-2,((SP)+1:
(SP))←(SRC)
PUSHF
出栈指令:
POPDST;(DST)←((SP)+1:
(SP)),(SP)←(SP)+2
POPF
例①:
向下生成
MOVSP,0100H
PUSHAX
PUSHBX
POPAX
POPBA
4.2.2算术运算指令
1.加法与减法指令
表4.8加减法指令的助记符与功能P69
助记符格式
功能说明
ADDDST,SRC
(DST)←(DST)+(SRC)
ADCDST,SRC
(DST)←(DST)+(SRC)+C
SUBDST,SRC
(DST)←(DST)—(SRC)+C
SBBDST,SRC
(DST)←(DST)—(SRC)—C
NEGDST
(DST)←0—(DST)“求补或求负”
注意:
对二进制代码运算,注意对标志位的影响。
例①:
ADDAL,BLADCAX,0
ADDCX,08HSBBXC,DATA1
ADDAX,[SI]NEGAX
ADDAX,[BX][DI]
SUBAL,CL
SUB[BX],DX
1)ADDAX,[SI]指令执行过程P70
2)一个多位数加法程序
设:
两数A、B已由数据定义语句置如内存,
A、B为四字节长度的数据
计算:
C=A+B,不考虑进位,和也为
四字节长度的数据。
程序如下:
MOVAX,SEGADR1
MOVDS,AX
LEADI,ADR1
MOVAX,4[DI]
ADDAX,[DI]
MOVADR2,AX
MOVAX,6[DI]
ADCAX,2[DI]
MOVAFR2+2,AX
实际:
00127654H+00049821H=00170E75H
考虑:
数据带不带符号?
2.比较指令P73
CMPDST,SRC;(DST)-(SRC)影响标志(不生成结果)
例①:
CMPAL,BL
CMPAX,06H
3.增量和减量指令(表4.9P74)
INCDST;(DST)←(DST)+1
DECDST;(DST)←(DST)-1
注意:
不影响CF标志(其他要影响的!
);
全1增量为全0;全0减量为全1。
例①:
INCWORDPTR4[BX]
DECCX
4.乘法和除法指令P74
表4.10乘法除法指令助记符与功能P74
助记符格式
功能说明
IMULSRC
(带符号数乘法)
字节运算:
(AX)←(AL)×(SRC)
字运算:
(DX:
AX)←(AX)×(SRC)
MULSRC
(不带符号数乘法)
同IMUL,不带符号
IDIVSRC
(带符号数除法)
字节运算:
(AL)←(AX)/(SRC)的商
(AH)←(AX)/(SRC)的余数
字运算:
(AX)←(DX:
AX)/(SRC)的商
(DX)←(DX:
AX)/(SRC)的余数
DIVSRC
(不带符号数除法)
同IDIV,不带符号
注意:
①无符号数相乘后结果的高位字节(或字)为全0,或符号数相乘结果的高位字节(或字)仅为低位字节(或字)的符号扩展,则CF=OF=0,否则CF=OF=1。
其他标志位不影响。
②除法运算若发生除数为0或商溢出,则其结果无意义,并引起中断。
例①:
DAT1为字变量P75
MULDAT1;(DX:
AX)←(AX)×(DAT1)
IMULCL;(AX)←(AL)×(CL)带符号数
MULBYTEPTR[BX];(AX)←(AL)×((BX))
例②:
P75
DTA1DW8004H;此处代码可有不同的解释
︱
1)MOVAX,05H;(0005H)×8004H=00028014H
MULDAT1;结果在DX:
AX中
︱;(DX)=0002H,(AX)=8014H
2)MOVAX,05H;(05H)×04H=0014H
MULBYTEPTRDAT1;结果在AX中(AX)=0014H
︱
3)MOVAX,05H;(05H)×04H=0014H
IMULBYTEPTRDAT1;结果在AX中,也可看作两个无
︱;(两个很小的正数)
4)MOVAX,05H;(0005H)×8004H=FFFD8014H
IMULWORDPTRDAT1;正数负数负数
注意:
4)解为:
8004H=1000000000000100B为负数(补码)
0111111111111011B求反
0111111111111100B加1(求得绝对值)
7FFCH用十六进制表示
×0005H与正5相乘
00027FECH商的绝对值
00000000000000100111111111101100B商的绝对值(二进制数)11111111111111011000000000010011B商的绝对值求反
11111111111111011000000000010100B求反加1得补码
FFFD8014H十六进制表示
结果:
(DX)=FFFDH;(AX)=8014H
5.符号扩展指令P76
表4.11符号扩展指令助记符与功能P76
助记符格式
功能说明
CBW
将AL中的符号扩展到AH中
将一个字节长度的带符号数扩展为一个字长度,值不变
CWD
将AX中的符号扩展到DX中
将一个字长度的带符号数扩展为双字长度,值不变
符号扩展意义:
一个带符号数长度发生了变化,但值没变。
寻址方式是隐含的,一定是AL或AX。
思考:
将一个带符号数变短:
高字节是低位的符号扩展,则高字节可舍去!
6.BCD数调整指令
表4.12BCD数调整指令助记符与功能P76
助记符格式
功能说明
AAA
加法分离BCD调整,影响AF、CF,其余无定义
AAS
减法分离BCD调整,影响AF、CF,其余无定义
DAA
加法组合BCD调整,OF无定义,影响其余标志位
DAS
减法组合BCD调整,OF无定义,影响其余标志位
AAM
乘法分离BCD调整,影响S,Z,P;O,C,AF无定义
AAD
乘法分离BCD调整,影响S,Z,P;O,C,AF无定义
例4.2.1求两个4位组合BCD数的和P77
设变量定义如下:
BCD1DB45H,19H;BCD1=1945
BCD2DB71H,12H;BCD2=1271
BCD3DB2DUP(?
);存和=3216
表4.13程序及运算结果
程序
结果
AL
AF
CF
BCD3
BCD3+1
MOVAL,BCD1
45H
·
·
?
?
ADDAL,BCD2
B6H
0
0
?
?
DAA
16H
0
1
?
?
MOVBCD3,AL
16H
0
1
16H
?
MOVAL,BCD1+1
19H
0
1
16H
?
ADCAL,BCD2+1
2CH
0
0
16H
?
DAA
32H
1
0
16H
?
MOVBCD3+1,AL
32H
1
0
16H
32H
例4.2.2设有两数X、Y,且X=85,Y=6,用分离BCD数完成X/Y与X×Y
BCD1DB05H,08H
BCD2DB06H
BCD3DB3DUP(?
)
X/Y程序如下:
P77
MOVAH,0
MOVAL,BCD1+1;(AL)=08
MOVBL,BCD2;(BL)=06
DIVBL;(AX)/(BL)→(AL)=01,(AH)=02余数
MOVBCD3+1,AL;商高位送BCD3+1
MOVAL,BCD1;(AL)=05
AAD;(AL)=(AH)×10+(AL)=25,0→(AH)
DIVBL;(AX)/(BL)→(AL)=04,(AH)=01
MOVBCD3,AL;商低位送BCD3
MOVBCD3+2,AH;商低位送BCD3+2
X×Y程序如下:
P78
MOVAL,BCD1;(AL)=05
MULBCD2;(AL)×(BCD2)→(AX),AX=001EH
AAM;(AX)=0300H
MOVWORDPTRBCD3,AX;(BCD3)=00,(BCD3+1)=03
MOVAL,BCD1+1;(AL)=08
MULBCD2;(AL)×(BCD2)→(AX),AX=0030H
AAM;(AX)=0408H
ADDAL,BCD3+1;(AL)=0BH
AAA;(AL)=01H,(AH)=05
MOVWORDPTRBCD3+1,AX;(BCD3+2)=05,(BCD3+1)=01,
;(BCD3)=00
4.2.3逻辑运算类指令P78
表4.14逻辑运算指令助记符与功能P78
助记符格式
功能说明
ANDDST,SRC
(DST)=(DST)∧(SRC)
ANDDST,DATA
(DST)=(DST)∧DATA
ORDST,SRC
(DST)=(DST)∨(SRC)
ORDST,DATA
(DST)=(DST)∨DATA
XORDST,SRC
(DST)=(DST)
(SRC)
XORDST,DATA
(DST)=