汇编语言程序设计的基本方法P52.docx

上传人:b****5 文档编号:6661462 上传时间:2023-01-08 格式:DOCX 页数:80 大小:486.23KB
下载 相关 举报
汇编语言程序设计的基本方法P52.docx_第1页
第1页 / 共80页
汇编语言程序设计的基本方法P52.docx_第2页
第2页 / 共80页
汇编语言程序设计的基本方法P52.docx_第3页
第3页 / 共80页
汇编语言程序设计的基本方法P52.docx_第4页
第4页 / 共80页
汇编语言程序设计的基本方法P52.docx_第5页
第5页 / 共80页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计的基本方法P52.docx

《汇编语言程序设计的基本方法P52.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计的基本方法P52.docx(80页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计的基本方法P52.docx

汇编语言程序设计的基本方法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)=

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

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1