汇编语言程序例题.docx
《汇编语言程序例题.docx》由会员分享,可在线阅读,更多相关《汇编语言程序例题.docx(15页珍藏版)》请在冰豆网上搜索。
汇编语言程序例题
【例5.1】试编写一程序计算以下表达式的值。
ﻩw=(v-(x*y+z-540))/x
式中x、y、z、v均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图5。
1所示。
DATAﻩ SEGMENT
XﻩDW200
ﻩYﻩDWﻩ100
ﻩZﻩDWﻩ3000
ﻩVﻩDW10000
ﻩWﻩDWﻩ2DUP(?
)
DATAﻩ ENDS
STACK SEGMENT STACK
ﻩ DB 200 DUP(0)
STACKENDS
CODESEGMENT
ﻩASSUMEDS:
DATA,CS:
CODE,SS:
STACK
START:
MOVAX,DATA
ﻩMOVDS,AXﻩ;DATA→AX
ﻩMOVAX,X
IMUL Yﻩ;(X)*(Y)→DX:
AX
ﻩMOVCX,AX
ﻩMOVﻩBX,DX;(DX:
AX)→(BX:
CX)
MOVAX,Z
ﻩCWDﻩﻩﻩ;(Z)符号扩展
ﻩADDCX,AX
ADCﻩBX,DXﻩ
ﻩﻩﻩ;(BX:
CX)+(DX:
AX)→(BX:
CX)
SUBCX,540
SBBﻩBX,0ﻩ;(BX:
CX)—540→(BX:
CX)
ﻩMOVﻩAX,V
CWDﻩﻩ;(V)符号扩展
ﻩSUBAX,CX
ﻩSBBDX,BX
ﻩ;(DX:
AX)—(BX:
CX)→(DX:
AX)
IDIV Xﻩﻩ;(DX:
AX)/X
MOVW,AXﻩ;商→W
MOVW+2,DXﻩ;余数DX→W+2
MOVAH,4CH
ﻩINT21H
CODEENDSﻩﻩ;退出DOS状态
END START
【例5。
2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。
编写程序如下:
STACKSEGMENTSTACK
ﻩDBﻩ200DUP(0)
STACKENDS
DATASEGMENT
ﻩTABDB 80,85,86,71,79,96
DB83,56,32,66,78,84
ﻩNODB10
ﻩENGLISTﻩDB ?
DATA ENDS
CODESEGMENT
ASSUME DS:
DATA,SS:
STACK,CS:
CODE
BEGIN:
MOVﻩAX,DATA
ﻩﻩMOVDS,AX
LEAﻩBX,TAB
ﻩMOVﻩAL,NO
DELﻩAL
ﻩXLATﻩTAB
ﻩMOVENGLISH,AL
ﻩMOVAH,4CH
ﻩﻩINT21H
CODEﻩENDS
ﻩENDBEGIN
【例5。
3】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。
题目分析:
根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数.8086/8088指令系统中有专门的求相反数的指令NEG。
DATASEGMENT
XDB -25
ﻩRESULTDB?
DATAENDS
CODESEGMENT
ﻩASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVﻩDS,AX ﻩ;初始化
MOVAL,X;X取到AL中
TESTAL,80H;测试AL正负
ﻩJZNEXT ﻩ;为正,转NEXT
NEGALﻩﻩ;否则AL求补
NEXT:
ﻩMOVﻩRESULT,AL;送结果
ﻩMOV ﻩAH,4CH
ﻩINTﻩ21H ﻩﻩ;返回DOS
CODEENDS
ENDﻩSTARTﻩ
【例5。
4】编写计算下面函数值的程序:
1X〉0
Y=ﻩ0ﻩX=0
ﻩ—1ﻩX〈0
设输入数据为X、输出数据Y,且皆为字节变量。
程序流程图如下图所示。
ﻩDATASEGMENT
XDB—25
YDB ?
DATAENDS
CODESEGMENT
ASSUME CS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOV DS,AX ;初始化
MOV AL,X ;X取到AL中
CMPﻩAL,0;Al中内容和0比较
JGEBIGﻩﻩ;大于等于0,转BIG
ﻩMOVBL,-1ﻩ;否则为负数,-1送BL
JMPﻩEXIT;转到结束位置
BIG:
JEﻩEEﻩ;Al中内容是否为0,为0转EE
ﻩMOVBL,1;否则为大于0,1送BL
ﻩJMPEXIT;转到结束位置
EE:
MOVBL,0;0送BL
EXIT:
MOV Y,BLﻩ;BL中内容送Y单元
MOV AH,4CH
INT 21Hﻩﻩ;程序结束
CODEENDS
ENDSTARTﻩ;汇编结束
【例5.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。
ﻩ设三个带符号数分别在三个字变量X、Y、Z中存储。
程序流程图如下图所示
STACKﻩSEGMENTSTACK
DB 200DUP(0)
STACKﻩENDS
DATAﻩSEGMENT
Xﻩ DW 00ABH
Yﻩ DW–5
Z DW 200
MAXﻩﻩDW ?
DATAﻩENDS
CODEﻩﻩSEGMENT
ASSUME DS:
DATA,SS:
STACK,CS:
CODE
START:
ﻩMOVﻩAX,DATA
ﻩ ﻩMOVﻩDS,AX
ﻩ ﻩMOVﻩAX,X
ﻩ CMPAX,Y;X>Y?
JGﻩL1
ﻩ ﻩMOVAX,Yﻩ;Y>Z?
CMPAX,Z
ﻩ JGﻩEXIT
L2:
MOVﻩAX,Z
ﻩ ﻩJMPEXIT
L1:
ﻩﻩCMPAX,Zﻩ;X>Z?
ﻩﻩJLEﻩﻩL2
EXIT:
MOVﻩMAX,AX
ﻩ MOVAH,4CH
INTﻩﻩ21H
CODEﻩENDS
ﻩﻩENDSTART
【例5。
6】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。
程序流程如图下所示。
DATASEGMENT
TABﻩDWP1,P2,P3,P4,P5,P6,P7,P8
NﻩDB 5
DATAﻩENDS
STACKSEGMENT
ﻩ DB200DUP(0)
STACKﻩENDS
CODEﻩSEGMENT
ﻩ ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
ﻩMOVﻩAX,DATA
ﻩMOVﻩDS,AX
ﻩﻩ┆
MOVAL,N
ﻩDELAL
ﻩADDAL,AL
ﻩMOVBL,AL
MOVBH,0
JMPTAB[BX]
P1:
……
ﻩﻩ┆
JMPEXIT
P2:
ﻩ……
ﻩ┆
JMPEXIT
P2:
ﻩ……
ﻩ┆
ﻩJMPEXIT
P3:
……
ﻩ┆
JMPﻩEXIT
ﻩ┆
P8:
ﻩ……
┆
EXIT:
ﻩMOVﻩAH,4CH
ﻩ INT21H
CODEﻩENDS
ENDSTART
【例5。
7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。
显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。
其程序流程图如下图所示。
例5.8】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止.统计被累加的自然数的个数送CN单元,累加和送SUM。
流程图如下图所示。
ﻩDATASEGMENT
ﻩSUMDW?
CNDW?
DATAﻩENDS
CODESEGMENT
ﻩASSUME CS:
CODE,DS:
DATA
START:
ﻩMOV AX,DATA
MOVDS,AX;初始化
MOV AX,0 ﻩ;0送AX
MOVBX,0 ﻩ;0送BX
LP:
ﻩINC BX ;BX加1
ADDAX,BX;求累加和
ﻩCMPAX,1000ﻩ;比较
ﻩ ﻩJBE LP ﻩ;≤1000转
ﻩ ﻩMOV SUM,AX
ﻩMOVCN,BX;送结果
MOV AH,4CH
ﻩINT 21H ;返回DOS
CODEﻩENDS
ﻩ ENDSTART ;汇编结束
【例5.9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序.
我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。
可以看出,第一遍需比较(N—1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N—2)次;第三遍只需比较(N—3)次,……整个排序过程最多需(N-1)遍。
如下面的4个数即是采用冒泡排序比较的例子。
数ﻩ10ﻩ8169032
第一遍101690328
第二遍ﻩ169032ﻩ108
第三遍ﻩ9032ﻩ16ﻩ108
程序流程图如图5.9所示。
DATAﻩSEGMENT
BUFDW 3,-4,6,7,9,2,0,-8,—9,—10,20
N=($-BUF)/2
DATAﻩENDS
STACKSEGNMENTSTACK
DB 200DUP(0)
STACKﻩENDS
CODESEGMENT
ASSUME CS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
ﻩMOVﻩCX,N
DECﻩCX
LOOP1:
MOVﻩDX,CX
MOVBX,0
LOOP2:
ﻩMOVAX,BUF[BX]
ﻩCMPAX,BUF[BX+2]
ﻩJGEﻩL
XCHGAX,BUF[BX+2]
ﻩMOVBUF[BX],AX
L:
ﻩADDBX,2
DECﻩCX
ﻩJNEﻩLOOP2
ﻩMOVﻩCX,DX
LOOPﻩLOOP1
ﻩMOVAH,4CH
ﻩINT21H
CODEﻩENDS
ﻩENDSTART
程序运行后,BUF区中的内容如下:
20,9,7,6,3,2,0,-4,-8,-9,—10
若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAEL”即可。
【例5.10】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。
如二进制数10010011转换成字符串为‘10010011’。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。
入口参数:
DX存放待转换的二进制数
CX存放待转换数的位