汇编语言程序例题.docx
《汇编语言程序例题.docx》由会员分享,可在线阅读,更多相关《汇编语言程序例题.docx(20页珍藏版)》请在冰点文库上搜索。
汇编语言程序例题
【例5.1】试编写一程序计算以下表达式的值。
w二(v-(x*y+z-540))/x
式中x、y、z、v均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图5・1所示。
DATASEGMENT
XDW200
YDW100
ZDW3000
VDW10000
WDW2DUP(?
)
DATAENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX:
DATA-AX
MOVAX,X
IMULY:
(X)*(Y)-DX:
AX
MOVCX,AX
MOVBX,DX
:
(DX:
AX)-(BX:
CX)
MOVAX,Z
CWD:
(Z)符号扩展
ADDCX,AX
ADCBX,DX
■
■
(BX:
CX)+(DX:
AX)-(BX:
CX)
SUBCX,540
SBBBX,0
:
(BX:
CX)-540-(BX:
CX)
MOVAX,V
CWD:
(V)符号扩展
SUBAX,CX
SBBDX,BX
:
(DX:
AX)-(BX:
CX)-(DX:
AX)
IDIVX
:
(DX:
AX)/X
MOVW,AX
:
商7
MOVW+2,DX:
余数DX-W+2
MOVAH,4CH
INT21H
CODEENDS
:
退出DOS状态
ENDSTART
【例5.2]已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB
表中,要査的学生的学号放在变量\0中,查表结果放在变量ENGLISH中。
编写程序如下:
STACKSEGMENT
STACK
DB200DUP(0)
STACKENDS
DATASEGMENT
TABDB80,85,86,71,79,96
DB83,56,32,66,78,84
NODB10
ENGLISTDB?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
BEGIN:
MOVAX,DATA
MOVDS,AX
LEABX>TAB
MOVAL,NO
DELAL
XLATTAB
MOVENGLISH,AL
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
【例5.3]已知在内存中有一个字节单元NUM,存有带符号数据,要求讣算出它的绝对值后,放入RESULT单元中。
题目分析:
根据数学中绝对值的槪念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数:
要计算一个数的相反数,需要完成减法运算,即用0减去这个数。
8086/8088指令系统中有专门的求相反数的指令NEG“
DATA
SEGMENT
X
DB
-25
RESULT
DB
9
■
DATA
ENDS
CODE
SEGMENT
ASSUME
DS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX:
初始化
MOVAL,X:
X取到AL中
TESTAL,80H:
测试AL正负
JZNEXT:
NEGAL
为正,转NEXT
:
否则AL求补
NEXT:
MOV
RESULT,AL
:
送结果
MOV
AH,4CH
INT
21H
:
返回DOS
CODEENDS
ENDSTART
【例5.4】编写计算下面函数值的程序:
1X>0
Y=0X=0
-1X<0
设输入数据为X、输岀数据Y,且皆为字节变量。
程序流程图如下图所示。
例6・4程序流程图
DATASEGMENT
XDB-25
YDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX:
初始化
MOVAUX:
X取到AL中
CMP
AL,0
:
Al中内容和0比较
JGE
BIG
:
大于等于0,转BIG
MOV
BL,-1
:
否则为负数,一1送BL
JMP
EXIT
:
转到结束位置
BIG:
JEEE
:
Al中内容是否为0,为0转EE
MOV
BL,1
:
否则为大于0,1送BL
JMP
EXIT
:
转到结束位置
EE:
MOVBL,0
;0送BL
EXIT:
MOV
Y,BL:
BL中内容送Y单元
MOV
AH,4CH
INT
21H
:
程序结束
CODE
ENDS
END
START
:
汇编结朿
【例5.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中•
设三个带符号数分别在三个字变量X、Y、Z中存储。
程序流程图如下图所示
ZfAX屮丫卩
AX^MAX*1
STACK
SEGMENTSTACK
DB
200DUP(0)
STACK
ENDS
DATA
SEGMENT
X
DW
OOABH
Y
DW
_5
Z
DW
200
MAX
DW?
DATA
ENDS
CODE
SEGMENT
ASSUME
DS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,
DATA
MOV
DS,AX
MOV
AX,X
CMP
AX,Y:
X>Y?
JG
LI
MOV
AX,Y:
Y>Z?
CMP
AX,Z
JG
EXIT
L2:
MOVAX,
Z
JMP
EXIT
LI:
CMP
AX,Z
:
X>Z?
JLE
L2
CODEENDS
ENDSTART
【例5.6】设某程序有8路分支,试根据给泄的N值(「8),将程序的执行转移到其中的一路分支。
程序流程如图下所示。
DATA
TABDW
N
DATA
STACK
SEGMENT
Pl,P2>P3,P4,P5,P6,P7.P8
DB5
ENDS
SEGMENT
DB200DUP(0)
STACK
CODE
ENDS
SEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOV
MOVAX.DATA
DS,AX
1
MOV
DEL
ADD
MOV
MOV
JMP
Pl:
1
AL,N
AL
AL,AL
BL,AL
BH,0
TAB[BX]
JMPEXIT
P2:
……
I
II
JMPEXIT
P2:
……
I
II
JMPEXIT
P3:
……
JMPEXIT
P8:
……
1
EXIT:
1
MOVAH,4CH
INT
21H
CODE
ENDS
END
START
【例5・7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统讣其中正元素的个数。
显然,每个元素为一个8位有符号二进制数,统计苴中正元素的个数可用循环程序实现。
其程序流程图如下图所示。
例5・8】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止。
统计被累加的自然数的个数送CN单元,累加和送SUM。
流程图如下图所示。
例6.8稈序流程图
DATASEGMENT
SUMDW?
CNDW?
DATA
ENDS
CODE
SEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
;初始化
MOVAX,0
;0送AX
MOVBX,0;0送BX
LP:
INCBX:
BX加1
ADDAX,BX:
求累加和
CMP
AX,1000
:
比较
JBE
LP
:
W1000转
MOV
SUM,AX
MOV
CN,
BX:
送结果
MOV
AH,4CH
INT
21H
:
返回DOS
CODEENDS
END
START
:
汇编结束
【例5・9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。
我们釆用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对.则不交换两数位苣;如次序不对则使这两个数交换位宜。
可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次:
第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。
如下而的4个数即是采用冒泡排序比较的例子。
数
10
8
16
90
32
第一遍
10
16
90
32
8
第二遍
16
90
32
10
8
第三遍
90
32
16
10
8
程序流程图如图5・9所示。
DATASEGMENT
BUFDW3,-4,6,7,9,2,0.-8,-9,-10,20N=($-BUF)/2
DATAENDS
STACKSEGNMENTSTACK
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVCX,N
DECCX
L00P1:
MOVDX,CX
MOVBX,0
L00P2:
MOVAX,BUF[BX]
CMPAX,BUFEBX+2]
JGEL
XCHGAX,BUFEBX+2]
MOVBUF[BXhAX
L:
ADDBX,2
DECCX
JNEL00P2
MOVCX,DX
LOOPL00P1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
程序运行后,BIT区中的内容如下:
20,9»7,6»3»2,0>-4,-8,-9,-10
若要对N个无符号数按由大到小的顺序排列,只需将指令“JGEL”改为“JAEL”即可。
【例5.10]将一个给泄的二进制数按位转换成相应的ASCII码字符串,送到指左的存储单元并显示。
如二进制数10010011转换成字符串为'10010011'。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。
入口参数:
DX存放待转换的二进制数
CX存放待转换数的位数(8位或16位)
DI存放ASCII码首地址
出口参数:
转换后的字符串存放在以DI作指针的字廿存贮区中
程序涓单:
DATASEGMENT
NUM8
DB
93H
NUM16
DW
OABCDH
ASCBUF
DB
20DUP(0)
DATAENDS
CODESEGMENT
ASSUME
DS:
DATA,CS:
CODE,SS:
STACK
START:
MOVAX,
DATA
MOV
DS,
AX
MOV
DX,
0
MOV
DL,
NUM8
;转换二进制数送DX
MOV
ex,
8
:
置位数8
LEA
DI,
ASCBUF
:
字符串首址一DI
CALL
BTASC
:
调用子程序BTASC
MOV
[DI],BYTE
PTRODH
MOV[DI+1],BYTEPTROAH
MOV[DI+2],BYTEPTR$
LEA
DX,
ASCBUF
MOV
AH,
9
INT
21H
MOV
DX,
NUM16
MOV
ex,
16:
置位数16
LEA
DI,
ASCBUF
CALL
BTASC
MOV
[DL],BYTEPTRODH
MOV
[DL+1],
BYTE
PTROAH
MOV
[DL+2],
BYTE
PTR“:
LEA
DX,
ASCBUF
MOV
AH,
9
INT
21H
BTASC
PROC
PUSH
AX
■
■
保存AX
MOV
AL,
0
CMP
ex,
8
:
比较8位数
JNE
LI
:
直接转换16位数
MOV
DH,
DL
:
8位数转换送DH
LI:
ROL
DX,,
1:
DX最髙位移入CF
RCL
AL,
1
:
CF移入AL最低位
ADD
AL,
3OH
显示转换后的字符串
MOV[DI],AL
INCDI
LOOPLI
POPAX
RET
BTASCENDP
CODEENDS
ENDSTART