中南大学 汇编语言实验报告

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

学生姓名 学 号 专业班级

指导教师 贺建飚

学 院 信息科学与工程学院

完成时间 2014年6月

实验一 二进制转十六进制

一、实验目的

(1) 掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4) 学会针对不同的问题,选用不同的组织循环的方法。

二、实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

三、实验内容

掌握循环排序算法的思想:

二进制到十六进制转换程序

实验代码如下:

assume cs:code

code segment

main proc far

start: mov bx,[**************]0b ;待转换成十六进制的二进制数 mov ch,4 ;设置循环次数

rotate: mov cl,4 ;设置循环左移的位数

rol bx,cl ;将bx中的每位依次循环左移4位,

;每左移一次,把最高位同时移入CF和操作数最低位

mov al,bl

and al,0fh ;将al高4位清0,保留从rol循环移位到al低四位的值

add al,30h ;将4位二进制数转换成对应的ASCII码

cmp al,3ah ;判定4位二进制数是否大于9

jl print

add al,7h

print: mov dl,al ;调用中断程序输出单个字符

mov ah,2

int 21h

dec ch ;继续循环,直到循环4次为止

jnz rotate

main endp

mov ax,4c00h

int 21h

code ends

end

四、实验结果

DEBUG调试如下:

五、实验心得

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

实验二 起泡排序算法的程序实现

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4)学会针对不同的问题,选用不同的组织循环的方法。

二、实验原理

循环结构分DO_WHILE和DO_UNTIL两种,无论使用哪种循环结构,循环程序一般应包括以下几部分:

① 循环初始化。它包括设置循环次数的初始值、地址指针的初始设置等。

② 循环体。这是循环工作的主体,包括要重复执行的操作,以及循环的修改部分。修改部分包括地址指针的修改、循环控制条件的修改等。

③ 循环控制部分。它是控制循环的关键,判断循环条件满足与否。

特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。否则会得不到期望的结果。

三、实验内容

掌握循环排序算法的思想:

起泡排序算法的程序实现

实验代码如下:

DATAS SEGMENT

BUFFER DB 100 DUP(?)

X DB 5 DUP(?)

STRING1 DB "PLEASE INPUT DATAS:","$"

STRING2 DB "AFTER SORT IS:","$"

SHIFT DB 13,10,'$'

SPACE DB 20H,'$'

DATAS ENDS

STACKS SEGMENT

DB 256 DUP(?)

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV ES,AX

MOV AX,STACKS

LEA SI,BUFFER

MOV CX,0

LEA DX,STRING1

MOV AH,09H

INT 21H

L1:

MOV AH,01H ;/////////////////键盘输入转成数

INT 21H

CMP AL,0DH

JE L2

CMP AL,20H

JE L3

XOR AH,AH

SUB AX,30H

XCHG AX,BX

MOV DX,10

MUL DX

ADD BX,AX

JMP L1

L3:

INC CX

MOV [SI],BL

ADD SI,1

XOR BX,BX

JMP L1

L2:

LEA DX,SHIFT

MOV AH,09H

INT 21H

MOV [SI],BL

LEA DI,X

MOV [DI],CL

LABLE2:

LEA SI,BUFFER

PUSH CX

LABLE:

MOV AL,[SI]

CMP AL,[SI+1]

JBE L4

XCHG AL,[SI+1]

MOV [SI],AL

L4:

ADD SI,1 ;跳到回车处理 ;空格处理 ;/////////////存储到buffer中;///////// 排序算法

POP CX

LOOP LABLE2

LEA DX,STRING2

MOV AH,09H

INT 21H

LEA DI,BUFFER

L7:

MOV CX,2

MOV BH,[DI]

L6:

PUSH CX

MOV CL,4

ROL BX,CL

MOV DL,BL

AND DL,0FH

CMP DL,9

JBE L5

ADD DL,7

L5:

ADD DL,30H

MOV AH,02H

INT 21H

POP CX

LOOP L6

INC DI

LEA DX,SPACE

MOV AH,09H

INT 21H

LEA SI,X

MOV BL,[SI]

CMP BL,0

DEC BL

LEA SI,X

MOV [SI],BL

JGE L7

MOV AH,4CH

INT 21H

CODES ENDS

END START

四、实验结果 ;/////////////////////显示字符

DEBUG调试如下:

五、实验心得

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

2. 多层循环的控制更为复杂,编写代码时,要注意注释重要的循环控制部分,这样思路才不会乱。同时要对照流程图,随时观察代码的逻辑思路是否正确。

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

