汇编实例.docx
《汇编实例.docx》由会员分享,可在线阅读,更多相关《汇编实例.docx(37页珍藏版)》请在冰豆网上搜索。
汇编实例
汇编实例:
必须懂的题目:
1、X,Y,W为字节类型的数,求Z=((W-X)*10+5)/(X+Y)
DSegSegment
xdb38h
ydb20h
wdb30h
zdw?
tendb10
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movbl,x
addbl,y;先求分母,存于BL
moval,w
subal,x
imulten
addax,5
idivbl
movz,ax
moval,0
movah,4ch
int21h
CSegends
endStart
2、X,Y为字节类型数,求((X+Y)*8-(X-Y)*2)/16
写出完整的数据段和代码段,不用乘除指令
DSegSegment
xdb38h
ydb20h
zdb?
DSegends
CSegSegment
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
moval,x
addal,y
cbw
movcl,3
salax,cl;(x+y)*8
Movbx,ax
moval,x
subal,y
cbw
Salax,1;(x-y)*2
subbx,ax
movcl,4
sarax,cl;((x+y)*8-(x-y)*2)/16
movz,al
moval,0
movah,4ch
int21h
CSegends
endStart
1、统计字符串中空格的个数和字符串长度,字符串以’$’结束
DSegSegment
Bufdb'FDSHHFOEHWHLK$'
cundb0
lendb0
DSegends
CSegSegment
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
moval,0;存放空格个数
leabx,buf
movah,0;存放字符串长度
again:
cmpbytrptr[bx],'$'
jeexit
cmpbyteptr[bx],20h;内存单元与立即数比较时要说明类型,这一句也可以成(movdl,[bx]cmpdl,20h)20H是空格的ASC码
jness
incal
ss:
incah
incbx
jmpagain
exit:
movlenah
movcon,al
moval,0
movah,4ch
int21h
CSegends
endStart
2、Y=∑Ai*Bi,i=1—8,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中,
DSegSegment
num1db12,34,56,78,65,02,39,8
num2db98,65,32,74,78,12,03,56
resultdw?
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movcx,8
movbx,0
movsi,offsetnum1
movdi,offsetnum2
again:
moval,[si]
mulbyteptr[di]
addbx,ax
incdi
incsi
loopagain
movresult,bx
moval,0
movah,4ch
int21h
CSegends
endStart
已知数组A中包含4个互不相等的整数,数组B中包含7个互不相等的整数,编程把既在A中又在B中出现的整数存于数组C中
DSegSegment
adb23,67,2,1
bdb23,35,67,5,6,7,9
cdb4dup(?
)
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movsi,0;SI为A数组的变址寄存器
movbx,0;BX为C数组的变址寄存器
l:
movcx,7;CX中存放B数组的个数,与LOOP配合控制循环次数
moval,a[si];取A数组中的数存AL
movdi,0;DI为B数组的变址寄存器,
下一个A数组中的数与B数组的数比较时要把DI清0
l1:
cmpal,b[di]
jnenext
movc[bx],al
incbx
next:
incdi;在循环结束前回到L1,取B数组的下一个数
loopl1
incsi;在外循环结束前回到L,取A数组的下一个数
cmpsi,4;4为A数组的个数
jbl;控制外循环结束
moval,0
movah,4ch
int21h
CSegends
endStart
显示
*********
*******
*****
***
*
DSegSegment
Msgdb0dh,0ah,'$'
DSegends
CSegSegment
Assumecs:
CSeg,ds:
DSeg
start:
movax,dseg
movds,ax
movbx,9;第一行的字符个数
lp:
movcx,bx;字符个数送cx,为循环次数
lop:
movdl,'*';以下3句为显示字符*
movah,2
int21h
looplop
leadx,msg;以下3句回车换行
movah,09h
int21h
decbx
decbx
cmpbx,1;BX-2,判断,如果<=1则回到LP,显示下一行
jgelp;注意,要用JGE,不能用JAE
moval,0
movah,4ch
int21h
CSegends
endStart
1、编写程序,统计字缓冲区中的20个数据的正数、负数、0的di,0;DI为B数组的变址寄存器,个数,并将统计结果以16进制形式显示出来。
(也可以写得简略一些,不显示程序中的字符串也可以)
DATASEGMENT
BUFDW0,-1,2,4,3,-4,5,6,-7,-6,9,-10,11,14,17,18,-16,-15,8,-13,20,22,-23,0,21
a1db0;存放正数个数
a2db0;存放负数个数
a3db0;0的个数
STR1DB'THENUMBEROFplusIS:
','$'
STR2DB'THENUMBEROFminusIS:
','$'
STR3DB'THENUMBEROFzeroIS:
','$'
STR4DB0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,BUF
MOVCX,25
LOP:
CMPwordPTR[SI],0
jgel1;>=0转l1
INCa2;负数
JMPL3
L1:
jel2;=0转L2
INCa1;正数
JMPL3
L2:
INCa3;零
L3:
ADDSI,2
LOOPLOP
LEADX,STR1;显示正数的字符串
MOVAH,09H
INT21H
movbh,0
movbl,a1
CALLDISP;通过调用显示子程序显示正数的个数,子程序中的要显示的数字存于bx中
LEADX,STR4;回车换行
MOVAH,09H
INT21H
LEADX,STR2
MOVAH,09H
INT21H
movbl,a2
CALLDISP
LEADX,STR4;回车换行
MOVAH,09H
INT21H
LEADX,STR3
MOVAH,09H
INT21H
movbl,a3
CALLDISP
MOVAH,4CH
INT21H
DISPPROC;显示BX中的数
movch,4
roll:
movcl,4
rolbx,cl
movdl,bl
anddl,0fh
cmpdl,9
jbenext1
adddl,07h
next1:
adddl,30h
movah,02h
int21h
decch
jnzroll
RET
DISPENDP
CODEENDS
ENDSTART
2、编写子程序搜索指定字符缓冲区中是否有n,如果有用y替代。
调用子程序将BUF1,BUF2,BUF3中的n全部用y替代
datasegment
buf1db'Iamastudent!
','$'
len1=$-buf1
buf2db'ewfhefnfn','$'
len2=$-buf2
buf3db'hdinky','$'
len3=$-buf3
mdb13,10,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
leasi,buf1
movcx,len1
callcmmp
leasi,buf2
movcx,len2
callcmmp
leasi,buf3
movcx,len3
callcmmp
movah,4ch
int21h
;子程序的功能:
搜索字符串中是否有n字符,如果有用y替代,并显示字符串
;入口参数为字符串偏移地址SI,字符串长度CX
cmmpproc
movdx,si;将要显示的字符串的偏移地址送DX,用于显示字符串。
这句应在子程序的开始,因为下面语句会改变SI的值
l1:
cmpbyteptr[si],'n'
jnzl2
moval,'y'
mov[si],al
l2:
incsi
loopl1
movah,09h;显示字符串
int21h
leadx,m;回车换行
int21h
ret
cmmpendp
codeends
endstart
在buf开始的存储单元中查找字符'E',找到后删除E后面的2个字符,并显示字符串。
DATASEGMENT
COUNDB20
BUFDB'ABCDEFGHIJKLMNOPQRST'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA;
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEADI,BUF
MOVCL,COUN
;查找字符E
MOVAL,'E'
CLD
REPNESCASB
JZFOUND
JMPDONE
;找到E后,DI指向E后面的第一个字符,将SI指向E后面的的3个字符,进行字符串传送
FOUND:
MOVSI,DI;
ADDSI,2;
SUBCL,2;
CLD
REPMOVSB
;显示字符串
MOVBYTEPTR[BUF+18],'$';
DONE:
LEASI,BUF
MOVDX,SI
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
;将数据段中的数字改成*
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSegSegment
stringdb'di2h4nl5jhl'
countequ$-string
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movcx,count;设置循环次数
movsi,offsetstring
again:
moval,[si]
cmpal,'0'
jbnext
cmpal,'9'
janext
moval,'*'
mov[si],al
next:
incsi
loopagain;字符个数减1,不为0继续循环
Done:
moval,0
movah,4ch
int21h
CSegends
endStart
;从键盘输入一个字符串,并把它显示出来
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSegSegment
cfdb0dh,0ah,'$'
msgdb20,?
20dup(?
)
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
leadx,msg
movah,0ah
int21h;系统等待键盘输入字符串
leadx,cf
movah,09h
int21h
Movbl,m送到bx寄存器
Movbh,0
movmsg+2[bx],'$';[msg+2+bx]单元是字符串的结尾,显示的字符串要以$结束,在字符串的结束处加$
leadx,msg+2
movah,09h
int21h
moval,0
movah,4ch
int21h
CSegends
endStart
显示十六进制数的子程序
DISPPROC;显示BX中的数
movch,4
roll:
movcl,4
rolbx,cl
movdl,bl
anddl,0fh
cmpdl,9
jbenext1
adddl,07h
next1:
adddl,30h
movah,02h
int21h
decch
jnzroll
RET
DISPENDP
;内存首地址为BUF的10个字节数,累加求和,结果存于RESULT中
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSegSegment
Bufdb3,4,56,7,8,-3,7,3,6,9
Resdb?
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
moval,0
leabx,buf
movcx,10
aga:
addal,[bx]
incbx
loopaga
movres,al
moval,0
movah,4ch
int21h
CSegends
sg+1;字符串长度放在msg+1,endStart
;程序段也可以写成
moval,0
mov?
?
?
?
?
?
bx,?
0
?
?
?
?
mov?
?
?
?
?
?
cx,?
10
aga:
?
add?
?
?
al,?
buf[bx]
?
?
?
inc?
?
?
?
?
?
?
bx
?
?
?
?
loop?
?
?
?
?
again
movres,al
;内存首地址为BUF的10个字节数,求0的个数,并显示出来。
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSegSegment
BUFDB0,-1,2,4,3,-4,5,6,-7,0
RESULTdb0
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
MOVAL,0;存放0的个数
LEASI,BUF
MOVCX,10
LOP:
CMPBYTEPTR[SI],0
JNEL3
INCAL;0的个数
L3:
INCSI
LOOPLOP
MOVBL,AL
MOVBH,0
CALLDISP;调用显示子程序
moval,0
movah,4ch
int21h
DISPPROC;显示BX中的数
movch,4
roll:
movcl,4
rolbx,cl
movdl,bl
anddl,0fh
cmpdl,9
jbenext1
adddl,07h
next1:
adddl,30h
movah,02h
int21h
decch
jnzroll
RET
DISPENDP
CSegends
endStart
;有数据段
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSegSegment
bufdw12,34,-45,-567,35,-54,23,-56,-432,-78,-678,43,76,321,761,-890,670,125,987,912
buf1dw20dup(?
)
buf2dw20dup(?
)
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movcx,20
leabx,buf
leasi,buf1
leadi,buf2
again:
movax,[bx]
cmpax,0
jll
mov[si],ax
incsi
incsi
jmpnext
l:
mov[Di],ax
incdi
incdi
next:
incbx
incbx
loopagain
moval,0
movah,4ch
int21h
CSegends
endStart
;将一个字符串中的所有大写字母改为小写字母,字符串以0结尾。
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSegSegment
Stringdb'AHLGLKNDLJ',0
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movbx,offsetstring
again:
moval,[bx];取一个字符
oral,al;是否为结尾符0
jzdone;是,退出循环
cmpal,'A';是否为大写A~Z
jbnext
cmpal,'Z'
janext
oral,20h;是,转换为小写字母
mov[bx],al;仍保存在原位置
next:
incbx
jmpagain;继续循环
done:
moval,0
movah,4ch
int21h
CSegends
endStart
;Y=∑Ai*Bi,i=1—8,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。
请同学们用另一种方法做,并把结果显示在屏幕上
DSegSegment
num1db12,34,56,78,65,02,39,8
num2db98,65,32,74,78,12,03,56
resultdw?
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movcx,8
movbx,0
movsi,offsetnum1
movdi,offsetnum2
again:
moval,[si]
mulbyteptr[di]
addbx,ax
incdi
incsi
loopagain
movresult,bx
moval,0
movah,4ch
int21h
CSegends
endStart
;在首地址为MSG1的字数组中存放了10个16进制数,求出平均数,以及大于平均数的数个数,存放在count单元中.
DSegSegment
Msg1dw300H,300H,300H,300H,300H,100H,100H,100H,100H,100H
lendw10
Msg2dw?
;存放平均数
countdb0;大于平均数的数的个数
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
;求和
leasi,msg1
movax,[si]
movcx,9
pp:
addsi,2
addax,[si]
looppp
;求平均数
movdx,0
idivlen
movmsg2,ax
;求大于平均数的个数
movcx,len
le