实验七 分支程序
实验目的:
1、掌握利用间接转移指令JMP BX实现多岔分枝的方法。
2、宏替换指令MACRO及ENDM。
3、符号扩展指令CBW。
实验程序:
disp
stack
stack
data
parm
brtable
msga
msgb
msgc
msgd
msge
msgf
errms
data
code
start: macro msg lea dx,msg mov ah,9 int 21h mov ah,4ch int 21h endm segment stack db 256 dup(0) ends segment db 16 dup(?) dw offset bra,offset brb,offset brc dw offset brd,offset bre,offset brf db 'I like my IBM-PC!$' db 'How are you!$' db 'Nibao College$' db 'This is a sample$' db 'Wellcome use my coputer!$' db 'Theassemder language of 8088$' db 'Error!! invalid parameter!!$' ends segment assume cs:code,ds:data,ss:stack mov ax,data
mov es,ax
mov si,80h
lea di,parm
mov cx,16
cld
rep movsb
mov ds,ax
cmp parm,2
jc err
mov al,parm+2
sub al,30h
jc err
err:
bra:
brb:
brc:
brd:
bre:
brf:
code cmp jnc lea cbw add add jmp disp disp disp disp disp disp disp ends
end al,6 err bx,brtable ax,ax bx,ax [bx] errms msga msgb msgc msgd msge msgf start
实验步骤:
1、输入并汇编此程序。要求生成一个 .LST文件。用TYPE命令检查 .LST文件,观察宏替换命令产生的指令集。
2、将OBJ文件连接成EXE文件(假设为AA。EXE)。
3、用命令DEBUG AA.EXE XXX (XXX为任意字符串)将AA.EXE带参数调入DEBUG用D命令观察DS:0080处的命令行,记录80H处的内容和字符个数的关糸。
4、退出DEBUG。直接带参数运行此程序:
AA n(n=0--5)
依次观察并记录 n从0到5时的运行结果。
汇编语言实验报告
题目:1、 实验方法
2、 用表格形式显示字符
3、 分类统计字符个数
4 、 查找电话号码
学生学院 计算机学院
专业班级 06
学 号 31
学生姓名_________ ______
指导教师
200 8 年 6 月 1 日
计算机 学院 06 专业2班__组、学号3姓名 协作者_________ 教师评定
实验题目 实验方法
实验一
一、 实验目的与要求
掌握用汇编语言设计、编写、调试和运行程序的方法。掌握debug程序的各种操作命令,熟悉程序的调试及其技巧。
二、 实验内容
比较字符串sample.asm(文件名)
试编写一程序:比较两个字符串stringl和string2所含的字符是否相同。若相同则显示‘Match’,否则,显示‘No match’。
三、 实验步骤
1. 调用字处理程序wordstar或记事本建立asm文件
建立sample.asm源文件如图1.1所示:
;*********************************************
datarea segment ;define data segment
string1 db 'Move the cursor backward.'
string2 db 'Move the cursor backward.'
;
mess1 db 'Match.',13,10,'$'
mess2 db 'No match!',13,10,'$'
datarea ends
;*********************************************
prognam segment ;define code segment
;-------------------------------------------------------------------
main proc far
assume cs:prognam,ds:datarea,es:datarea
start: ;start execution address
;set up stack for return
push ds ;save old data segment
sub ax,ax ;push zero in AX
push ax ;save it on stack
;set DS register to current data segment
mov ax,datarea ;datarea segment addr
mov ds,ax ;into DS register
mov es,ax ;into ES register
;MAIN PART OF PROGRAM GOES HERE
lea si,string1
lea di,string2
cld
mov cx,25
repz cmpsb
jz match
lea dx,mess2
jmp short disp
match:
lea dx,mess1
disp:
mov ah,09
int 21h
ret ;return to DOS
main endp ;end of main part of program
;-----------------------------------------------------------------------
prognam ends ;end of code segment
;************************************************
end start ;end assembly
图1.1 源文件sample.asm
2. 用汇编程序masm(或asm)对源文件汇编产生目标文件obj
C:>masm sample;
3. 用连接程序link产生执行文件exe
C:>link sample
4. 执行程序
可直接从DOS执行程序如下:
C:>sample
Match.
终端上已显示出程序的运行结果。为了调试程序的另一部分,可重新进编辑程序修改两个字符串的内容,使他们互不相同。如修改后的数据区为:
;*********************************************
datarea segment ;define data segment
string1 db 'Move the cursor backward.'
string2 db 'Move the cursor forward.'
;
mess1 db 'Match.',13,10,'$'
mess2 db 'No match!',13,10,'$'
datarea ends
;*********************************************
然后,重新汇编、连接、执行,结果为:
C:>sample
No match!
至此,程序已经调试完毕,运行结果正确。
另一种调试程序的方法是使用debug程序。可调用如下:
C:>debug sample.exe
可先用u命令显示程序,以便了解指令地址。显示结果如图1.2所示:
图1.2 用debug调试时,u命令的显示情况
将断点设置在程序的主要部分运行以前,同时根据其中指示的DS寄存器内容查看数据段的情况如下:
可用e命令修改数据区的字符串,操作如下图所示,再次用d命令查看修改结果。
用g命令运行程序,结果为:
-g
No match!
用q命令退出debug
-q
至此程序已调试完毕。
四、 心得体会
通过这次实验主要是学习使用debug调试程序,掌握对程序的调试方法。虽然在调试过程中有遇到一定的难处,但是通过反复实验和同学的帮助还是能够比较顺利的完成的。个人觉得这个调试方法比较不直接点,不过相信应该有它的独到之处吧。
计算机 学院 0 专业2班__组、学号31姓名 协作者_________ 教师评定
实验题目 用表格形式显示字符
实验二
一、 实验目的与要求
学习用汇编语言设计与编写循环程序。
题目:用表格形式显示ASCII字符SMASCII
二、 实验内容
按15行×16列的表格形式显示ASCII码为10H---100H的所有字符,即以行为主的顺序及ASCII码递增的次序一次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
三、 实验步骤
1. 输入的源文件为print.asm,以下为源代码:
.model small
.stack 200h
.data
.code
start: mov cl,16 ;初始化列数计数为16
mov ch,15 ;初始化行数计数为15
mov dh,10h ;初始化dh为10h
po: dec cl ;列数计数减1
mov ah,02h ;输出该字符
mov dl,dh
int 21h
inc dh ;令dh为下一个字符的ASCⅡ值
mov ah,02h ;输出空格
mov dl,0
int 21h
cmp cl,0 ;若列数计数cl为0
jz mo ;即已输出了16个字符则跳转换行
jmp po ;否则继续执行输出下一个字符的操作
mo: mov cl,16 ;换行,重新置列数计数为16
mov ah,02h ;输出回车符
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah ;输出换行符
int 21h
dec ch ;换行,则使行数计数ch减1
cmp ch,0 ;若ch为0
jz no ;则跳转至结束程序
jmp po ;否则继续执行输出下一行字符的操作
no: mov ax,4c00h
int 21h
end start
2. 汇编并连接文件后,生成exe文件,运行结果如下:
四、 心得体会
编写中使用了功能号为02的输出功能调用,同时由于逐个显示相继的ASCII字符,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,故要使用堆栈来保存相继的ASCII字符。
同样的,在实验过程中遇到了一些难点和想不通的地方,幸运的是,有老师的指点和同学的帮助,使我能够完成这个实验。同时也让我感受到细心,谨慎对我们学汇编语言的重要性,有一点点失误就使整个程序不能运行了。
计算机 学院 专业2班__组、学号
姓名 协作者_________ 教师评定
实验题目 分类统计字符个数
实验三
一、 实验目的与要求
学习用汇编语言编写与设计分支循环程序。
题目:分类统计字符个数COUNT_CHAR
二、 实验内容
程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字及其他字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。
三、 实验步骤
1输入的源文件为count_c.asm的源代码:
datasg segment
string label byte
max db 80
act db ?
stokn db 80 dup(?)
digit db 0
Letter db 0
other db 0
mess1 db 'Please input chars:','$'
mess2 db 0dh,0ah,'$'
mess3 db 'digit:','$'
mess4 db 'letter:','$'
mess5 db 'other:','$'
mess6 db 'h ','$'
n db 3
datasg ends
;
codesg segment
assume cs:codesg,ds:datasg
COUNT_CHAR proc far
push ds
sub ax,ax
push ax
mov ax,datasg
mov ds,ax
lea dx,mess1 ;输出字符串
mov ah,09
int 21h
lea dx,string
mov ah,0ah ;换行
int 21h
lea dx,mess2
mov ah,09h ;输出字符串
int 21h
lea si,stokn
sub ch,ch
mov cl,act
again: ;判断ASCLL
mov al,[si]
cmp al,30h
jl other1
cmp al,3ah
jl digit1
cmp al,41h
jl other1
cmp al,5bh
jl letter1
cmp al,61h
jl other1
cmp al,7bh
jl letter1
other1: ;处理其他字符,计数加一
inc other
inc si
loop again
jmp print
digit1: ;处理数字,计数加一
inc digit
inc si
loop again
jmp print
letter1: ;处理字母,计数加一
inc letter
inc si
loop again
print:
mov ch,2
mov bl,digit
lea dx,mess3
mov ah,09
int 21h
rotate: ;转换16进制
mov cl,4
rol bl,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl print1
add al,7h
print1:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
lea dx,mess6
mov ah,09
int 21h
dec n
cmp n,2
jz letter2
cmp n,1
jz other2
jmp exit
letter2:
lea dx,mess4
mov ah,09
int 21h
mov ch,2
mov bl,letter
jmp rotate
other2:
lea dx,mess5
mov ah,09
int 21h
mov ch,2
mov bl,other
jmp rotate
exit: ;结束退出
ret
COUNT_CHAR endp
codesg ends
end COUNT_CHAR
2编并连接文件后,生成exe文件,debug调试程序:
输入字符为1234[%$#@]abcd ^_^.结果如下:
四、 心得体会
编写程序主要用0a号功能输入字符串,同时练习设计分支结构的程序,为以后的编程打下基础. 次实验程序分支较多,刚开始不懂得如何用DEBUG查询,后来在老师的帮助下终于知道原来通过查看寄存器内容得到结果的。
计算机 学院 专业2班__组、学号姓名 王楚青 协作者_________ 教师评定
实验题目 查找电话号码
实验四
一、 实验目的与要求
学习用汇编语言设计与编写子程序。
题目:查找电话号码phone
二、 实验内容
(1) 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;
(2) 程序可接受输入人名及相应的电话号码,并把它们加入电话号码表中;
(3) 凡有新的输入后,程序应按人名对电话号码表重新排序;
(4) 程序可接受需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
name tel.
×××× ××××
三、 实验步骤
1. 输入的源文件为phone.asm,以下为源代码:
OUTPUT MACRO MESS ;定义输出字符串宏操作
MOV AH,9
LEA DX,MESS
INT 21H
ENDM
;----------------------------------
DATA SEGMENT
NAMEPAR LABEL BYTE
MAXNLEN DB 21
NAMELEN DB ?
NAMEFLD DB 21 DUP(?)
;
PHONEPAR LABEL BYTE
MAXPLEN DB 9
PHONELEN DB ?
PHONEFLD DB 9 DUP(?)
;
NAMECTR DB 0
PHONECTR DB 0
ENDADDR DW ?
;
TEL_TAB DB 50 DUP(28 DUP(' ')),'$' ;电话号码表
TELSAV DB 28 DUP(?),'$'
SWAPPED DB 0
; ;提示信息
MESS1 DB 'Input name:$'
MESS2 DB 'Input a telephone number:$'
MESS3 DB 'Do you want a telephone number?(Y/N)$'
MESS4 DB 'NAME$'
MESS5 DB 'TEL.$'
MESS6 DB 16 DUP(' '),'$'
MESS7 DB 'NAME?$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
;-----------------------------------------------
LEA DI,TEL_TAB
LOOP1:
OUTPUT MESS1
CALL INPUT_NAME ;输入名字
CALL CRLF
CMP NAMELEN,0 ;当输入字符为回车符结束输入记录
JZ LOOP2
CALL STOR_NAME ;保存名字
OUTPUT MESS2
CALL INPHONE ;输入并保存个人电话号码
CALL CRLF
JMP LOOP1
LOOP2:
CALL NAME_SORT ;按人名对电话号码表重新排序
LOOP3:
OUTPUT MESS3
MOV AH,1 ;接收单个字符
INT 21H
CMP AL,'n' ;若为’n’退出程序
JZ QUIT
CMP AL,'N' ;若为’N’退出程序
JZ QUIT
CALL CRLF
OUTPUT MESS7
CALL INPUT_NAME ;输入要查找人名
CALL CRLF
CALL NAME_SEARCH ;按人名查找记录
OUTPUT MESS4
OUTPUT MESS6
OUTPUT MESS5
CALL CRLF
CALL PRINTLINE ;按要求输出信息
CALL CRLF
JMP LOOP3
QUIT:
MOV AH,4CH
INT 21H
MAIN ENDP
;----------------------------------------
INPUT_NAME PROC NEAR ;接受人名
MOV AH,0AH ;0A号功能调用接收人名
LEA DX,NAMEPAR
INT 21H
;
CMP NAMELEN,0
JZ EXIT
MOV BH,0
MOV BL,NAMELEN
MOV CX,21
SUB CX,BX
INPUT_XH:
MOV NAMEFLD[BX],20H
INC BX
LOOP INPUT_XH
EXIT:
RET
INPUT_NAME ENDP
;-----------------------------------
STOR_NAME PROC NEAR ;把人名存入电话号码表tel_tab中
INC NAMECTR
CLD
LEA SI,NAMEFLD
MOV CX,10
REP MOVSW ;人名从缓冲区传送到tel_tab
RET
STOR_NAME ENDP
;------------------------------------
INPHONE PROC NEAR ;接受电话号码,并存入电话号码表tel_tab中
MOV AH,0AH ;0A号功能调用接受电话号码
LEA DX,PHONEPAR
INT 21H
MOV BH,0
MOV BL,PHONELEN
MOV CX,9
SUB CX,BX
INPHONE_XH:
MOV PHONEFLD[BX],20H
INC BX
LOOP INPHONE_XH
INC PHONECTR
CLD
LEA SI,PHONEFLD
MOV CX,4
REP MOVSW ;电话号码从缓冲区送到tel_tab
RET
INPHONE ENDP
;----------------------------------
NAME_SORT PROC NEAR ;对电话号码表按人名排序(冒泡法)
SUB DI,56
MOV ENDADDR,DI
XH1:
MOV SWAPPED,0 ;SWAPPED为记录转换次数
LEA SI,TEL_TAB
XH2:
MOV CX,28
MOV DI,SI
ADD DI,28
MOV AX,DI
MOV BX,SI
REPE CMPSB
JBE XH3
CALL EXCHANGE
XH3:
MOV SI,AX
CMP SI,ENDADDR
JBE XH2
CMP SWAPPED,0
JNZ XH1
RET
NAME_SORT ENDP
;----------------------------------
EXCHANGE PROC NEAR ;冒泡法中交换记录
MOV CX,14
LEA DI,TELSAV
MOV SI,BX
REP MOVSW
;
MOV CX,14
MOV DI,BX
REP MOVSW
;
MOV CX,14
LEA SI,TELSAV
REP MOVSW
;
MOV SWAPPED,1
RET
EXCHANGE ENDP
;--------------------------------------
NAME_SEARCH PROC NEAR ;在电话号码表中查找所要的电话号码
LEA SI,NAMEFLD
LEA DI,TEL_TAB
SEARCH_XH1:
MOV CX,20
REP CMPSB ;缓冲区字符串与tel_tab记录比较
JE SEARCH_XH2
ADD DI,8
LEA SI,NAMEFLD
JMP SEARCH_XH1
SEARCH_XH2:
MOV SI,DI
SUB SI,20
LEA DI,TELSAV
MOV CX,14
REP MOVSW ;比对正确,传送记录到缓冲区以便输出
RET
NAME_SEARCH ENDP
;-----------------------------------
PRINTLINE PROC NEAR ;按要求格式显示人名及电话号码
MOV AH,9
LEA DX,TELSAV
INT 21H
RET
PRINTLINE ENDP
;-----------------------------------
CRLF PROC NEAR ;输出回车换行符
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
INT 21H
RET
CRLF ENDP
;----------------------------------
CODE ENDS
END START
2. 各个模块说明:
由于各个模块基本上是并行方式共存,故模块层次为main模块之下有以下模块并行,这些模块分别是INPUT_NAME、STOR_NAME、INPHONE、NAME_SORT、EXCHANGE、NAME_SEARCH和PRINTLINE。
各模块说明:
(1) 模块名:main 为总控模块
输入:接受从键盘输入的人名及其电话号码,存入tel_tab中。
输出:接受从键盘输入的欲查找记录的人名,再按要求格式输出记录。
功能:显示提示符’Input name:’,调用子程序INPUT_NAME接收人名,调用子程序STOR_NAME把人名存入电话号码表tel_tab中,显示提示符’Input a telephone number:’,调用子程序INPHONE接收电话号码,并把它存入电话号码表tel_tab中,如输入已结束则调用NAME_SORT子程序对电话号码表按人名排序,显示提示符’Do you want a telephone number?(Y/N)’,回答N或n退出程序,否则显示提示符’name?’,调用子程序INPUT_NAME接收人名,调用子程序NAME_SEARCH在电话号码表中查找所要的电话号码,调用子程序PRINTLINE按要求格式显示人名及电话号码。
(2) 模块名:INPUT_NAME
输入:从键盘接收人名。
功能:人名存入缓冲区(0A号功能调用)。
(3) 模块名:STOR_NAME
功能:把缓冲区中的人名以字符串传送形式送到电话号码表tel_tab中。
(4) 模块名:INPHONE
输入:从键盘接收电话号码。
功能:人名存入缓冲区后,按字符串传送形式送到电话号码表tel_tab中。
(5) 模块名:NAME_SORT
功能:对电话号码表tel_tab按人名用冒泡法重新排序,调用EXCHANGE子程序进行冒泡法中的数据交换。
(6) 模块名:EXCHANGE
功能:若前一个人名的ASCII码比后一个人名的ASCII码大,则交换两个记录。
(7) 模块名:NAME_SEARCH
功能:接收人名后,比较缓冲区的记录和电话号码表tel_tab中的记录,若相等,则把tel_tab中的记录移到缓冲区中,以便输出。
(8) 模块名:PRINTLINE
输出:按要求格式输出人名和电话号码。
3. 汇编并连接文件后,生成exe文件,执行文件并debug调试程序:
输入三个记录:
分别是1.LiMing 38456787;2.zhangYi 49885656;3.LiuWei 84752544;
执行exe全过程:
四、心得体会
作为一次综合实验比起前几次的实验还是比较难的,编写过程中遇到的问题也比较多,通过上几次实验的练兵,代码程序还是比较容易写的,但在开始调试却用了很多时间,最后认真的检查和跟同学交流讨论才找出所有的错误,确实调试是一件很不简单的事啊!
通过这个综合实验,对汇编语言有了更进一步的掌握,一些课堂上比较难弄懂的知识,做完这个实验后,基本都迎刃而解了。为了更好的学好汇编语言,只有经常上机编程实验才能把课本上的知识应用到实践上,在实践中更好的掌握学到的知识。
同时,在编程的过程中时时刻刻都不要忘记细心、再细心,只要有一点点失误,就永远运行不了这个程序。也许人生就如程序这样,以后无论在生活还是工作中都必须细心、再细心!
实验报告实验名称专业班级信息安全学号姓名实验一汇编语言上机过程和Debug常用调试命令一实验目的学习程序设计的基本方法和技能熟练掌…
学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号1351…
汇编语言程序设计实验报告实验室S318最后一次实验时间20xx年5月18日第12周星期二12节学院计算机科学与技术学院专业计算机科…
计算机组成原理与汇编语言实验20xx指导教师签名一实验原理基本知识简单介绍算法流程计算机组成原理与汇编语言实验20xx计算机组成原…
实验六汇编语言程序上机过程实验目的1掌握常用工具软件PEMASM和LINK的使用2伪指令SEGMENTENDSASSUMEENDO…
学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号1351…
实验1实验学时2实验地点二综实验日期20xx1020一实验目的掌握汇编编程规范熟悉编程环境二实验内容1编程向内存0200023F依…
学生实验报告(理工类)课程名称:C#程序设计专业班级:M11计算机科学与技术(专转本)学生学号:XXXXXXXX学生姓名:XXX所…