实验三 查找匹配字符串

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4) 学会针对不同的问题,选用不同的组织循环的方法。

二、实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

三、实验内容

掌握循环排序算法的思想:

查找匹配字符串:程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

实验代码如下:

DATA SEGMENT

mess1 DB 'Enter keyword:','$'

mess2 DB 'Enter Sentence:','$'

mess3 DB 'Match at location:','$'

mess4 DB 'NOT MATCH.',13,10,'$'

mess5 DB 'H of the sentence',13,10,'$'

change DB 13,10,'$'

stoknin1 label byte

max1 db 10

act1 db ?

stokn1 db 10 dup(?)

stoknin2 label byte

max2 db 50

act2 db ?

stokn2 db 50 dup(?)

DATA ENDS

STACKS SEGMENT

;此处输入堆栈段代码

STACKS ENDS

CODE SEGMENT

;*************************************代码段

main proc far

assume cs:code,ds:data,es:data

START:

push ds

sub AX,AX

sub BX,BX

sub DI,DI

sub SI,SI

push AX ;为返回dos并清空后面要用到的寄存器

MOV AX,DATA

MOV DS,AX

LEA DX,mess1

MOV ah,09

INT 21h ;输出Enter keyword

LEA DX,stoknin1

MOV ah,0ah ;用21号中段的0ah号功能获取关键字

INT 21h

cmp act1,0

je exit ;如果为空直接退出程序

a10:

;********************************输入Sentence并判断

LEA DX,change

MOV ah,09

INT 21h ;输出回程,换行

LEA DX,mess2

MOV ah,09

INT 21h ;输出Enter Sentence:

LEA DX,stoknin2

MOV ah,0ah

INT 21h ;用21号中段的0ah号功能获取句子

MOV AL,act1

CBW

MOV CX,AX ;保存关键字长度到cx

PUSH CX ;cx入栈

MOV AL,act2

cmp AL,0

je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1

js a50 ;若句子长度小于关键字长度,则跳转显示not match INC AL

CBW

LEA BX,stokn2 ;将句子的首地址放进BX

MOV DI,0

MOV SI,0

a20:

;****************************************比较,内循环

MOV AH,[BX+DI]

CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30

jne a30

INC DI

INC SI

DEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完

CMP CX,0

je a40

jmp a20

a30:

;*****************************************外循环,BX+1,清空si,di继续内循环比较 INC BX

DEC AL

cmp AL,0

je a50

MOV DI,0

MOV SI,0

POP CX

push CX

jmp a20

a40:

;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出

SUB BX,offset stokn2

INC BX

LEA DX,change

MOV ah,09

INT 21h

LEA DX,mess3

MOV ah,09

INT 21h

CALL btoh

LEA DX,mess5

MOV ah,09

INT 21h

jmp a10

;****************************************二进制转换十六进制

btoh PROC NEAR

MOV CH,4

rotate: MOV CL,4

ROL BX,CL

MOV AL,BL

and AL,0fh

add AL,30h

cmp al,3ah

jl printit

add al,7h

printit:

MOV dl,al

MOV ah,2

int 21h

dec ch

jnz rotate

ret

btoh endp

a50:

;*****************************************显示not match

LEA DX,change

MOV ah,09

INT 21h

LEA DX,mess4

MOV ah,09

INT 21h

jmp a10

exit:

ret

main endp

CODE ENDS

END

四、实验结果

五、实验心得

与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。此外应该注意单个字符时的“边缘”情况,因为这时指针的移动和关键字的长度是一致的,但是这并不意味着,两个字符串匹配。

实验四 求Fibonacci递归数

一、实验目的:

掌握子程序的设计方法,熟悉递归程序的设计。

二、实验要求:

掌握递归程序的调用、返回及入口、出口的传递方法。

三、实验内容

程序接受由用户键入的数N,根据给定的N值,计算Fibonacci数。

Fibonacci数的公式如下:

Fib(1)=1;当n=1

Fib(2)=1;当n=2

Fib(n)=Fib(n-1)+Fib(n-2)

实验代码如下:

DATAS SEGMENT

;此处输入数据段代码

RESULT DB 1D,24 DUP(0)

X DB 1D,24 DUP(0)

MESS1 DB 0DH,0AH,'Please input a data :','$'

MESS2 DB 0DH,0AH,'The result is:','$'

