汇编语言程序例题.docx
- 文档编号:29865059
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:18
- 大小:172.72KB
汇编语言程序例题.docx
《汇编语言程序例题.docx》由会员分享,可在线阅读,更多相关《汇编语言程序例题.docx(18页珍藏版)》请在冰豆网上搜索。
汇编语言程序例题
【例】试编写一程序计算以下表达式的值。
w=(v-(x*y+z-540))/x
式中x、y、z、v均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。
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;商→W
MOVW+2,DX;余数DX→W+2
MOVAH,4CH
INT21H
CODEENDS;退出DOS状态
ENDSTART
【例】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。
编写程序如下:
STACKSEGMENTSTACK
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
【例】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。
题目分析:
根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。
8086/8088指令系统中有专门的求相反数的指令NEG。
DATASEGMENT
XDB-25
RESULTDB
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX;初始化
MOVAL,X;X取到AL中
TESTAL,80H;测试AL正负
JZNEXT;为正,转NEXT
NEGAL;否则AL求补
NEXT:
MOVRESULT,AL;送结果
MOVAH,4CH
INT21H;返回DOS
CODEENDS
ENDSTART
【例】编写计算下面函数值的程序:
1X>0
Y=0X=0
-1X<0
设输入数据为X、输出数据Y,且皆为字节变量。
程序流程图如下图所示。
DATASEGMENT
XDB-25
YDB
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;初始化
MOVAL,X;X取到AL中
CMPAL,0;Al中内容和0比较
JGEBIG;大于等于0,转BIG
MOVBL,-1;否则为负数,-1送BL
JMPEXIT;转到结束位置
BIG:
JEEE;Al中内容是否为0,为0转EE
MOVBL,1;否则为大于0,1送BL
JMPEXIT;转到结束位置
EE:
MOVBL,0;0送BL
EXIT:
MOVY,BL;BL中内容送Y单元
MOVAH,4CH
INT21H;程序结束
CODEENDS
ENDSTART;汇编结束
【例】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。
设三个带符号数分别在三个字变量X、Y、Z中存储。
程序流程图如下图所示
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
DATASEGMENT
XDW00ABH
YDW–5
ZDW200
MAXDW
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVAX,X
CMPAX,Y;X>Y
JGL1
MOVAX,Y;Y>Z
CMPAX,Z
JGEXIT
L2:
MOVAX,Z
JMPEXIT
L1:
CMPAX,Z;X>Z
JLEL2
EXIT:
MOVMAX,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
【例】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。
程序流程如图下所示。
DATASEGMENT
TABDWP1,P2,P3,P4,P5,P6,P7,P8
NDB5
DATAENDS
STACKSEGMENT
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
┆
MOVAL,N
DELAL
ADDAL,AL
MOVBL,AL
MOVBH,0
JMPTAB[BX]
P1:
……
┆
JMPEXIT
P2:
……
┆
JMPEXIT
P2:
……
┆
JMPEXIT
P3:
……
┆
JMPEXIT
┆
P8:
……
┆
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
【例】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。
显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。
其程序流程图如下图所示。
例】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止。
统计被累加的自然数的个数送CN单元,累加和送SUM。
流程图如下图所示。
DATASEGMENT
SUMDW
CNDW
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;初始化
MOVAX,0;0送AX
MOVBX,0;0送BX
LP:
INCBX;BX加1
ADDAX,BX;求累加和
CMPAX,1000;比较
JBELP;≤1000转
MOVSUM,AX
MOVCN,BX;送结果
MOVAH,4CH
INT21H;返回DOS
CODEENDS
ENDSTART;汇编结束
【例】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。
我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。
可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。
如下面的4个数即是采用冒泡排序比较的例子。
数108169032
第一遍101690328
第二遍169032108
第三遍903216108
程序流程图如图所示。
DATASEGMENT
BUFDW3,-4,6,7,9,2,0,-8,-9,-10,20
N=($-BUF)/2
DATAENDS
STACKSEGNMENTSTACK
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVCX,N
DECCX
LOOP1:
MOVDX,CX
MOVBX,0
LOOP2:
MOVAX,BUF[BX]
CMPAX,BUF[BX+2]
JGEL
XCHGAX,BUF[BX+2]
MOVBUF[BX],AX
L:
ADDBX,2
DECCX
JNELOOP2
MOVCX,DX
LOOPLOOP1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
程序运行后,BUF区中的内容如下:
20,9,7,6,3,2,0,-4,-8,-9,-10
若要对N个无符号数按由大到小的顺序排列,只需将指令“JGEL”改为“JAEL”即可。
【例】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。
如二进制数转换成字符串为‘’。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。
入口参数:
DX存放待转换的二进制数
CX存放待转换数的位数(8位或16位)
DI存放ASCII码首地址
出口参数:
转换后的字符串存放在以DI作指针的字节存贮区中
程序清单:
DATASEGMENT
NUM8DB93H
NUM16DW0ABCDH
ASCBUFDB20DUP(0)
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,0
MOVDL,NUM8;转换二进制数送DX
MOVCX,8;置位数8
LEADI,ASCBUF;字符串首址→DI
CALLBTASC;调用子程序BTASC
MOV[DI],BYTEPTR0DH
MOV[DI+1],BYTEPTR0AH
MOV[DI+2],BYTEPTR‘$’
LEADX,ASCBUF
MOVAH,9
INT21H
MOVDX,NUM16
MOVCX,16;置位数16
LEADI,ASCBUF
CALLBTASC
MOV[DL],BYTEPTR0DH
MOV[DL+1],BYTEPTR0AH
MOV[DL+2],BYTEPTR‘$’;显示转换后的字符串
LEADX,ASCBUF
MOVAH,9
INT21H
BTASCPROC
PUSHAX;保存AX
MOVAL,0
CMPCX,8;比较8位数
JNEL1;直接转换16位数
MOVDH,DL;8位数转换送DH
L1:
ROLDX,,1;DX最高位移入CF
RCLAL,1;CF移入AL最低位
ADDAL,30H
MOV[DI],AL
INCDI
LOOPL1
POPAX
RET
BTASCENDP
CODEENDS
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序 例题