汇编语言程序设计实验报告-实验七

实验七 分支程序

实验目的:

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全过程:

四、心得体会

 

作为一次综合实验比起前几次的实验还是比较难的,编写过程中遇到的问题也比较多,通过上几次实验的练兵,代码程序还是比较容易写的,但在开始调试却用了很多时间,最后认真的检查和跟同学交流讨论才找出所有的错误,确实调试是一件很不简单的事啊!

通过这个综合实验,对汇编语言有了更进一步的掌握,一些课堂上比较难弄懂的知识,做完这个实验后,基本都迎刃而解了。为了更好的学好汇编语言,只有经常上机编程实验才能把课本上的知识应用到实践上,在实践中更好的掌握学到的知识。

同时,在编程的过程中时时刻刻都不要忘记细心、再细心,只要有一点点失误,就永远运行不了这个程序。也许人生就如程序这样,以后无论在生活还是工作中都必须细心、再细心!

相关推荐