MESS3 DB 0DH,0AH,'Input Q/q to quit.','$'

MESS4 DB 0DH,0AH,'====================== ','$'

FLAG DW 0DH

MESSERROR DB 0DH,0AH,'Input error,please re-enter.','$'

QUIT DB 0DH,0AH,'You have typed Q/q to exit.','$'

DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码

DW 128 DUP(?)

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV ES,AX

MOV AX,STACKS

MOV SS,AX

;此处输入代码段代码

REINPUT:

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

PUSH DI

MOV AH,09

LEA DX,MESS4

INT 21H

LEA DX,MESS3

INT 21H

LEA DX,MESS1

INT 21H

MOV BX,0

INPUT:

MOV AH,01

INT 21H

CMP AL,'q';

JZ END_

CMP AL,'Q';

JZ END_

CMP AL,0DH;

JZ CONT

CMP AL,'0';

JB ERROR;

CMP AL,':'

JNB ERROR

SUB AL,30H

CBW

XCHG AX,BX

MOV CX,10D

MUL CX

XCHG AX,BX

ADD BX,AX

JMP INPUT

ERROR:;

MOV AH,09

LEA DX,MESSERROR

INT 21H

JMP REINPUT

END_:

MOV AH,09

LEA DX,QUIT

INT 21H

INT 21H

RET

CONT:MOV CX,BX;

CMP CX,2

JLE PRINT;

SUB CX,2;

NEXT:MOV DI,CX

MOV CX,25

MOV SI,0

ADDE:MOV DL,X[SI]

MOV DH,RESULT[SI]

ADD DL,DH;

MOV RESULT[SI],DL

MOV X[SI],DH;

CMP DL,10D

JAE GREAT;

INC SI

JMP GOON

GREAT:SUB RESULT[SI],10D;

INC SI

ADD X[SI],1;

GOON:LOOP ADDE

MOV CX,DI

LOOP NEXT

PRINT:LEA DX,MESS2

MOV AH,09

INT 21H

MOV CX,25

MOV SI,24

DISPLAY1:

CMP FLAG,0;

JNZ N2

CMP RESULT[SI],0

JZ N3

ADD FLAG,1

N2:MOV DL,RESULT[SI];

ADD DL,30H

MOV AH,02H

INT 21H

N3:DEC SI

LOOP DISPLAY1

MOV FLAG,0

MOV RESULT[0],1D

MOV SI,1

MOV CX,24

INITIAL:MOV RESULT[SI],0

MOV X[SI],0

ADD SI,1

LOOP INITIAL

MOV SI,0

POP DI;

POP SI

POP DX

POP CX

POP BX

POP AX

JMP REINPUT;

MOV AH,4CH

INT 21H

CODES ENDS

END START

四、实验结果

五、实验心得

在程序的制作过程中,遇到了很多意想不到的困难,自己一个人解决起来有很大的困难,于是也少不了同学的帮助,深刻体会到开发程序不只是一两个人就能很好地完成的,要大家互相帮助,共同探讨问题,才能更好的解决困难。

实验五 分类统计字符个数

一、实验目的

掌握分支程序设计的原理与方法,重点掌握各种程序中形成和判断条件而产生的程序段的设计方法和技巧。

二、实验要求

掌握分支程序的调用及基本子程序的编写,判断程序运行的顺序。

三、实验内容

程序接受用户输入一行字符,并按照字符串中字符所属的类型分类,将结果输出(例如:aaabb1234&中,字母5,数字4,其他字符1)

实验代码如下:

DATAS SEGMENT

STRING1 DB 'Input Your String: $';输入提示信息

STRING2 DB 'Digit: $' ;各类字符提示信息

STRING3 DB 'UpLetter: $'

STRING4 DB 'LowLetter: $'

STRING5 DB 'Others: $'

DIGIT DB 0 ;数字

ALPHAU DB 0 ;大写字母

ALPHAL DB 0 ;小写字母

OTHERS DB 0 ;其他

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

LEA DX,STRING1 ;显示输入提示信息

MOV AH,9

INT 21H

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

L1:MOV AH,1 ;中断调用,单字符输入

INT 21H

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

JZ OVER2

CMP AL,30H

JB OTHER ;若

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

JA HIGHER1

JMP DIGITAL ;DIGIT++

HIGHER1:CMP AL,41H ;if

JB OTHER

CMP AL,5AH ;if>5AH(Z),跳转继续比较

JA HIGHER2

JMP UALPHA ;ALPHAU++

