华北电力大学汇编实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华北电力大学
实验报告|
|
实验名称汇编语言程序设计实验
课程名称IBM-PC汇编语言程序设计
|
|
专业班级:计科1103 学生姓名:李庆贺
学号:201109010307 成绩:
指导教师:王保义实验日期:1月
实验一用表格形式显示字符
一、实验要求
按15*16列的表格形式显示ASCⅡ码为10H—100H的所有字符,即以行为主的顺序及ASCⅡ码递增的次序依次显示对应的字符。

每16个字符为一行,每行中的相邻两个字符之间用空白符隔开。

二、设计说明
(1)显示每个字符可使用功能号为02的显示输出功能调用:
Mov ah,02h
Mov dl,输出字符的ASCⅡ码
Int 21h
将dl初始化为10H,然后使用其加1以取得下一个字符的ASCⅡ码。

(2)显示空白符是,用其ASCⅡ码置0入dl寄存器。

每行结束时,用回车和换行来结束本行并开始下一行。

(3)由于逐个显示相继的ASCⅡ码字符是,需要不断修改dl寄存器的内容,而显示空白、回车、换行也需要使用dl寄存器,为此可使用堆栈保存dx。

三、实验程序及调试结果
prognam segment
main proc far
assume cs:prognam
start:
mov ah, 02h
mov dl, 10h ;设置初始输出为ASCII的10h
mov bl, 15 ;输出显示为15行
e:
mov cx, 16;设置循环次数,16,表示输出显示为16列
l:
int 21h ;显示输出
push dx ;推入堆栈
mov ah, 02h
mov dl, 0
int 21h
mov ah, 02h
mov dl, 0
int 21h ;显示空白符
pop dx ;将栈顶元素推出
inc dl ;设置下一个元素
loop l ;循环输出每行的16个ASCII元素
push dx ;将下一行的首元素推入堆栈
mov ah, 02h
华 北 电 力 大 学 实 验 报 告
- 3 -
mov dl, 0dh
int 21h
mov ah, 02h
mov dl, 0ah
int 21h ;输出换行
pop dx ;将栈顶元素推出
dec bl
cmp bl, 0 ;比较确定是否已经输出15行元素
jne e ;若还未完成输出,则跳转至e ,继续进行下一行元素的输出
je exit ;否则退出程序
exit:
mov ax, 4c00h
int 21h
main endp
prognam ends
end
; start
实验二 查找匹配字符串
一、 实验要求
程序接受用户键入的一个关键字以及一个句子,如果句子中不包含关键字则显示“No match!”;如果句子中包含关键字则显示“match!”,且把该字在句子中的位置用十六进制数显示出来。

要求程序的执行过程如下:
Enter keyword:abc
Enter sentence:we are studying abc
Match at location:11H of the sentence
Enter sentence:xyz
No match!
华北电力大学实验报告
mov ah,09h
int 21h;显示messkey字符内容
lea dx,keyadr
mov ah,0ah
int 21h;是实现DOS调用中的0a号功能,就是在屏幕上显示keyadr字符串
lea dx,messsen
mov ah,09h
int 21h
lea dx,senadr
mov ah,0ah
int 21h
mov al,senact
sub al,keyact
jl nmatch;长度比较,句子长度短,没有找到跳到nmatch子语句
call search
jmp short e0;无条件跳转
;以上均为DOS上让其显示这些内容
nmatch:
lea dx,nomatch
mov ah,09h
int 21h
e0:
ret
main endp ;结束
search proc near
xor cx,cx;cxqingling
mov dx,offset senadr;句子地址到dx
add dl,senact;句子changdu
inc dl;置长度加1得到句子最后一位
mov cl,keyact;关键字长度到cl
cld ;清除方向标志
lea di,secstring
r0:
lea si,keystring
repz cmpsb;如果si和di所指向的两个字节相等,则继续比较。

所以如果相等的话,就停止循环。

但是这时候si和di已经自动加1了,如果要找不相等的那两个数,就要把si和di减1。

mov al,byte ptr [si-1]
cmp al,byte ptr [di-1];把那两个不相等的字节放到ptr数组中去
jnz next ;为0?,跳到next子语句
sub si,offset keystring;获得操作数keystring的偏移地址
mov ax,si
cmp al,keyact;将关键字与secstring长度比较
je showp
next:
- 5 -
mov cl,keyact
cmp di,dx
jnz r0
shown:
lea dx,nomatch
mov ah,09h
int 21h;在屏幕上显示nomatch字符串
jmp short e1
showp:
lea dx,match
mov ah,09h
int 21h;在屏幕上显示match字符串
dec di;句子与关键字匹配最后一位的下一位,所以要见1位mov bx,di;
xor ax,ax
mov al,keyact
sub bx,ax;句子长度减去关键字长度
mov ax,offset senadr
sub bx,ax
call binihex
lea dx,rest
mov ah,09h
int 21h
e1:
ret
search endp
binihex proc near
mov ch,4
r1:
mov cl,4;左移4位
rol bx,cl
mov dl,bl
and dl,0fh
add dl,30h
cmp dl,39h
jle disp
add dl,07h
disp:
mov ah,02h
int 21h
dec ch
jnz r1
ret
binihex endp
prognam ends
华北电力大学实验报告end main
二、程序框图
- 7 -
实验三分类统计字符个数
一、实验要求
程序接受用户键入一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字、其它字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。

