汇编实验.docx
《汇编实验.docx》由会员分享,可在线阅读,更多相关《汇编实验.docx(16页珍藏版)》请在冰豆网上搜索。
汇编实验
实验一
1.实验目的及要求:
写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG中的SUM中。
其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。
2.实验步骤:
实验要求所给的数据都是双精度数,即32位数。
而所能使用的寄存器都是16位,所以要把该运算的高16位和低16位分开进行。
然后转化为16进制,循环输出。
3.实验内容:
流程图:
代码:
D_SEGSEGMENT
D_WORDLABELWORD
AUGENDDD99251
S_WORDLABELWORD
SUMDD?
D_SEGENDS
E_SEGSEGMENT
E_WORDLABELWORD
ADDENDDD-15962
E_SEGENDS
C_SEGSEGMENT
ASSUMECS:
C_SEG,DS:
D_SEG,ES:
E_SEG
MAINPROCFAR
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,D_SEG
MOVDS,AX
MOVAX,E_SEG
MOVES,AX
MOVAX,D_WORD
MOVBX,D_WORD+2
ADDAX,ES:
E_WORD
ADCBX,ES:
E_WORD+2
MOVS_WORD,AX
MOVS_WORD+2,BX
RET
MAINENDP
C_SEGENDS
ENDSTART
4.实验结果:
输出结果为16进制:
00014559H,即10进制的83289。
5.实验总结分析:
数据在计算机中的存储都二进制形式的。
而这些数据放入存储单元时,遵照的最根本的原则就是“高高低低原则”,高位数存放在较大的地址单元中,低位数则反之。
掌握了这一原则,我们就可以运用16位的寄存器通过一些变通来进行32位数的运算,拓宽了我们机器和程序的适用范围。
实验二
1.实验目的及要求:
不用串操作指令,把字符串string1的内容传送到字符串string2,字符长度为count。
2.实验步骤:
运用DOS系统功能的1号功能输入并保存N值。
计数器置零。
然后用循环结构,每一次循环输出一个响铃命令,并让计数器自加1,直到计数器数值达到N,便完成了响铃N次的目标。
3.实验内容:
流程图:
代码:
……movcx,count
leasi,string1
leadi,string2
again:
moval,[si]
mov[di],al
incsi
incdi
loopagain
4.实验结果:
5.实验总结分析:
在不使用串操作指令的情况下,我们也是可以完成对串的各种操作的。
也就是说,串操作指令的功能,其实完全是可以用普通语句加上选择、循环等控制结构来完成的。
从中我们可以看到,任何高级的语句,其内部也就是基础语句的集合。
实验三
1.实验目的及要求:
试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。
2.实验步骤:
运用DOS系统功能的1号功能输入并保存N值。
计数器置零。
然后用循环结构,每一次循环输出一个响铃命令,并让计数器自加1,直到计数器数值达到N,便完成了响铃N次的目标。
3.实验内容:
流程图:
代码:
codesegment
assumecs:
code
mainprocfar
start:
pushds
movax,0
pushax
movah,1
int21h
subal,30h
cmpal,0
jzexit
movcl,al
movch,0
again:
movah,2
movdl,7
int21h
loopagain
exit:
ret
mainendp
codeends
endstart
……
4.实验结果:
用输出的感叹号的个数检查循环次数是否正确。
截图中,n=6.
5.实验总结分析:
结合运用DOS系统功能的1号指令进行输入,以及2号、9号指令进行输出就能让程序根据用户输入的数据来运算相应的结果,这样一来,程序的灵活性和可重用性就大大地增强了。
实验四
1.实验目的及要求:
把AX中存放的16位二进制数K看作是8个二进制的"四分之一字节"。
试编写一程序片段,要求数一下值为3(即11B)的四分之一字节数,并将该数在终端上显示出来。
2.实验步骤:
首先,保存住K的原值。
要数出AX中所存16位二进制数K中11B的个数,可以用循环进行8次,每一次屏蔽掉高六位,判断最低两位是否是11B,是的话,计数器加1;不是的话,不进行操作。
然后,将K原值取出,循环左移两位,将得到的数送入下一次循环。
最后计数器里的值,就是所求。
3.实验内容
流程图:
代码:
MOVCX,8
MOVDL,0
NEXT3:
RORAX,1
JNCNEXT1
RORAX,1
JNCNEXT2
INCDL
NEXT2:
LOOPNEXT3
ADDDL,30H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
NEXT1:
RORAX,1
JMPNEXT2
4.实验结果:
AX中的16位数据为:
1101110111011101B
5.实验总结分析:
利用与一些特定数据的逻辑运算,可以让我们将原始数据处理成一个我们希望得到的便于操作的数据。
与运算可以作为屏蔽用,或运算可以置1用。
但是,需要注意的一点是:
如果后续的运算需要原值,那处理数据前一定要记得保存原值。
实验五
1.实验目的及要求:
有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。
2.实验步骤:
实验要求将发现的零删除,并在其后空余的部分补上零。
这样的话,其实就可以转换一个思路:
发现为零的项,不进行删除,而是将其进行循环后移,每次与其后一个项交换位置,知道将该零项移至数组的最后位置。
这样就一次性把删除和补零操作都完成了。
3.实验内容
流程图:
代码:
……
movcx,100
leadi,mem
movax,0
cld
comp:
repnescasw
jcxzexit
pushcx
movsi,di
subdi,2
movbx,di
repmovsw
movwordptr[di],0
movdi,bx
popcx
jmpcomp
exit:
……
4.实验结果:
数组MEM初始化为:
MEMDW10DUP(31H,32H,30H,33H,34H,35H,30H,36H,37H,38H)
5.实验总结分析实验目的及要求:
通过判断和循环语句,我们可以对一个数组进行一定的处理,使之拥有我们所希望的一定的次序。
但在这种比较复杂的程序中,尤其需要注意细节问题,因为任何一个细节的偏差,会导致整个结果的错误。
实验六
1.实验目的及要求:
在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字。
如有,则把CL的第5位置1,否则将该位置0。
2.实验步骤:
3.实验内容:
流程图:
代码:
……
movdx,100
movsi,0
repeat:
moval,string[si]
cmpal,30h
jbgoon
cmpal,39h
jagoon
orcl,20h;(cl)51
jmpexit
goon:
incsi
decdx
jnzrepeat
andcl,0dfh;(cl)50
exit:
……
4.实验结果:
5.实验总结分析:
实验七
1.实验目的及要求:
在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次数最多的数及其出现次数分别存放于AX和CX中。
2.实验步骤:
3.实验内容:
……
tabledw100hdup(?
)
mdatadw?
;存放出现次数最多的数
countdw0;存放出现次数
……
movbx,100h
movdi,0;di为数组TABLE的指针
next:
movdx,0
movsi,0
movax,table[di]
movcx,100h
comp:
cmptable[si],ax
jneaddr
incdx
addr:
addsi,2
loopcomp
cmpdx,count
jlechang
movcount,dx
movmdata,ax
chang:
adddi,2
decbx
jnznext
movcx,count
movax,mdata
……
4.实验结果:
5.实验总结分析:
实验八
1.实验目的及要求:
已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一程序,把既在A中又在B中出现的整数存放于数组C中。
2.实验步骤:
题目要求将A和B中同时出现的数字放入C中,则需要两个嵌套的循环,外层循环做15次,遍历A中所有的数字;而A中的每一个数字,与B中的数字逐一进行比较,是一个最多做20次得内层循环,要么找到相同的数跳回外层循环,要么20个全比较了也没找到相同的数字,然后跳回外层循环。
每找到一个相同的数,将之放入C中。
3.实验内容:
流程图:
代码:
……
adw15dup(?
)
bdw20dup(?
)
cdw15dup(?
)
……
movsi,0;si为数组A的指针
movbx,0;bx为数组C的指针
movcx,15
loop1:
movdi,0;di为数组B的指针
pushcx
movcx,20
movax,a[si]
loop2:
cmpb[di],ax
jneno
movc[bx],ax
addbx,2
jmpnext
no:
adddi,2
looploop2
next:
addsi,2
popcx
looploop1
4.实验结果:
A、B、C三个数组初始化为:
ADB31H,32H,33H,34H,35H,36H,37H,38H,39H,40H,
41H,42H,43H,44H,45H
BDB31H,32H,33H,34H,35H,46H,47H,48H,49H,50H,
51H,52H,53H,54H,55H,
56H,57H,58H,59H,60H
TDB15DUP('*'),'$'
5.实验总结分析:
使用多重循环可以解决更为复杂的问题。
如第七题,要从B中找出是否有相同的数,当然需要将A中的那个数逐一与B中的数进行比较,这里需要一个循环。
而要将所有相同数找出,则必定要遍历A,这里又需要一个循环。
所以,这个题目必定是一个嵌套的双重循环。
实验九
1.实验目的及要求:
试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息:
(1)如果三个数都不相等则显示0;
(2)如果三个数有两个相等则显示1;
(3)如果三个数都相等则显示2。
2.实验步骤:
这个问题可以列出以下表格来理清思路:
三个数的情形
显示
A=B=C
2
A=B,A=!
C
1
A=C,A=!
B
1
B=C,B=!
A
1
A=!
B,B=!
C,A=!
C
0
然后只要理清跳转的次序,每次跳转的起点和终点就可以了。
3.实验内容:
流程图:
代码:
……
movdx,0
leasi,array
movax,[si]
movbx,[si+2]
cmpax,bx
jnenext1
incdx
next1:
cmp[si+4],ax
jnenext2
incdx
next2:
cmp[si+4],bx
jnenum
incdx
num:
cmpdx,3
jldisp
decdx
disp:
movah,2
adddl,30h
int21h
……
4.实验结果:
(1)输入三个数为:
000EH,000EH,000EH
(2)输入三个数为:
000EH,000EH,000FH
(3)输入三个数为:
000AH,000BH,000CH
5.实验总结分析:
运用判断语句作为跳转的条件,在标号间的准确的跳转,可以让代码更加清晰,有条理,更有可读性。