计算机组成原理与汇编实验报告.docx

上传人:b****9 文档编号:26207183 上传时间:2023-06-17 格式:DOCX 页数:27 大小:539KB
下载 相关 举报
计算机组成原理与汇编实验报告.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

计算机组成原理与汇编实验报告

计算机组成原理与汇编实验报告

 

学院:

 信息科学与工程学院

专业班级:

 物联网工程1202班 

指导老师:

   贺建飚

学号:

  0909123006

姓名:

   胡松

 

实验一:

二进制转十六进制

一、实验原理:

在源程序中设置数据段、堆栈段及代码段,在数据段中定义八个字节数据,把这些数据转换成16进制数的ASCll码存在上述数据之后,然后在屏幕上显示这些数据。

二、实验目的

1.掌握86系列汇编语言及指令的格式和寻址方式

2.掌握86系列汇编语言各类指令的用法。

3.掌握简单程序、分支程序、循环程序、子程序等的设计方法。

三、实验内容

流程图:

NAMEEX1;程序命名伪指令,程序名为EX1

PAGE50,70;表示占了50行,70列

DATSEGMENTPARA'DAT';数据段定义伪指令

A1DB12H,34H,56H,78H,9AH

DB0BCH,0DEH,0F0H

B1=$-A1;赋值伪指令,求A1(符号地址)到当前汇编地址($)的字节数

B2=B1*2;求2倍的B1

A2DBB2DUP(?

);数据重复定义伪指令,定义ASCII码字符区

DATENDS

STACSEGMENTPARASTACK'STA';定义堆栈段