二、设计说明
(1)程序可采用01H功能调用把键入字符先分类计数再存入缓冲区中。

(2)程序进入debug运行并查看计数结果。

三、实验程序
DATA SEGMENT
PARS DB 80 ;准备接收80个字符.
NNN DB?;用于存放实际输入的个数.
III DB 80 DUP(?) ;80字节的空间.
D_N DB?
C_N DB?
O_N DB?
MESG1 DB 13, 10, 'Input STR : $ ';用于提示.
MES_C DB 13, 10, 'Char N is : $ ';用于提示.
MES_D DB 13, 10, 'Digit N is : $ ';用于提示.
MES_O DB 13, 10, 'Other N is : $ ';用于提示.
MES_T DB 13, 10, 'All N is : $ ';用于提示.
DATA ENDS
;---------------------------------------------------
CODE SEGMENT
华北电力大学实验报告
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV D_N, 0
MOV C_N, 0
MOV O_N, 0
MOV DX, OFFSET MESG1
MOV AH, 9 ;9号功能调用,显示提示.
INT 21H
MOV DX, OFFSET PARS
MOV AH, 10 ;10号功能调用,接收键盘输入.
INT 21H
;---------------------------------------------------
MOV CL, NNN ;收到字符的个数.
MOV CH, 0
CMP CX, 0
JNZ DO_IT
JMP EXIT
DO_IT:
LEA SI, III ;收到字符的起始地址.
;----------------------------下面开始循环统计.
AGAIN:
MOV AL, [SI]
D_num:
CMP AL, ':';- ':'
JNC N_C_B ;> '9'
CMP AL, '0'
JC N_C_B ;< '0'
INC D_N ;数字个数加一.
JMP NEXT
N_C_B:
CMP AL, '[';- '['
JNC N_C ;> 'Z'
CMP AL, 'A'
JC N_C ;< 'A'
INC C_N ;大写,加一.
JMP NEXT
N_C:
CMP AL, '{';- '{'
JNC OTHER ;> 'z'
CMP AL, 'a'
- 9 -
JC OTHER ;< 'a'
INC C_N ;小写,加一.
JMP NEXT
OTHER:
INC O_N ;其它.
NEXT:
INC SI
LOOP AGAIN
;----------------------------统计结束
MOV DX, OFFSET MES_D
MOV AH, 9 ;9号功能调用,显示提示. INT 21H
MOV AL, D_N
CALL DISP_AL
MOV DX, OFFSET MES_C
MOV AH, 9 ;9号功能调用,显示提示. INT 21H
MOV AL, C_N
CALL DISP_AL
MOV DX, OFFSET MES_O
MOV AH, 9 ;9号功能调用,显示提示. INT 21H
MOV AL, O_N
CALL DISP_AL
MOV DX, OFFSET MES_T
MOV AH, 9 ;9号功能调用,显示提示. INT 21H
MOV AL, NNN
CALL DISP_AL
;----------------------------显示结束.
EXIT:
MOV AH, 4CH
INT 21H
;============================
DISP_AL: ;以3位十进制数形式显示AL中的内容.
MOV AH, 0
MOV BL, 100
DIV BL
ADD AL, 30H
MOV DL, AL
MOV BH, AH
华北电力大学实验报告
MOV AH, 2
INT 21H
MOV AH, 0
MOV AL, BH
MOV BL, 10
DIV BL
ADD AL, 30H
MOV DL, AL
MOV BH, AH
MOV AH, 2
INT 21H
ADD BH, 30H
MOV DL, BH
MOV AL, AH
MOV AH, 2
INT 21H
RET
;============================
CODE ENDS
END START
四、使用说明
程序进入后提示输入字符,可以输入任意字符,输入完成后键入回车键表示完成,则会在下一行输出实验结果。

五、程序框图
- 11 -
实验心得体会:
这次汇编实验历时一周,但我用了3天时间完成了3个编程实验:用表格形式显示字符、查找匹配字符串、分类统计字符个数,由于期间要考试所以就没有做第四个。

用表格形式显示字符和查找匹配字符串是使用了循环程序设计思想。

显示字符实验较为简单,只需要一些基础知识即可完成。

而查找字符串较耗费时间,这个实验主要难点就在从句子中查找关键字。

查找关键字是使用的串比较指令。

这个指令只能进行比较,查找就需要移动指针,将整个句子都与关键字比较一遍,才能确定是否找到了关键字。

华北电力大学实验报告
分类统计字符个数与查找电话号码较难,花费了我最多的时间。

分类统计字符个数是应用了分支程序设计,而查找电话号码是应用了子程序设计。

分类统计字符个数是将输入的字符与多个条件进行比较,找到符合条件的程序段就执行,否则就跳到下一个。

实验过程中遇到了很多问题,有许多问题是我自己无法解决的,只能通过向其他同学学习,向老师询问一些不懂的地方,才能将实验完成。

这次实验培养了我的实践能力,使我将书本中的理论知识转变成了现实的程序,为今后的学习和使用打下了结实的基础。

通过实验使我进一步巩固所学汇编课程内容并掌握汇编程序在程序设计中的应用方法,并对汇编程序设计及应用有整体的认识。

在此还要真诚的感谢老师的帮助,否则我也不会顺利完成该实验。

- 13 -。

相关文档
最新文档