24个汇编实例小程序.docx
《24个汇编实例小程序.docx》由会员分享,可在线阅读,更多相关《24个汇编实例小程序.docx(64页珍藏版)》请在冰豆网上搜索。
24个汇编实例小程序
24个汇编小程序
题目列表:
逆序输出字符串“BASEDADDRESSING”
从键盘上输入两个数,分别放到x,y单元,求出它们的和
试编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域
键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出
从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符
把一个包含20个数据的数组M分成两组:
正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来
求出首地址为data的100个字数组中的最小偶数,并把它放在ax中
输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“nomatch”
从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数
从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果
有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零
从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。
如有,则把cl的第五位置1,否则将该位置置0
在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f分别考虑有符号数、无符号数情况)
一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一个程序,把既在A中又在B中出现的整数存放于数组C中
设在A、B和D单元中分别存放着三个数。
若三个数都不是0,则求出三个数的和并存放在S单元,若其中有一个数为0,则把其它两个单元也清零。
请编写此程序
从键盘输入一系列字符(以回车键结束),并按字母、数字和其他字符分类计数,最后显示这三类的计数结果
已定义两个整数变量A和B,试编写程序完成以下功能
(1)若两个树种有一个是奇数,则将奇数存入A中,偶数存入B中
(2)若两个数均为奇数,则将两个数加1后存回原变量
(3)若两个数均为偶数,则两个变量均不变
写一段子程序skiplines,完成输出空行的功能。
空行的行数由用户在主程序中通过键盘输入,并将行数放在ax寄存器中
设有10个学生成绩分别是76,69,84,73,88,99,63,100和80。
试编写一个子程序统计60-69分,70-79分,80-89分,90-99分和100分的人数,并分别放到S6,S7,S8,S9,S10单元中
编写子程序嵌套结构的程序,把整数分别用二进制和八进制显示出来
在D盘根目录建立一个文件abc.txt,第一次向文件写入“123456”六个字符,第二次增加“abcdefg”几个字符
从键盘上输入文本文件:
“d:
\temp.txt”的内容后,然后新建一个文件“d:
\temp2.txt”,把前一个文件的所有内容复制到后一个文件中
从键盘上输入一个十进制数,以十六进制数显示出来。
要求子程序用寄存器参数传送方法
试编制一个程序,把bx寄存器中的二进制数用十六进制数的形式在屏幕上显示出来
代码:
1.逆序输出字符串“BASEDADDRESSING”
s1segmentstack;定义栈段s1
dw100dup(?
);定义栈空间为100
toplabelword;top指向栈顶
s1ends
s2segment;定义数据段s2
sdb'BASEDADDRESSING','$';定义字符串s
S2ends
s3segment;定义代码段s3
assumecs:
s3,ds:
s2,ss:
s1
mainprocfar
movax,s1;栈初始化——
movss,ax
leasp,top;——栈初始化
movax,s2;数据段初始化——
movds,ax;——数据段初始化
movsi,15
l:
movdl,s[si];dl获取字符串s的最后一个(从零开始的第十五个字符)
movah,2;调用int21h2号功能输出dl上的值
int21h
decsi;寄存器减一,准备获取下一个字符
cmpsi,0
jal
movah,4ch;终止
int21h
mainendp
s3ends
endmain
2.从键盘上输入两个数,分别放到x,y单元,求出它们的和
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'Pleaseinputx:
','$';提示输入
h2db'Pleaseinputy:
','$';提示输入
h3db'z=x+y:
','$';提示输出
crlfdb0dh,0ah,24h;定义回车换行
xdw?
ydw?
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s3
mainprocfar
movax,s1;初始化——
movss,ax
leasp,top
movax,s2
movds,ax;——初始化
leadx,h1;int21h9号功能输出“提示输入x”的字符串
movah,9
int21h
xorbx,bx;bx清零,即把bx置零
InputX:
movah,1;输入一个字符
int21h
cmpal,0dh;判断时候为“回车”字符
jzexit1;如果是回车字符就跳转到exit1
cmpal,30h;和30h(即字符0的asii值)比较
jlexit1;如果输入字符小于'0',跳转到exit1
cmpal,39h;和39h(即字符9的ascii值)比较
jgexit1;如果输入字符大于'9',跳转到exit1
subal,30h;al减去30h,输入字符转化成数字(从这一行开始到后面的addbx,ax为输入字符转化为数字的处理方法)
cbw;al扩充为ax
xchgax,bx
movcx,10
mulcx
xchgax,bx
addbx,ax;subal,30h开始到这一行为输入字符转化为数字的处理方法
jmpInputX
exit1:
movx,bx;把输入的存于bx的放到x中
leadx,crlf
movah,9
int21h
leadx,h2
movah,9
int21h
xorbx,bx
InputY:
;和InputX类似,输入y
movah,1
int21h
cmpal,0dh
jzexit2
cmpal,30h
jlexit2
cmpal,39h
jgexit2
subal,30h
cbw
xchgax,bx
movcx,10
mulcx
xchgax,bx
addbx,ax
jmpInputY
exit2:
movy,bx;把输入的存于bx的放到y中
movbx,x
addbx,y;此时bx为两数加和
leadx,crlf
movah,9
int21H
leadx,h3
movah,9
int21h
xorsi,si;si清零,用作计数
movax,bx;把和放到ax上
l4:
movcl,10;把和连续除以10知道和变为零,余数依次进栈
divcl
movdl,ah
movdh,0
pushdx
incsi
movah,0;重要,不能漏写
cmpal,0
jnzl4
l5:
popdx;余数依次出栈
adddl,30h;余数转换为显示的余数字符
movah,2;输入余数字符
int21h
decsi
cmpsi,0
jnzl5
movah,4ch
int21H
mainendp
s3ends
endmain
3.是编写一段程序,要求在长度为10的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域,并分别显示up、down数组的个数和数组内的数字
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'thenumofuparrayandtheuparrayare(printsindecimalism):
','$'
h2db'thenumofdownarrayandthedownarrayare(printsindecimalism):
','$'
crlfdb0dh,0ah,24h
arraydb0,50h,11h,61h,22h,72h,33h,73h,41h,74h,'$';定义数组array
updb10dup(?
);定义up数组
downdb10dup(?
);定义down数组
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s3
mainprocfar
movax,s1
movss,ax
leasp,top
movax,s2
movds,ax
movsi,0
movdi,1
movbp,1
repeat:
cmparray[si],42h;把array数组中小于42h的值放到down数组里,大于42h的值放到up数组里面
jbdownarray
movdl,array[si]
movup[bp],dl
incsi
cmpsi,10
jzexit1
incbp
jmprepeat
downarray:
movdl,array[si]
movdown[di],dl
incsi
cmpsi,10
jzexit2
incdi
jmprepeat
exit1:
subdi,1
jmpexit
exit2:
subbp,1
exit:
movdx,bp;把分配好的up数组和down数组在其有效数字后面添加'$',便于后面的输出结束
movup[0],dl
incbp
movup[bp],'$'
movdx,di
movdown[0],dl
incdi
movdown[di],'$'
movcl,10
movsi,0
leadx,h1
movah,9
int21h
PrintUparray:
cmpup[si],'$'
jznext
moval,up[si]
callprint
incsi
jmpPrintUparray
next:
leadx,crlf
movah,9
int21h
leadx,h2
int21h
xorsi,si
PrintDownArray:
cmpdown[si],'$'
jzatend
moval,down[si]
callprint
incsi
jmpPrintDownArray
printprocnear;print为输出十进制输出某个数的子程序
movdi,0
rediv:
movah,0
divcl
movdl,ah
movdh,0
pushdx
incdi
cmpal,0
jnzrediv
break:
popdx
adddl,30h
movah,2
int21h
decdi
cmpdi,0
jnzbreak
movdl,''
movah,2
int21H
ret
printendp
atend:
movah,4ch
int21H
mainendp
s3ends
endmain
4.键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'Pleaseinputastring:
','$'
h2db'Thechangedstringis:
','$'
crlfdb0dh,0ah,24h
tempdb?
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s3
mainprocfar
movax,s1
movss,ax
leasp,top
movax,s2
movds,ax
leadx,h1
movah,9
int21h
movsi,0
l:
movah,1
int21h
cmpal,0dh
jzexit
cmpal,'a'
jlputin
cmpal,'z'
jgputin
subal,20h;把小写字符变为大写字符
putin:
movtemp[si],al;把字符放到temp数组里
incsi
jmpl
exit:
leadx,crlf;输出tmp数组
movah,9
int21h
leadx,h2
movah,9
int21h
incsi
movtemp[si],'$'
leadx,temp
movah,9
int21h
movah,4ch
int21H
mainendp
s3ends
endmain
5.从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'Pleaseinputalowercase:
','$'
h2db'Thethethreecharsare:
','$'
crlfdb0dh,0ah,24h
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s3
mainprocfar
movax,s1
movss,ax
leasp,top
movax,s2
movds,ax
l:
leadx,h1
movah,9
int21h
movah,1
int21h
cmpal,'a'
jll
cmpal,'z'
jgl
movcl,al
leadx,crlf
movah,9
int21H
leadx,h2
movah,9
int21h
deccl
movdl,cl;输出前导字符
movah,2
int21h
movdl,''
movah,2
int21h
inccl
movdl,cl;输出该字符
movah,2
int21h
movdl,''
movah,2
int21h
inccl
movdl,cl;输出后导字符
movah,2
int21h
movah,4ch
int21H
mainendp
s3ends
endmain
6.把一个包含20个数据的数组M分成两组:
正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'thepositivenumberis:
','$'
h2db'thenegativenumberis:
','$'
crlfdb0dh,0ah,24h
arraydw50h,-11h,61h,-22h,72h,-33h,73h,-41h,74h,21h,67h,-90h,73h,77h,-1h,-89h,-11h,61h,-22h,20h,'$'
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s3
mainprocfar
movax,s1
movss,ax
leasp,top
movax,s2
movds,ax
movbx,0
movsi,0
l:
movdx,array[si]
cmpdx,0
jladdlow;有符号数比较用jl
addsi,2
cmpsi,40
jzexit
jmpl
addlow:
incbx
addsi,2
cmpsi,40
jzexit
jmpl
exit:
leadx,h2
movah,9
int21h
movax,bx
callprint
leadx,crlf
movah,9
int21h
leadx,h1
movah,9
int21h
movax,20
subax,bx
callprint
jmpatend
printprocnear;打印数字字符的子程序
movcl,10
movsi,0
repeat:
divcl
movdl,ah
adddl,30h
movdh,0
pushdx
incsi
movah,0
cmpal,0
jnzrepeat
l2:
popdx
movah,2
int21h
decsi
cmpsi,0
jnzl2
ret
printendp
atend:
movah,4ch
int21H
mainendp
s3ends
endmain
7.打印输出首地址为data的20个字数组中的最小偶数
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'theminevennumberis:
','$'
crlfdb0dh,0ah,24h
datadw50,-11,61,-22,72,-33,73,-41,74,21,67,-90,73,77,-1,-89,-11,61,-22,20,'$'
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s1
mainprocfar
movax,s1
movss,ax
leasp,top
movax,s2
movds,ax
movbx,65534;bx存最小数,初始令最小值置为65534
movsi,0
movcl,100
movdl,2
l2:
movax,data[si]
cmpax,0
jnll4
negax;如果是负数,则求补
l4:
divcl
moval,ah
movah,0
divdl
cmpah,0
jnzl1
cmpbx,data[si];比较最小值和数组中的每个数
jll1;如果数组中的数大于最小值跳转到l1
movbx,data[si];如果数组中的数小于最小值则将其赋给最小值
l1:
addsi,2
cmpsi,40
jzexit
jmpl2
exit:
leadx,h1
movah,9
int21h
cmpbx,0
jnll5
negbx
movdl,'-'
movah,2
int21h
l5:
movax,bx
callprint;调用子程序输出最小值
jmpatend
printprocnear
movcl,10
movsi,0
repeat:
divcl
movdl,ah
adddl,30h
movdh,0
pushdx
incsi
movah,0
cmpal,0
jnzrepeat
l3:
popdx
movah,2
int21h
decsi
cmpsi,0
jnzl3
ret
printendp
atend:
movah,4ch
int21H
mainendp
s3ends
endmain
8.输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“nomatch”
s1segmentstack
dw100hdup(?
)
toplabelword
s1ends
s2segment
h1db'Pleaseinputthefirststring:
','$'
h2db'Pleaseinputthesecondstring:
','$'
h3db'MATCH','$'
h4db'NOMATCH','$'
crlfdb0dh,0ah,24h
str1db50,?
50dup('$')
str2db50,?
50dup('$')
s2ends
s3segment
assumecs:
s3,ds:
s2,ss:
s3
mainprocfar
movax,s1
movss,ax
leasp,top
movax,s2
movds,ax
leadx,h1
movah,9
int21h
leadx,str1
movah,0ah
int21h
leadx,crlf
movah,9
int21h
leadx,h2
int21h
leadx,str2
movah,0ah
int21h
leadx,crlf
movah,9
int21h
movdl,str1+1;str1+1为str1实际的字符个数
cmpdl,str2+1;str2+1为str2实际的字符