汇编实验.docx

上传人:b****6 文档编号:3606147 上传时间:2022-11-24 格式:DOCX 页数:16 大小:272.87KB
下载 相关 举报
汇编实验.docx_第1页
第1页 / 共16页
汇编实验.docx_第2页
第2页 / 共16页
汇编实验.docx_第3页
第3页 / 共16页
汇编实验.docx_第4页
第4页 / 共16页
汇编实验.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

汇编实验.docx

《汇编实验.docx》由会员分享,可在线阅读,更多相关《汇编实验.docx(16页珍藏版)》请在冰豆网上搜索。

汇编实验.docx

汇编实验

实验一

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.实验总结分析:

运用判断语句作为跳转的条件,在标号间的准确的跳转,可以让代码更加清晰,有条理,更有可读性。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1