STA1DW100DUP(?

STACENDS

CODESEGMENTPARA'CODE'

ASSUMECS:

CODE,DS:

DAT,SS:

STAC,ES:

DAT

STARPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DAT

MOVDS,AX

MOVES,AX

LEASI,A1;把A1首地址赋给SI

LEADI,A2;转化后用来放结果

MOVCX,B1

G1:

MOVBL,2

MOVAL,[SI];把八位的数据赋给AL,准备转化

MOVBH,AL;把AL中的数据暂存于BH中

PUSHCX;保护CX中的数据

MOVCL,4;指出移位的位数为4

RORAL,CL;循环右移四位

POPCX;把CX弹出堆栈

G2:

ANDAL,0FH;把AL中的数据和0FH“与”,得到高四位

DAA;对AL两位十进制数做(BCD)调整

ADDAL,0F0H

ADCAL,40H

MOV[DI],AL;存ASCII码

INCDI;修改地址加一

MOVAL,BH

DECBL

JNZG2

INCSI;指向下一个数

LOOPG1

MOVSI,OFFSETA2;A2的偏移地址送给SI寄存器

MOVCX,B2

CALLP1

RET;子程序返回

STARENDP

P1PROC

MOVBL,2

G:

MOVDL,[SI]

MOVAH,2

INT21H

INCSI;指向下一个要显示的数

DECBL

JNZT;连续显示两个数,未完继续

MOVDL,''

MOVAH,2

INT21H

MOVBL,2

T:

LOOPG

RET

P1ENDP

CODEENDS

ENDSTAR

四、实验结果

五、实验心得

读了这个程序之后发现,想要真正理解一个程序都是需要掌握众多助记符的用法以及它的意思,只有了解并明白了这些之后才可以分析程序或者是编写简单的小程序

实验二:

起泡排序算法

二、实验原理:

在源程序中设置数据段、堆栈段及代码段,在数据段中定义八个字节数据,把这些数据转换成16进制数的ASCll码存在上述数据之后,然后在屏幕上显示这些数据。

二、实验目的

1.掌握循环程序的设计方法;

2.了解循环结构在程序中的重要作用起泡排序程序。

三、实验内容

流程图:

STACKSGSEGMENT

STACK'S'

DW64DUP('ST')

STACKSGENDS

DATASEGMENT

ARYDW5,7,1,4,3,6,9,8,2;数组,流程图中为A

CTEQU($-ARY)/2;元素个数

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACKSG

MAINPROCFAR

MOVAX,DATA

MOVDS,AX

MOVDI,CT-1;初始化外循环次数

LOP1:

MOVCX,DI;置内循环次数

MOVBX,0;置地址指针

LOP2:

MOVAX,ARY[BX]

CMPAX,ARY[BX+2];两数比较

JGECONT;次序正确转

XCHGAX,ARY[BX+2];次序不正确互换位置

MOVARY[BX],AX

CONT:

ADDBX,2;修改地址指针

LOOPLOP2;内循环控制

DECDI;修改外循环次数

JNZLOP1;外循环控制

MOVAX,4C00H

INT21H

MAINENDP

CODEENDS

ENDMAIN

四、实验结果

五、实验心得

1.在进行循环程序设计时,要注意循环初始化、内外层循环的控制、循环结束条件等的设置,对整个程序的执行逻辑要非常清楚,这样可以避免死循环等意外情况的出现。

2.当要观察排序结果时,可利用D命令,显示数据段的内容,检查程序是否正常运行

实验三:

查找匹配字符串

一、实验原理:

字符串的匹配进行应选用repz cmpsb操作,匹配一次过程后去判断关键字的指针移动的步数是不是和关键字长度相同,如果相同说明匹配成功,调用进制转化函数将结果输出即可,如果句子的指针移动到最后也没有使关键字的指针移动到它的结尾说明不能匹配。

二、实验目的

练习字符串的匹配程序设计。

三、实验内容

流程图如下:

源程序:

datareasegment

keyadrlabelbyte

keymaxdb20keyactdb?

keystringdb20dup(?

senadrlabelbyte

senmaxdb50

senactdb?

secstringdb50dup(?

messkeydb'Enterkeyword:

','$'

messsendb0dh,0ah,'EnterSentence:

','$'

nomatchdb0dh,0ah,'Nomatch.','$'

matchdb0dh,0ah,'Matchatlocation:

','$'

restdb'Hofthesentence.','$'

datareaends

;********************************************************

prognamsegment

mainprocfar

assumecs:

prognam,ds:

datarea,es:

datarea

start:

pushds

xorax,ax

pushax

movax,datarea

movds,ax

moves,ax

leadx,messkey

movah,09h

int21h

leadx,keyadr

movah,0ah

int21h

leadx,messsen

movah,09h

int21h

leadx,senadr

movah,0ah

int21h

moval,senact

subal,keyact

jlnmatch

callsearch

jmpshorte0

nmatch:

leadx,nomatch

movah,09h

int21h

e0:

ret

mainendp

;-------------------------------------------------------

searchprocnear

xorcx,cx;markoffcounter

movdx,offsetsenadr

adddl,senact

incdl

movcl,keyact

cld

leadi,secstring

r0:

leasi,keystring

repzcmpsb

moval,byteptr[si-1]

cmpal,byteptr[di-1]jnznext

subsi,offsetkeystring

movax,si

cmpal,keyact

jeshowpnext:

movcl,keyact

cmpdi,dx

jnzr0

shown:

leadx,nomatch

movah,09h

int21h

jmpshorte1

showp:

leadx,match

movah,09hint21h

decdi

movbx,di

xorax,ax

moval,keyact

subbx,ax

movax,offsetsenadr

subbx,ax

callbinihex

leadx,rest

movah,09h

int21h

e1:

ret

searchendp

binihexprocnear

movch,4

r1:

movcl,4

rolbx,cl

movdl,bl

anddl,0fh

adddl,30h

cmpdl,39h

jledisp

adddl,07h

disp:

movah,02h

int21h

decch

jnzr1

ret

binihexendp

;-------------------------------------------------------

prognamends

;********************************************************

endmain

四、实验结果

五、实验心得

与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。

此外应该注意单个字符时的“边缘”情况因为,这是指针的移动和关键字的长度是一致的,但是这并不意味着,两个字符串匹配。

实验四:

求Fibonacci递归数

一、实验原理:

Fibonacci数的定义如下:

              

FIB

(1)=1

 FIB

(2)=1 

             FIB(N)=FIB(N-2)+FIB(N-1)   N>=3 

程序接收用户输入的1小于等于50的十进制正整数,存入输入缓冲区后再把它转化为十六进制数,存入内存单元N中。

调用FIB函数求Fibonacci数,结果高位存在RESULT2H,低位存在RESULT2L,最后调用OUTPUT函数将结果以十进制的形式显示出来。

程序亮点在于将结果转换为十进制时采用了除10取余的方法,对于高位通过在适当的位数加65536(ADD65536)的方式巧妙地将乘法转化为加法。

二、实验目的

进一步掌握子程序的设计方法,熟悉递归程序的设计

三、实验内容 

流程图:

DATASSEGMENT

STR1DB'Pleaseinputanumber(1-50):

N=','$'

STR2DB13,10,'FIB(N)=','$'

WRONGSTRDB13,10,13,10,'Anumberbetween1and50please!

',13,10,13,10,'$'

INPUTBUFFERDB3,?

3DUP(?

NDW?

;输入N值

RESULT1HDW0

RESULT1LDW0

RESULT2HDW0;结果的高16位

RESULT2LDW0;结果的低16位

C10DW10

OUTPUTBUFFERDB11DUP('0')

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

CALLINPUT

CALLFIB

CALLOUTPUT

JMPQUIT

;**********************************************

INPUTPROC

JMPT1

WRONG:

LEADX,WRONGSTR

MOVAH,9

INT21H

T1:

LEADX,STR1

MOVAH,9

INT21H

LEADX,INPUTBUFFER

MOVAH,10

INT21H

MOVAX,0

MOVCL,INPUTBUFFER+1

MOVCH,0

LEABX,INPUTBUFFER+2

T2:

MULC10

MOVDL,[BX]

CMPDL,'0'

JBWRONG

CMPDL,'9'

JAWRONG

ANDDL,0FH

ADDAL,DL

ADCAH,0

INCBX

LOOPT2

CMPAX,0032H

JAWRONG

CMPAX,1

JBWRONG

MOVN,AX

RET

INPUTENDP

;*******************************************

FIBPROC

CMPN,1

JZL1

CMPN,2

JL2

DECN

CALLFIB

MOVAX,RESULT2L

MOVDX,RESULT2H

MOVCX,RESULT1L

ADDRESULT2L,CX

MOVCX,RESULT1H

ADCRESULT2H,CX

MOVRESULT1L,AX

MOVRESULT1H,DX

JMPEXIT

L1:

MOVRESULT1L,1

MOVRESULT2L,1

JMPEXIT

L2:

MOVRESULT2L,1

DECN

CALLFIB

EXIT:

RET

FIBENDP

;**************************************************

OUTPUTPROC

MOVAX,RESULT2L

LEASI,OUTPUTBUFFER

MOVCX,5

R1:

MOVDX,0;低位加入OUTPUTBUFFER

DIVC10

INCSI

ADD[SI],DL

LOOPR1

;*************************

MOVAX,RESULT2H

LEASI,OUTPUTBUFFER

MOVCX,5

R2:

MOVDX,0

DIVC10

INCSI

PUSHCX;高位加入OUTPUTBUFFER

CMPDX,0

JENOADD

MOVCX,DX

ADDN:

CALLADD65536

LOOPADDN

NOADD:

POPCX

LOOPR2

;**********************

LEADX,STR2

MOVAH,9

INT21H

LEASI,OUTPUTBUFFER

MOVBX,10

R3:

CMPBYTEPTR[SI+BX],'0'

JAPRINT

DECBX;显示十进制结果

JMPR3

PRINT:

MOVDL,[SI+BX]

MOVAH,2

INT21H

DECBX

CMPBX,1

JAEPRINT

RET

OUTPUTENDP

;******************************************************

ADD65536PROC;高位算法

ADDBYTEPTR[SI],6

MOVDL,0

CMPBYTEPTR[SI],3AH

JBA1

SUBBYTEPTR[SI],10

MOVDL,1

A1:

ADDBYTEPTR[SI+1],3

ADDBYTEPTR[SI+1],DL

MOVDL,0

CMPBYTEPTR[SI+1],3AH

JBA2

SUBBYTEPTR[SI+1],10

MOVDL,1

A2:

ADDBYTEPTR[SI+2],5

ADDBYTEPTR[SI+2],DL

MOVDL,0

CMPBYTEPTR[SI+2],3AH

JBA3

SUBBYTEPTR[SI+2],10

MOVDL,1

A3:

ADDBYTEPTR[SI+3],5

ADDBYTEPTR[SI+3],DL

MOVDL,0

CMPBYTEPTR[SI+3],3AH

JBA4

SUBBYTEPTR[SI+3],10

MOVDL,1

A4:

ADDBYTEPTR[SI+4],6

ADDBYTEPTR[SI+4],DL

MOVDL,0

CMPBYTEPTR[SI+4],3AH

JBA0

SUBBYTEPTR[SI+4],10

MOVDL,1

A5:

ADDBYTEPTR[SI+5],DL

MOVDL,0

CMPBYTEPTR[SI+5],3AH

JBA3

SUBBYTEPTR[SI+5],10

MOVDL,1

A6:

ADDBYTEPTR[SI+6],DL

MOVDL,0

CMPBYTEPTR[SI+6],3AH

JBA0

SUBBYTEPTR[SI+6],10

MOVDL,1

A7:

ADDBYTEPTR[SI+7],DL

MOVDL,0

CMPBYTEPTR[SI+7],3AH

JBA0

SUBBYTEPTR[SI+7],10

MOVDL,1

A8:

ADDBYTEPTR[SI+8],DL

MOVDL,0

CMPBYTEPTR[SI+8],3AH

JBA0

SUBBYTEPTR[SI+8],10

MOVDL,1

A9:

ADDBYTEPTR[SI+9],DL

A0:

RET

ADD65536ENDP

;**********************

QUIT:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

四、实验结果

五、实验心得

本实验使我进一步掌握子程序的设计方法,熟悉递归程序的设计,丰富了我写汇编程序的经验。

实验五:

分类统计字符个数

一、实验原理:

在下面的程序中,以读到的字符的ASCII码是否为0作为字符串末尾的标志;而进行三个逻辑判断(即数字字符判,大写字母字符判断和小写字母字符判)对相应字符的个数进行统计。

二、实验目的

通过分支程序设计实现字母、数字及其它字符的分类统计计

数。

三、实验内容

DATAS SEGMENT 

STRING1 DB'Please input a string:

$' ;输入提示信息 

STRING2 DB'Number of chars:

$    ';各类字符提示信息     

STRING3 DB'Number of digits:

$'     

STRING4 DB'Number of others:

$'     

CHARS DB 0  ;字母     

DIGIT DB 0   ;数字     

OTHERS DB 0 其他 

DATAS ENDS  

STACKS SEGMENT 

    ;此处输入堆栈段代码 

STACKS ENDS  

CODES SEGMENT

ASSUME CS:

CODES,DS:

DATAS,SS:

STACKS 

START:

 

MOV AX,DATAS  

MOV DS,AX 

LEA DX,STRING1     ;显示输入提示信息Please input a string  

MOV AH,09H 

INT 21H 

MOV CX,100         ;设置循环次数足够大  

L1:

MOV AH,01H         ;中断调用,单字符输入 

INT 21H             ;输入符号的ASCII代码在AL寄存器中         

CMP AL,0DH         ;若输入回车符则结束     

JZ OVER2   

CMP AL,30H         ;若<30H(0),OTHERS++     

JB OTHER 

CMP AL,39H         ;若>39H(9),跳转进一步比较     

JA HIGHER1 

JMP DIGITAL        ;DIGIT++   

   

HIGHER1:

CMP AL,41H    ;若IF<41H(A),OTHERS++         

JB OTHER   

CMP AL,5AH    ;若IF>5AH(Z),跳转继续比较         JA HIGHER2 

JMP CHAR      ;ALPHAU++      

HIGHER2:

CMP AL,61H    ;若IF<61H(a),OTHERS++         

JB OTHER 

CMP AL,7AH    ;若IF>7AH(z),OTHERS++         

JA OTHER 

JMP CHAR      ;ALPHAU++         

JMP OVER      ;比较结束   

OTHER:

  

INC OTHERS    ;OTHERS++         

JMP OVER       ;比较结束 

CHAR:

   

INC CHARS     ;ALPHAL++         

JMP OVER       ;比较结束 

DIGITAL:

INC DIGIT        ;DIGIT++         

JMP OVER        ;比较结束 

JMP OVER            ;比较结束         

OVER:

NOP  

LOOP L1             

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

当前位置:首页 > 工程科技 > 机械仪表

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

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