HIGHER2: CMP AL,61H ;if

JB OTHER

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

JA OTHER

JMP LALPHA ;ALPHAL++

JMP OVER ;比较结束

OTHER:INC OTHERS ;OTHERS++

JMP OVER

DIGITAL:INC DIGIT ;DIGIT++

JMP OVER

LALPHA:INC ALPHAL ;ALPHAL++

JMP OVER

UALPHA:INC ALPHAU ;ALPHAU++

JMP OVER

OVER:NOP

LOOP L1 ;循环,输入下一字符

OVER2:CALL ENDLINE ;回车换行

LEA DX,STRING2 ;输出提示信息

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,DIGIT ;将统计的数字送AX,为输出做准备

CALL DISPLAY ;调用输出两位数字的子程序

CALL ENDLINE ;下同

LEA DX,STRING3

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,ALPHAU

CALL DISPLAY

CALL ENDLINE

LEA DX,STRING4

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,ALPHAL

CALL DISPLAY

CALL ENDLINE

LEA DX,STRING5

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,OTHERS

CALL DISPLAY

MOV AH,4CH

INT 21H

ENDLINE PROC NEAR ;控制输出格式,输出回车换行子程序

MOV AH,2

MOV DL,0AH

INT 21H

MOV AH,2

MOV DL,0DH

INT 21H

RET

ENDLINE ENDP

DISPLAY PROC NEAR ;输出两位数字的子程序

MOV BL,10 ;10送BL

DIV BL ;AX/BL,AL=商,AH=余数

PUSH AX ;保存AX中的信息

MOV DL,AL

ADD DL,30H

MOV AH,2

INT 21H ;输出十位数

POP AX ;出栈送AX

MOV DL,AH

ADD DL,30H

MOV AH,2

INT 21H ;输出个位数

RET

DISPLAY ENDP

CODES ENDS

END START

四、实验结果

五、实验心得

我认为本次实验主要是要清楚各分支程序。什么时候该跳转到哪个分支,并在分支中做好各项处理工作是本次实验的重点。

并且此次实验也让我们明白了,汇编的输出都是“字符”,也就是说要想输出两位数字必须做一点处理,将它转换为相应的字符“一个一个”地输出,从而解决了实验中的疑问。 还有一点就是关于输入的问题,我采用的是单字符输入,边输入边处理。因为用字符串的话,输入之后,仍然要“一个一个”字符取出来去做判断,还不如直接就判断了。

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

学生姓名 学 号 专业班级

指导教师 贺建飚

学 院 信息科学与工程学院

完成时间 2014年6月

实验一 二进制转十六进制

一、实验目的

(1) 掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4) 学会针对不同的问题,选用不同的组织循环的方法。

二、实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

三、实验内容

掌握循环排序算法的思想:

二进制到十六进制转换程序

实验代码如下:

assume cs:code

code segment

main proc far

start: mov bx,[**************]0b ;待转换成十六进制的二进制数 mov ch,4 ;设置循环次数

rotate: mov cl,4 ;设置循环左移的位数

rol bx,cl ;将bx中的每位依次循环左移4位,

;每左移一次,把最高位同时移入CF和操作数最低位

mov al,bl

and al,0fh ;将al高4位清0,保留从rol循环移位到al低四位的值

add al,30h ;将4位二进制数转换成对应的ASCII码

cmp al,3ah ;判定4位二进制数是否大于9

jl print

add al,7h

print: mov dl,al ;调用中断程序输出单个字符

mov ah,2

int 21h

dec ch ;继续循环,直到循环4次为止

jnz rotate

main endp

mov ax,4c00h

int 21h

code ends

end

四、实验结果

DEBUG调试如下:

五、实验心得

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

实验二 起泡排序算法的程序实现

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4)学会针对不同的问题,选用不同的组织循环的方法。

二、实验原理

循环结构分DO_WHILE和DO_UNTIL两种,无论使用哪种循环结构,循环程序一般应包括以下几部分:

① 循环初始化。它包括设置循环次数的初始值、地址指针的初始设置等。

② 循环体。这是循环工作的主体,包括要重复执行的操作,以及循环的修改部分。修改部分包括地址指针的修改、循环控制条件的修改等。

③ 循环控制部分。它是控制循环的关键,判断循环条件满足与否。

特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。否则会得不到期望的结果。

三、实验内容

掌握循环排序算法的思想:

起泡排序算法的程序实现

实验代码如下:

