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