合工大汇编语言程序设计实验报告.docx

上传人:b****3 文档编号:5531973 上传时间:2022-12-18 格式:DOCX 页数:27 大小:417.29KB
下载 相关 举报
合工大汇编语言程序设计实验报告.docx_第1页
第1页 / 共27页
合工大汇编语言程序设计实验报告.docx_第2页
第2页 / 共27页
合工大汇编语言程序设计实验报告.docx_第3页
第3页 / 共27页
合工大汇编语言程序设计实验报告.docx_第4页
第4页 / 共27页
合工大汇编语言程序设计实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

合工大汇编语言程序设计实验报告.docx

《合工大汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《合工大汇编语言程序设计实验报告.docx(27页珍藏版)》请在冰豆网上搜索。

合工大汇编语言程序设计实验报告.docx

合工大汇编语言程序设计实验报告

 

 

工业大学

计算机与信息学院

实验报告

 

课程:

汇编语言程序设计

专业班级:

****************

学号:

**********

姓名:

*****

实验一···········································3

实验二············································7

实验三···········································12

实验四···········································22

实验一Debug程序的使用

一.实验目的

1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。

2、掌握8086/8088的寻址方式及多字节数据的处理方法。

二.实验容

1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:

0200H和DS:

0204H两个单元中。

2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:

0200H单元和DS:

0204H单元中的数据相加,并将运算结果存放在DS:

0208H单元中。

要求:

本次实验的容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。

三.实验过程和程序

实验容一:

eds:

0200E71A3F00

eds:

0204C4E56B00

实验容二:

(1)直接寻址方式

MOVAX,[0200]

MOVBX,[0202]

ADDAX,[0204]

ADCBX,[0206]

MOV[0208],AX

MOV[020A],BX

(2)寄存器间接寻址方式

MOVSI,0200H

MOVDI,0204H

MOVBX,0208H

MOVAX,[SI]

MOVDX,[SI+2]

ADDAX,[DI]

ADCDX,[DI+2]

MOV[BX],AX

MOV[BX+2],DX

四.实验结果(包括必要的截图)

实验容一:

输入数据:

显示数据:

实验容二:

(1)直接寻址方式

程序段编辑:

反汇编:

 

运行:

结果在DS:

0208单元中为00AB00ABH

(2)寄存器间接寻址方式

程序段编辑:

反汇编:

 

运行:

结果高字存放在dx中,低字存放在ax中(结果为00AB00ABh)

 

五.实验体会

通过本实验,实践debug程序中的命令,并在debug下调试运行汇编语言源程序。

在实践过程中,解决如何把数据录入存储单元、debug命令如何使用等问题后,知道存数据例如1234进存储单元时要3412存,还有掌握了寄存器的寻址方式。

实验二汇编语言程序设计(顺序、循环)

一.实验目的

1、掌握顺序和循环程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

二.实验容

1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。

试编写汇编语言程序完成以下功能:

①计算表达式值(V–(X*Y+Z-720))/X;

②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。

2、求一个班50名学生成绩的平均值(附加题:

最大值和最小值,并将结果显示出来)

3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:

查找中间是否有‘asm’子串。

如果有,输出‘Yes’;否则,输出‘No’)。

三.实验过程和程序

(注:

附加题没有做)

实验容一:

X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。

试编写汇编语言程序完成以下功能:

①计算表达式值(V–(X*Y+Z-720))/X;②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。

Datasegment

xdw?

ydw?

zdw?

vdw?

sum1dw?

sum2dw?

Dataends

Codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movax,x

imuly

movcx,ax

movbx,dx

movax,z

cwd

addcx,ax

adcbx,dx

subcx,720

sbbbx,0

movax,v

cwd

subax,cx

sbbdx,bx

idivx

movsum1,ax

movsum2,dx

movah,4ch

int21h

Codeends

endstart

实验容二:

求一个班50名学生成绩的平均值(为了方便,只设置了5个学生数据)

datasegment

gradedw90,80,80,70,60;平均数76

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

xorax,ax

movcx,5

movbx,offsetgrade

again:

addax,[bx]

addbx,2

loopagain

movcx,5

cwd

idivcx

movah,4ch

int21h

codeends

endstart

实验容三:

从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串

datasegment

bufferdb50

db?

db50dup('$')

crdb0ah,0dh,"$"

dataends

codessegment

assumecs:

codes,ds:

data

start:

movax,data

movds,ax

input:

movah,10

leadx,buffer

int21h

leadx,cr

movah,9

int21h

output:

leadx,buffer+2

movah,9

int21h

movah,4ch

int21h

codesends

endstart

四.实验结果(包括必要的截图)

实验容一:

设x=156,y=10,z=220,v=2000,则sum1=0006h,sum2=0004h

在ax中看sum1,在dx中看sum2

实验容二:

预先设置的数据求得平均数为76,在ax中查看,即ax=004Ch

实验容三:

五.实验体会