DATAS SEGMENT

BUFFER DB 100 DUP(?)

X DB 5 DUP(?)

STRING1 DB "PLEASE INPUT DATAS:","$"

STRING2 DB "AFTER SORT IS:","$"

SHIFT DB 13,10,'$'

SPACE DB 20H,'$'

DATAS ENDS

STACKS SEGMENT

DB 256 DUP(?)

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV ES,AX

MOV AX,STACKS

LEA SI,BUFFER

MOV CX,0

LEA DX,STRING1

MOV AH,09H

INT 21H

L1:

MOV AH,01H ;/////////////////键盘输入转成数

INT 21H

CMP AL,0DH

JE L2

CMP AL,20H

JE L3

XOR AH,AH

SUB AX,30H

XCHG AX,BX

MOV DX,10

MUL DX

ADD BX,AX

JMP L1

L3:

INC CX

MOV [SI],BL

ADD SI,1

XOR BX,BX

JMP L1

L2:

LEA DX,SHIFT

MOV AH,09H

INT 21H

MOV [SI],BL

LEA DI,X

MOV [DI],CL

LABLE2:

LEA SI,BUFFER

PUSH CX

LABLE:

MOV AL,[SI]

CMP AL,[SI+1]

JBE L4

XCHG AL,[SI+1]

MOV [SI],AL

L4:

ADD SI,1 ;跳到回车处理 ;空格处理 ;/////////////存储到buffer中;///////// 排序算法

POP CX

LOOP LABLE2

LEA DX,STRING2

MOV AH,09H

INT 21H

LEA DI,BUFFER

L7:

MOV CX,2

MOV BH,[DI]

L6:

PUSH CX

MOV CL,4

ROL BX,CL

MOV DL,BL

AND DL,0FH

CMP DL,9

JBE L5

ADD DL,7

L5:

ADD DL,30H

MOV AH,02H

INT 21H

POP CX

LOOP L6

INC DI

LEA DX,SPACE

MOV AH,09H

INT 21H

LEA SI,X

MOV BL,[SI]

CMP BL,0

DEC BL

LEA SI,X

MOV [SI],BL

JGE L7

MOV AH,4CH

INT 21H

CODES ENDS

END START

四、实验结果 ;/////////////////////显示字符

DEBUG调试如下:

五、实验心得

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

2. 多层循环的控制更为复杂,编写代码时,要注意注释重要的循环控制部分,这样思路才不会乱。同时要对照流程图,随时观察代码的逻辑思路是否正确。

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

实验三 查找匹配字符串

一、实验目的

(1)掌握循环程序的设计方法。

