汇编程序.docx
- 文档编号:15765680
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:35
- 大小:28.28KB
汇编程序.docx
《汇编程序.docx》由会员分享,可在线阅读,更多相关《汇编程序.docx(35页珍藏版)》请在冰点文库上搜索。
汇编程序
双循环程序
1、设数据区以ADR为起始地址存放128个字单元数据,编写一个程序要求删除数据串中所有为0的项,后面的数向前移动,数组剩余部分用0填充
DATDW-1012,2555,0,102,222,0,-650…;128个字
CNEQU($-DAT)/2
MOVAX,DATA
MOVDS,AX
MOVDX,0
MOVBX,0
MOVCX,CN
LOP1:
CMPDAT[BX],0
JNZLOP2
INCDX;DX寄存器的功能(存放数组中0的个数)
MOVSI,BX
PUSHCX
PUSHBX
INCBX
LOP:
MOVAX,DAT[SI+1]
MOVDAT[SI],AX
INCSI
INCSI;为什么有2个INCSI(因为DAT是字属性)
LOOPLOP;从标号LOP到指令LOOPLOP是一个循环,功能(将数组中0元素后面的数向前移动一个位置)
POPBX
POPCX
LOP2:
INCBX
INCBX
LOOPLOP1;这是一个双循环结构,功能(将数组中0去掉,并且将剩余的元素都按次序移动到数组的前面)
MOVAX,CN
SUBAX,DX
MOVBX,AX
MOVCX,DX
LOP3:
MOVWORDPTRDAT[BX],0
INCBX
INCBX
LOOPLOP3
2、首地址为DAT的100个有符号字数据中的最小偶数,存放在DAT字单元中
无符号A/B带符号L/G
DATDW25,122,580,-2222…;100个字数据
CNEQU($-DAT)/2
DAT1DW
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETDAT
MOVCX,CN
NEXT:
MOVAX,[BX]
RORAX,1
JNCFIND0
INCBX
INCBX
LOOPNEXT
JMPEXIT
FIND0:
ROLAX,1
MOVDX,AX
LKING:
INCBX
INCBX
DECCX
CMPCX,0
JZFIND
MOVAX,[BX]
RORAX,1
JCLKING
ROLAX,1
CMPAX,DX
JNLLKING
XCHGAX,DX
JMPLKING
FIND:
MOVDAT1,DX
EXIT:
3、仓库管理中,总共存有有关库存品的编号、名称、数量、价格等情况的表格,根据用户提供的编号可以找到有关材料。
假设表格中共有6种库存品,表格的格式为:
Stockindb'05','Excavators'
db'08','Lifters'
db'09','Presses'
db'12','Valves'
db'23','Processors'
db'27','Pumps'
试编写一程序,根据用户提供的编号在终端上显示其名称。
datareasegment
mess1db'Stocknumber',13,10,'$'
crlfdb13,10,'$'
stockinlabelbyte
maxdb3
actdb
stokndb3dup()
stocktabdb'05','Excavators'
db'08','Lifters'
db'09','Presses'
db'12','Valves'
db'23','Processors'
db'27','Pumps'
descrndb20dup(20h),13,10,'$'
messdb'Notintable!
',13,10,'$'
datareaends
prognamsegment
assumecs:
prognam,ds:
datarea,es:
datarea
start:
movax,datarea
movds,ax
movax,datarea
moves,ax
a00:
leadx,mess1
movah,9
int21h
leadx,stockin
movah,0ah
int21h
leadx,crlf
movah,9
int21h
cmpact,0
jeexit
leadi,stocktab
pushdi
movcx,6
a20:
popdi
movdx,di
adddi,22
pushdi
movdi,dx
leasi,stokn
pushcx
movcx,2
repzcmpsb
popcx
jea30
loopa20
popdi
leadx,mess
movah,9
int21h
jmpexit
a30:
popdi
movsi,di
subsi,20
movcx,20
leadi,descrn
repmovsb
leadx,descrn
movah,9
int21h
jmpa00
exit:
movah,4ch
int21h
prognamends
endstart
4、用表格形式显示ascii字符SMASCII,按15行×16列的表格形式显示ascii码为10h~100h的所有字符,即以行为主的顺序及ascii递增的次序依次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空格符(ascii为20H)隔开。
datareasegment
string1db'start',0dh,0ah,'$'
string2db0ah,0dh,'$'
datareaends
prognamsegment
assumecs:
prognam,ds:
datarea
start:
movax,datarea
movds,ax
leadx,string1
movah,09h
int21h
movbx,0010h
LP:
leadx,string2
movah,09h
int21h
movcx,10h
LP1:
cmpbx,0100h
jaend1
movdl,bl
movah,02h
int21h
pushax
pushdx
movdl,''
movah,02h
int21h
popdx
popax
incbx
looplp1
jmplp
end1:
movah,4ch
int21h
prognamends
endstart
prognamsegment
assumecs:
prognam
start:
movch,0fh
moval,10h
next:
movcl,16
lp1:
movdl,al
movah,02h
pushax
int21h
popax
movdl,20h
pushax
int21h
popax
incal
deccl
cmpcl,0
jnelp1
movdl,0dh
pushax
int21h
popax
movdl,0ah
pushax
int21h
popax
decch
cmpch,0
jnznext
movah,4ch
int21h
prognamends
endstart
调整程序的显示功能:
‘0’~‘9’循环显示15行×16列字符矩阵。
prognamsegment
assumecs:
prognam
start:
movch,0fh;修改矩阵行数
moval,'0';旧指令moval,10h
next:
movcl,16;修改矩阵列数
lp1:
movdl,al
movah,02h
pushax
int21h
popax
movdl,20h
pushax
int21h
popax
cmpal,'9';旧指令incal
jnemm1
moval,'0'
jmpmm2
mm1:
incal;****************
mm2:
deccl
cmpcl,0
jnelp1
movdl,0dh
pushax
int21h
popax
movdl,0ah
pushax
int21h
popax
decch
cmpch,0
jnznext
movah,4ch
int21h
prognamends
endstart
完成下面编程:
(1)显示正三角形的字符矩阵,字符范围10h~100h,第一行为1个字符,第二行为2个字符,第三行为3个字符,……共有20行,字符间用逗号隔开,给出源程序以及运行结果。
(2)显示倒三角形的字符矩阵,字符范围’a’~’z’,第一行为13个字符,第二行为12个字符,第三行为11个字符,……最后一行为1个字符,共有13行,字符间用空格隔开,给出源程序以及运行结果。
(3)用矩阵显示大写字母、小写字母、数字,按ASCII码降序显示,其中矩阵为10列,给出源程序以及运行结果。
(4)显示12行×18列字符矩阵,循环显示’0’~’9’以及’A’~’Z’字符,字符间用’&’隔开,给出源程序以及运行结果。
数字的输入输出
1、十进制数输入子程序decibin
decibinprocnear
movbx,0
newchar:
movah,1
int21h
movdl,al
subal,30h
jlexit1
cmpal,9
jgexit1
cbw
xchgax,bx
movcx,10
mulcx
xchgax,bx
addbx,ax
jmpnewchar
exit1:
ret
decibinendp
2、十六进制数输入子程序hexibin
hexibinprocnear
movbx,0
newchar:
movah,1
int21h
subal,30h
jlexit
cmpal,10
jladd_to
subal,7
cmpal,0ah
jlexit
cmpal,10h
jgeexit
add_to:
movcl,4
shlbx,cl
movah,0
addbx,ax
jmpnewchar
exit:
ret
hexibinendp
3、十进制数显示子程序binidec
binidecprocnear
movcx,10000
calldec_div
movcx,1000
calldec_div
movcx,100
calldec_div
movcx,10
calldec_div
movcx,1
calldec_div
ret
binidecendp
dec_divprocnear
movax,bx
movdx,0
divcx
movbx,dx
movdl,al
adddl,30h
movah,2
int21h
ret
dec_divendp
4、十六进制数显示子程序binihex
binihexprocnear
movbx,4
lp:
movcl,4
roldi,cl
movdx,di
anddl,0fh
cmpdl,9
jbenext
adddl,07h
next:
adddl,30h
movah,2
int21h
decbx
jnzlp
movdl,'h'
movah,2
int21h
ret
binihexendp
5、二进制数显示子程序binshow
binshowprocnear
movah,2
movcl,16
Again:
shlbx,1
jncnext
movdl,'1'
pushax
int21h
popax
jmpmm
Next:
movdl,'0'
pushax
int21h
popax
mm:
deccl
jnzagain
ret
binshowendp
简单程序题
1、已知三个带符号数分别存放在AL、BL、CL中,编写程序段将三个数的中间数以十进制的值分别放在CL和CH中
2、编写程序,将一个包含有20个数据的数组分成两个数组,正数数组P(包括0)和负数数组N
DATASEGMENT
BUFDB12,-2,3,4,-80,-1,6,8,-11,-23
CNEQU$-BUF
PLUSDBCNDUP()
MINUSDBCNDUP()
DATAENDS
解:
LEASI,BUF
LEADI,PLUS
LEABX,MINUS
MOVCX,CN
AGAIN:
MOVAL,[SI]
CMPAL,0
JGEZHENG
MOV[BX],AL
INCBX
JMPNEXT
ZHENG:
MOV[DI],AL
INCDI
JMPNEXT
NEXT:
INCSI
LOOPAGAIN
3、编写程序,求级数12+22+32+……的前n项和刚大于1000的项数n
Ndb
XORBX,BX
MOVAL,1
AGAIN:
MULAL
ADDBX,AX
INCAX
CMPBX,1000
JBAGAIN
MOVN,AL
4、将DX:
AX中双字数据算术右移i位,i值在CL中
AGAIN:
SARDX,1
RCRAX,1
DECCL
CMPCL,0
JZAGAIN
5、如果AL的第i位(从右向左依次为:
0位、1位……)状态与BL的第j位(从右向左依次为:
0位、1位……)状态相同,则AH清0,否则AH置为全1,i和j的值分别放在CL和CH中
MOVDL,AL
SHRDL,CL
PUSHCX
MOVDH,BL
MOVCL,CH
SHRDH,CL
POPCX
ANDDX,101H
XORDL,DH
JZZERO
MOVAH,0FFH
JMPEXIT
ZERO:
MOVAH,0
EXIT:
6、将寄存器AH的第i位(从右向左依次为:
0位、1位……)的反码写入AL的第j位(从右向左依次为:
0位、1位……),AL的其余位保持不变,i和j的值分别在CL和CH中
MOVDX,AX
SHRAH,CL
ANDAH,1
NOTAH
PUSHCX
MOVCL,CH
RORAL,CL
ORAL,AH
ROLAL,CL
POPCX
7、已知两个无符号字数X、Y分别存放在ADRX和ADRY单元中,编制程序,若X是Y的倍数,则在显示器上显示0,否则显示1
MOVDX,0
MOVAX,ADRX
MOVBX,ADRY
DIVBX
CMPDX,0
JZZERO
……
8、编写子程序
子程序名:
AVER
子程序功能:
求一组无符号字符数据的平均值(有符号)(字)
入口条件:
数据首地址在SI中,数据个数在CL中
出口条件:
平均值在AL中
AVERPROCNEAR
PUSHSI
PUSHCX
XORAX,AX
AGAIN:
ADDAL,[SI]
INCSI
DECCL
JNZAGAIN
POPCX
DIVCL
POPSI
RET
AVERENDP
9、若有一个ASCII字符串,它的起始地址放在单元STRING内,要求从串中取出每一个字符,加偶校验。
datasegment
stringdb'90'
countequ$-string
dataends
……
leasi,string
movcx,count
again:
lodsb
andal,al
jpenext
oral,80h
mov[si-1],al
next:
deccx
jnzagain
10、请求出AL中“1”的个数,结果存入AH中。
解:
MOVAH,0
Again:
SHLAL,1
ADCAH,0
CMPAL,0
JNZAgain
HLT
或
MOVAH,0
MOVCL,8
Again:
SHLAL,1
JNCNext
INCAH
Next:
DECCL
JNZAgain
HLT
11、若BLOCK开始的内存缓冲区中,有100个16位带符号数,要把其中最大值存放在MAX单元中
MOVBX,OFFSETBLOCK
MOVAX,[BX]
INCBX
INCBX
MOVCX,99
AGAIN:
CMPAX,[BX]
JGNEXT
MOVAX,[BX]
NEXT:
INCBX
INCBX
LOOPAGAIN
MOVMAX,AX
HLT
12、读入一个ASCII码,在最高位实现奇校验
MOVAH,1
INT21H
ANDAL,AL
JNPNEXT
ORAL,80H
NEXT:
13、已知一多字节数据存放在内存DATA开始的连续单元中,求绝对值放在RESULT开始的多字节数据
DATADB12H,34H,56H,78H,9AH,BCH,DEH,F0H
CNEQU$-DATA
RESULTDB20DUP()
LEADI,RESULT
DECDI
MOVAL,[DI]
TESTAL,80H
JNZF
MOVCX,CN
CLD
LEASI,DATA
LEADI,RESULT
REPMOVSB
HLT
F:
LEASI,DATA
LEADI,RESULT
MOVCX,CN
CLC
AGAIN:
MOVAL,0
SBBAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPAGAIN
14、按下列子程序说明信息编制子程序
子程序名:
CMPA
子程序功能:
比较两个长度相同的无符号数x和y
入口参数:
x和y的首地址分别放在SI和DI中,数据长度在CL中
出口参数:
x>y时,CF=0;x 受影响的寄存器: 标志寄存器 CMPAPROC PUSHAX PUSHCX MOVCH,0 LP: MOVAL,[SI] CMPAL,[DI] JAABOVE JBBELOW ADDSI,1 ADDDI,1 LOOPLP XORCX,CX JMPRETURN ABOVE: CLC JMPRETURN BELOW: STC RETURN: POPCX POPAX RET CMPAENDP 15、试编写程序,对BUF字节存储区中的3个数进行比较,并按比较结果显示如下 (1)如果3个数都不相等则显示0 (2)如果3个数有2个数相等则显示1 (3)如果3个数都相等则显示2 BUFDB68,89,-5 MOVAL,BUF MOVBL,BUF+1 MOVCL,BUF+2 CMPAL,BL JZZERO12 CMPAL,CL JZNEXT CMPBL,CL JZNEXT ;显示0 JMPEXIT ZERO12: CMPAL,CL JZZERO123 NEXT: ;显示1 JMPEXIT ZERO123: ;显示2 16、已知数据区中有一数组ARRAY,其元素类型为单字节,现统计其中正数、0、个数。 数据区结构见下,请写出程序主体部分。 DATASEGMENT ARRAYDB23,-15,0,67,-19,0,-12,89,120,55 CNEQU$-ARRAY DATAENDS LEASI,ARRAY MOVCX,CN XORAX,AX XORBX,BX PZN0: CMP[SI],0 JLPZN1 JZZN INCAX JMPPZN1 ZN: INCBX PZN1: INCSI LOOPPZN0 17、将DAT字单元中的16位二进制数分成四组,每组4位,然后将这4组放到DAT1、DAT2、DAT3、DAT4这4个字节单元中 DATDW0A5D2H DAT1DB DAT2DB DAT3DB DAT4DB MOVAX,DAT MOVBX,0F0FH ANDBX,AX MOVDAT1,BL MOVDAT3,BH MOVBX,0F0F0H ANDBX,AX MOVDAT2,BL MOVDAT4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编程序