通过本实验,将课本上学到的算术运算类指令、变量定义伪指令、存储单元、DOS0AH号功能(字符串输入)和DOS09H功能(字符串输出)等在实验中实现。

在实现过程中,解决遇到的问题(符号扩展、定义的数组存储空间地址、字符串如何输入输出等)后,对上述知识有了更深的了解,并掌握实现它。

实验三汇编语言子程序设计(分支、子程序)

一.实验目的

1、掌握分支和子程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

3、通过汇编语言了解高级语言的参数传递等知识。

二.实验容

1、BL中的只有一位为1。

编写程序测试,并输出提示信息“TheXBitis1”,要求:

地址表和转移表。

2.编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数存数)。

要求通过堆栈(寄存器、存)传送所有参数。

3.实践CAsm的转换过程。

三.实验过程和程序

实验容一:

BL中的只有一位为1。

编写程序测试,并输出提示信息“TheXBitis1”

(1)转移表

;转移表,bl左到右1-8位

DATASSEGMENT

str1db'the1bitis1',0dh,0ah,'$'

str2db'the2bitis1',0dh,0ah,'$'

str3db'the3bitis1',0dh,0ah,'$'

str4db'the4bitis1',0dh,0ah,'$'

str5db'the5bitis1',0dh,0ah,'$'

str6db'the6bitis1',0dh,0ah,'$'

str7db'the7bitis1',0dh,0ah,'$'

str8db'the8bitis1',0dh,0ah,'$'

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

movbl,00010000b

movcx,8

movsi,0

again:

shlbl,1

jcnext

addsi,3

loopagain

next:

addsi,offsetjmptable

jmpsi

jmptable:

jmpnearptrl1

jmpnearptrl2

jmpnearptrl3

jmpnearptrl4

jmpnearptrl5

jmpnearptrl6

jmpnearptrl7

jmpnearptrl8

l1:

leadx,str1

jmpoutput

l2:

leadx,str2

jmpoutput

l3:

leadx,str3

jmpoutput

l4:

leadx,str4

jmpoutput

l5:

leadx,str5

jmpoutput

l6:

leadx,str6

jmpoutput

l7:

leadx,str7

jmpoutput

l8:

leadx,str8

output:

movah,9

int21h

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

(2)地址表

;地址表,bl左到右依次是第1-8位

DATASSEGMENT

str1db'the1bitis1',0dh,0ah,'$'

str2db'the2bitis1',0dh,0ah,'$'

str3db'the3bitis1',0dh,0ah,'$'

str4db'the4bitis1',0dh,0ah,'$'

str5db'the5bitis1',0dh,0ah,'$'

str6db'the6bitis1',0dh,0ah,'$'

str7db'the7bitis1',0dh,0ah,'$'

str8db'the8bitis1',0dh,0ah,'$'

addrtabledwshow1,show2,show3,show4,show5,show6,show7,show8

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

movbl,00001000b

movcx,8

movsi,0

again:

shlbl,1

jcnext

addsi,2

loopagain

next:

jmpaddrtable[si]

show1:

leadx,str1

jmpoutput

show2:

leadx,str2

jmpoutput

show3:

leadx,str3

jmpoutput

show4:

leadx,str4

jmpoutput

show5:

leadx,str5

jmpoutput

show6:

leadx,str6

jmpoutput

show7:

leadx,str7

jmpoutput

show8:

leadx,str8

jmpoutput

output:

movah,9

int21h

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

实验容二:

编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数存数)

(1)堆栈传递参数

;z=x*y+x-y,x、y、z为有符号数,堆栈传递

DATASSEGMENT

xdw5

ydw2

zdw?

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

subsp,2

pushy

pushx

callcal

popz

movbx,z

MOVAH,4CH

INT21H

calproc

pushbp

movbp,sp

pushax

pushbx

movax,[bp+4]

movbx,[bp+6]

imulbx

addax,[bp+4]

adcdx,0

subax,[bp+6]

sbbdx,0

mov[bp+8],ax

popbx

popax

popbp

ret4

calendp

CODESENDS

ENDSTART

(2)寄存器传递参数

;z=x*y+x-y,x、y、z为有符号数,寄存器传递

DATASSEGMENT

xdw5

ydw2

zdw?

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

movax,x

movbx,y

callcal

movz,ax

MOVAH,4CH

INT21H

calproc

movcx,ax

imulbx

addax,cx

adcdx,0

subax,bx

sbbdx,0

ret

calendp

CODESENDS

ENDSTART

(3)存传递参数

;z=x*y+x-y,x、y、z为有符号数,存传递

DATASSEGMENT

xdw5

ydw2

zdw?

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

callcal

MOVAH,4CH

INT21H

calproc

movax,x

imuly

addax,x

adcdx,0

subax,y

sbbdx,0

movz,ax

ret

calendp

CODESENDS

ENDSTART

实验容三:

实践C—>ASM的转换过程

_TEXTSEGMENT

_c$=-32;size=2

_b$=-20;size=2

_a$=-8;size=2

_mainPROC;COMDAT

;4:

voidmain(){

pushebp

movebp,esp

subesp,228;000000e4H

pushebx

pushesi

pushedi

leaedi,DWORDPTR[ebp-228]

movecx,57;00000039H

moveax,-858993460;ccccccccH

repstosd

;5:

;6:

shorta,b,c;

;7:

a=1;

moveax,1

movWORDPTR_a$[ebp],ax

;8:

b=a+1;

movsxeax,WORDPTR_a$[ebp]

addeax,1

movWORDPTR_b$[ebp],ax

;9:

c=a+b;

movsxeax,WORDPTR_a$[ebp]

movsxecx,WORDPTR_b$[ebp]

addeax,ecx

movWORDPTR_c$[ebp],ax

;10:

;11:

;12:

}

xoreax,eax

popedi

popesi

popebx

movesp,ebp

popebp

ret0

_mainENDP

_TEXTENDS

四.实验结果(包括必要的截图)

实验容一:

(1)转移表:

设bl=00010000b

(2)地址表:

设bl=00001000b

实验容二:

设x=5,y=2,则z=13(000D),结果在ax

(1)堆栈传递参数(结果在bx中查看)

 

(2)寄存器传递参数(结果在ax中查看)

(3)存传递参数(结果在ax中查看)

五、实验体会

通过本实验,让我更加深入了解地址表和转移表、子程序和从C输出汇编文件等知识,通过实现地址表与转移表加深了对汇编寻址方式的了解;实现子程序,掌握主程序如何调用子程序,及子程序与主程序之间的参数传递方式;用VS实现C->ASM后,对C或C++有了新的认识。

实验四汇编语言高级编程专题

一.实验目的

1、汇编语言宏程序设计;

2、掌握中断服务子程序的编写。

3、汇编语言与高级语言的混编。

二.实验容

1、编写一个宏,求三个数的最小数,原型为:

MIN3x,y,z,min

2、挂接1CH中断,正计时60秒后退出。

要求屏幕显示0-59的秒数。

3、VC++中编写联汇编,将字节数组的每个元素高低四位互换。

chardbyte[]={0x34,0x45,0x56,0x67,0xaf};

三.实验过程和程序

1.编写一个宏,求三个数的最小数,原型为:

MIN3x,y,z,min

min3macrox,y,z,min

movax,x

cmpax,y

jbenext

movax,y

cmpax,z

jbedone

next:

cmpax,z

jbedone

done:

movmin,ax

endm

DATASSEGMENT

xdw2

ydw4

zdw3

mindw?

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

min3x,y,z,min

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

2、挂接1CH中断,正计时60秒后退出。

要求屏幕显示0-59的秒数。

INTNOEQU1CH

DATASEGMENT

OLDISRDW?

?

TIMERDB100

COUNTERDW0

ISDONEDB0

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVAX,0

MOVES,AX

xorcx,cx

;PROTECT

MOVAX,ES:

[INTNO*4]

MOVOLDISR[0],AX

MOVAX,ES:

[INTNO*4+2]

MOVOLDISR[2],AX

;SETNEWISR

MOVWORDPTRES:

[INTNO*4],OFFSETISR

MOVWORDPTRES:

[INTNO*4+2],SEGISR

;WAITHERE

WAITHERE:

CMPISDONE,1

JNZWAITHERE

EXIT:

;RESTORE

MOVAX,OLDISR[0]

MOVES:

[INTNO*4],AX

MOVAX,OLDISR[2]

MOVES:

[INTNO*4+2],AX

MOVAX,4C00H

INT21H

ISRPROCFAR

PUSHDX

PUSHAX

MOVAX,DATA

MOVDS,AX

STI;便于中断嵌套

INCTIMER

;--------判断是否输入a-----------

movah,0bh

int21h

oral,al

jznext

MOVAH,8;不显示输入的字符

INT21H

CMPAL,'a'

JNEnext

MOVAH,2;换行

MOVDL,10

INT21H

;MOVCOUNTER,0;从起一行计时时从0开始计时,注释掉则从起一行继续旧时间计时

next:

CMPTIMER,1000/55

JBDONE

MOVTIMER,0

MOVAH,2

MOVDL,13

INT21H

;-------printtime---------

MOVAX,COUNTER

MOVDL,10

DIVDL

MOVDH,AH

MOVDL,AL

MOVAH,2

ADDDL,30H

INT21H

movah,2

movdl,dh

ADDDL,30H

INT21H

incCOUNTER

cmpCOUNTER,60

JNEDONE

MOVISDONE,1

DONE:

PUSHF

CALLDWORDPTROLDISR

CLI

POPAX

POPDX

IRET;中断返回

ISRENDP

CODEENDS

ENDSTART

3、VC++中编写联汇编,将字节数组的每个元素高低四位互换。

chardbyte[]={0x34,0x45,0x56,0x67,0xaf};

#include

unsignedcharchange(unsignedcharx)

{

unsignedchara

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

当前位置:首页 > IT计算机 > 计算机软件及应用

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

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