(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

(4) 学会针对不同的问题,选用不同的组织循环的方法。

二、实验要求

掌握循环程序的过程和汇编实现原理,进一步熟练掌握DEBUG操作指令以及汇编语言源程序的编辑、汇编、连接及调试过程。

三、实验内容

掌握循环排序算法的思想:

查找匹配字符串:程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

实验代码如下:

DATA SEGMENT

mess1 DB 'Enter keyword:','$'

mess2 DB 'Enter Sentence:','$'

mess3 DB 'Match at location:','$'

mess4 DB 'NOT MATCH.',13,10,'$'

mess5 DB 'H of the sentence',13,10,'$'

change DB 13,10,'$'

stoknin1 label byte

max1 db 10

act1 db ?

stokn1 db 10 dup(?)

stoknin2 label byte

max2 db 50

act2 db ?

stokn2 db 50 dup(?)

DATA ENDS

STACKS SEGMENT

;此处输入堆栈段代码

STACKS ENDS

CODE SEGMENT

;*************************************代码段

main proc far

assume cs:code,ds:data,es:data

START:

push ds

sub AX,AX

sub BX,BX

sub DI,DI

sub SI,SI

push AX ;为返回dos并清空后面要用到的寄存器

MOV AX,DATA

MOV DS,AX

LEA DX,mess1

MOV ah,09

INT 21h ;输出Enter keyword

LEA DX,stoknin1

MOV ah,0ah ;用21号中段的0ah号功能获取关键字

INT 21h

cmp act1,0

je exit ;如果为空直接退出程序

a10:

;********************************输入Sentence并判断

LEA DX,change

MOV ah,09

INT 21h ;输出回程,换行

LEA DX,mess2

MOV ah,09

INT 21h ;输出Enter Sentence:

LEA DX,stoknin2

MOV ah,0ah

INT 21h ;用21号中段的0ah号功能获取句子

MOV AL,act1

CBW

MOV CX,AX ;保存关键字长度到cx

PUSH CX ;cx入栈

MOV AL,act2

cmp AL,0

je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1

js a50 ;若句子长度小于关键字长度,则跳转显示not match INC AL

CBW

LEA BX,stokn2 ;将句子的首地址放进BX

MOV DI,0

MOV SI,0

a20:

;****************************************比较,内循环

MOV AH,[BX+DI]

CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30

jne a30

INC DI

INC SI

DEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完

CMP CX,0

je a40

jmp a20

a30:

;*****************************************外循环,BX+1,清空si,di继续内循环比较 INC BX

DEC AL

cmp AL,0

je a50

MOV DI,0

MOV SI,0

POP CX

push CX

jmp a20

a40:

;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出

SUB BX,offset stokn2

INC BX

LEA DX,change

MOV ah,09

INT 21h

LEA DX,mess3

MOV ah,09

INT 21h

CALL btoh

LEA DX,mess5

MOV ah,09

INT 21h

jmp a10

;****************************************二进制转换十六进制

btoh PROC NEAR

MOV CH,4

rotate: MOV CL,4

ROL BX,CL

MOV AL,BL

and AL,0fh

add AL,30h

cmp al,3ah

jl printit

add al,7h

printit:

MOV dl,al

MOV ah,2

int 21h

dec ch

jnz rotate

ret

btoh endp

a50:

;*****************************************显示not match

LEA DX,change

MOV ah,09

INT 21h

LEA DX,mess4

MOV ah,09

INT 21h

jmp a10

exit:

ret

main endp

CODE ENDS

END

四、实验结果

五、实验心得

与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。此外应该注意单个字符时的“边缘”情况,因为这时指针的移动和关键字的长度是一致的,但是这并不意味着,两个字符串匹配。

实验四 求Fibonacci递归数

一、实验目的:

掌握子程序的设计方法,熟悉递归程序的设计。

二、实验要求:

掌握递归程序的调用、返回及入口、出口的传递方法。

三、实验内容

程序接受由用户键入的数N,根据给定的N值,计算Fibonacci数。

Fibonacci数的公式如下:

Fib(1)=1;当n=1

Fib(2)=1;当n=2

Fib(n)=Fib(n-1)+Fib(n-2)

实验代码如下:

DATAS SEGMENT

;此处输入数据段代码

RESULT DB 1D,24 DUP(0)

X DB 1D,24 DUP(0)

MESS1 DB 0DH,0AH,'Please input a data :','$'

MESS2 DB 0DH,0AH,'The result is:','$'

MESS3 DB 0DH,0AH,'Input Q/q to quit.','$'

MESS4 DB 0DH,0AH,'====================== ','$'

FLAG DW 0DH

MESSERROR DB 0DH,0AH,'Input error,please re-enter.','$'

QUIT DB 0DH,0AH,'You have typed Q/q to exit.','$'

DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码

DW 128 DUP(?)

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV ES,AX

MOV AX,STACKS

MOV SS,AX

;此处输入代码段代码

REINPUT:

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

PUSH DI

MOV AH,09

LEA DX,MESS4

INT 21H

LEA DX,MESS3

INT 21H

LEA DX,MESS1

INT 21H

MOV BX,0

INPUT:

MOV AH,01

INT 21H

CMP AL,'q';

JZ END_

CMP AL,'Q';

JZ END_

CMP AL,0DH;

JZ CONT

CMP AL,'0';

JB ERROR;

CMP AL,':'

JNB ERROR

SUB AL,30H

CBW

XCHG AX,BX

MOV CX,10D

MUL CX

XCHG AX,BX

ADD BX,AX

JMP INPUT

ERROR:;

MOV AH,09

LEA DX,MESSERROR

INT 21H

JMP REINPUT

END_:

MOV AH,09

LEA DX,QUIT

INT 21H

INT 21H

RET

CONT:MOV CX,BX;

CMP CX,2

JLE PRINT;

SUB CX,2;

NEXT:MOV DI,CX

MOV CX,25

MOV SI,0

ADDE:MOV DL,X[SI]

MOV DH,RESULT[SI]

ADD DL,DH;

MOV RESULT[SI],DL

MOV X[SI],DH;

CMP DL,10D

JAE GREAT;

INC SI

JMP GOON

GREAT:SUB RESULT[SI],10D;

INC SI

ADD X[SI],1;

GOON:LOOP ADDE

MOV CX,DI

LOOP NEXT

PRINT:LEA DX,MESS2

MOV AH,09

INT 21H

MOV CX,25

MOV SI,24

DISPLAY1:

CMP FLAG,0;

JNZ N2

CMP RESULT[SI],0

JZ N3

ADD FLAG,1

N2:MOV DL,RESULT[SI];

ADD DL,30H

MOV AH,02H

INT 21H

N3:DEC SI

LOOP DISPLAY1

MOV FLAG,0

MOV RESULT[0],1D

MOV SI,1

MOV CX,24

INITIAL:MOV RESULT[SI],0

MOV X[SI],0

ADD SI,1

LOOP INITIAL

MOV SI,0

POP DI;

POP SI

POP DX

POP CX

POP BX

POP AX

JMP REINPUT;

MOV AH,4CH

INT 21H

CODES ENDS

END START

四、实验结果

五、实验心得

在程序的制作过程中,遇到了很多意想不到的困难,自己一个人解决起来有很大的困难,于是也少不了同学的帮助,深刻体会到开发程序不只是一两个人就能很好地完成的,要大家互相帮助,共同探讨问题,才能更好的解决困难。

实验五 分类统计字符个数

一、实验目的

掌握分支程序设计的原理与方法,重点掌握各种程序中形成和判断条件而产生的程序段的设计方法和技巧。

二、实验要求

掌握分支程序的调用及基本子程序的编写,判断程序运行的顺序。

三、实验内容

程序接受用户输入一行字符,并按照字符串中字符所属的类型分类,将结果输出(例如:aaabb1234&中,字母5,数字4,其他字符1)

实验代码如下:

DATAS SEGMENT

STRING1 DB 'Input Your String: $';输入提示信息

STRING2 DB 'Digit: $' ;各类字符提示信息

STRING3 DB 'UpLetter: $'

STRING4 DB 'LowLetter: $'

STRING5 DB 'Others: $'

DIGIT DB 0 ;数字

ALPHAU DB 0 ;大写字母

ALPHAL DB 0 ;小写字母

OTHERS DB 0 ;其他

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

LEA DX,STRING1 ;显示输入提示信息

MOV AH,9

INT 21H

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

L1:MOV AH,1 ;中断调用,单字符输入

INT 21H

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

JZ OVER2

CMP AL,30H

JB OTHER ;若

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

JA HIGHER1

JMP DIGITAL ;DIGIT++

HIGHER1:CMP AL,41H ;if

JB OTHER

CMP AL,5AH ;if>5AH(Z),跳转继续比较

JA HIGHER2

JMP UALPHA ;ALPHAU++

HIGHER2: CMP AL,61H ;if

JB OTHER

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

JA OTHER

JMP LALPHA ;ALPHAL++

JMP OVER ;比较结束

OTHER:INC OTHERS ;OTHERS++

JMP OVER

DIGITAL:INC DIGIT ;DIGIT++

JMP OVER

LALPHA:INC ALPHAL ;ALPHAL++

JMP OVER

UALPHA:INC ALPHAU ;ALPHAU++

JMP OVER

OVER:NOP

LOOP L1 ;循环,输入下一字符

OVER2:CALL ENDLINE ;回车换行

LEA DX,STRING2 ;输出提示信息

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,DIGIT ;将统计的数字送AX,为输出做准备

CALL DISPLAY ;调用输出两位数字的子程序

CALL ENDLINE ;下同

LEA DX,STRING3

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,ALPHAU

CALL DISPLAY

CALL ENDLINE

LEA DX,STRING4

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,ALPHAL

CALL DISPLAY

CALL ENDLINE

LEA DX,STRING5

MOV AH,9

INT 21H

XOR AX,AX

MOV AL,OTHERS

CALL DISPLAY

MOV AH,4CH

INT 21H

ENDLINE PROC NEAR ;控制输出格式,输出回车换行子程序

MOV AH,2

MOV DL,0AH

INT 21H

MOV AH,2

MOV DL,0DH

INT 21H

RET

ENDLINE ENDP

DISPLAY PROC NEAR ;输出两位数字的子程序

MOV BL,10 ;10送BL

DIV BL ;AX/BL,AL=商,AH=余数

PUSH AX ;保存AX中的信息

MOV DL,AL

ADD DL,30H

MOV AH,2

INT 21H ;输出十位数

POP AX ;出栈送AX

MOV DL,AH

ADD DL,30H

MOV AH,2

INT 21H ;输出个位数

RET

DISPLAY ENDP

CODES ENDS

END START

四、实验结果

五、实验心得

我认为本次实验主要是要清楚各分支程序。什么时候该跳转到哪个分支,并在分支中做好各项处理工作是本次实验的重点。

并且此次实验也让我们明白了,汇编的输出都是“字符”,也就是说要想输出两位数字必须做一点处理,将它转换为相应的字符“一个一个”地输出,从而解决了实验中的疑问。 还有一点就是关于输入的问题,我采用的是单字符输入,边输入边处理。因为用字符串的话,输入之后,仍然要“一个一个”字符取出来去做判断,还不如直接就判断了。


相关内容

  • 幼儿园课题开题报告(共6篇)
  • 篇一:幼儿园开题报告 幼儿礼貌语言养成教育对策的研究 峰峰矿区滏泉幼儿园 鹿国栋 一.课题的提出 <幼儿园指导纲要(试行)>中明确指出:教育幼儿使用礼貌语言与人交往,形成文明交往习惯.为此,我们在幼教工作实践中,始终坚持将文明礼貌教育作为德育教育的一项重要内容,加强对幼儿的文明礼貌教育, ...

  • [成本会计实训]教案
  • <数学实验>教案 实验一:Matlab 基本操作 一.实验基本情况 [实验学时]2学时 [实验形式]实验室小课 [实验重点]Matlab 软件的一些基本操作和常用命令 [实验难点]Matlab 软件的一些基本操作和常用命令 [参考书] 1.张志涌等编,精通MATLAB6.5,北京航空航天 ...

  • 舒缓音乐对数字短时记忆的影响实验报告
  • 舒缓音乐对数字短时记忆的影响实验报告 [摘要]以舒缓音乐作为无关声音刺激, 考察其对被试数字短时记忆广度的影响, 了解学习过程中音乐是否能对学生记忆产生积极的影响. [关键词]舒缓音乐 短时记忆 记忆广度 数字 影响 一.引言 记忆 (memory ) 是在头脑中积累和保存个体经验的心理过程.它联结 ...

  • 大学英语教学改革的几点思考-论文
  • 学科探索 大学英语教学改革的几点思考 李亚范 (渤海大学大学外语教研部 摘 要 辽宁铁岭121000) 面对日益激烈的国际市场竞争以及国际交往的不断增强,培养出高素质的英语人才已经迫在眉睫,大学英语 教学质量直接关系大学生英语水平和交际能力.本文主要论述大学英语教学的现状和英语改革的措施,旨在提升我 ...

  • 中南大学计算机原理与汇编课设报告
  • 中南大学 计算机原理与汇编语言 课程设计报告 题 目 汇编语言课程设计 学生姓名 指导教师 王磊 学 院 信息科学与工程 专业班级 信息安全1302 完成时间 2015/7/12 计算机原理与汇编课程设计 目录 第一章:反向输出一个整数 ............................... ...

  • 汇编第实验报告
  • 电子科技大学计算机科学与工程学院 标 准 实 验 报 (实验)课程名称 汇编语言程序设计 电子科技大学教务处制表 告 电 子 科 技 大 学 实 验 报 告 三 一,实验地点:主楼A2-412 实验时间:2012年11月25日 二,实验室名称:国家级计算机实验示范中心 三,实验学时: 4课时 四,实 ...

  • 数值计算基础
  • 数值计算基础 实验指导书 2010年 目录 实验一 直接法解线性方程组的 ................................ 1 实验二 插值方法 ........................................... 10 实验三 数值积分 ............. ...

  • 张瑞编译原理实验报告
  • 黑龙江大学 "编译原理课程设计"读书报告 学院 年级 专业 学号 姓名 报告日期 成绩 软件学院 2012级 软件工程 20122515 张瑞 2014年6月28日 黑龙江大学计算机科学技术学院 黑龙江大学软件学院 概述 "编译原理"课程是计算机专业中一门重要 ...

  • 海南大学毕业论文设计
  • 海南大学毕业论文(设计)工作规定(修订) (海校办字[2004]23号 2004年5月11日印发) 毕业论文(设计)是本科教学过程中非常重要的一个环节 是对学生综合运用本学科的基本理论.专门知识和基本技能解决实际问题和从事科学研究工作或担负专门技术工作的初步能力的训练与检验 为规范我校的毕业论文(设 ...