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

  《汇编语言程序设计》实验报告

实验室:S318  

最后一次实验时间:

      20## 年 5 月18

          第12周星期二1 - 2节

                              

学院:计算机科学与技术学院 

专业:计算机科学与技术        

实验一

实验题目

认识Tddebug集成环境

实验目的

1.   熟悉汇编程序的开发过程。

2.   认识Tddebug集成操作软件。

3.   掌握在Tddebug集成环境中编辑、编译、连接汇编语言程序方法。

4.   掌握INT 21H软件中断来调用DOS内部子程序的方法

实验主要步骤:

1.运行Tddebug软件,选择Edit菜单编写实验程序

2.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。

3.使用Rmrun菜单中的Run运行程序,观察运行结果。

4.使用Rmrun菜单中的Debug调试程序,查看程序段、数据段、附加段装入内存后的分配情况。单步执行数据传送指令后,观察各寄存器及数据区的内容。过程如下:

1)   按F7单步执行,在代码区中有一个三角,表示正在执行的指令。每一条指令的执行一定会使目标寄存器和状态寄存器发生变化,从相关窗口看结果。

2)   检查内存数据区的内容,关键是找出用户程序的数据段和附加段:

l  方法1:在CPU窗口按Tab键使内存数据显示区成为活动区,按Ctrl+G键,输入:“DS或ES寄存器的值:偏移地址”,即可显示用户指定的数据区

l  方法2:选择菜单View| Dump,弹出内存数据显示窗口。

3)   查看执行结果:按Alt+F5,切换到用户窗口。

5.更改数据区中的数据,考察、调试程序的正确性。

6.程序代码:

;数据传送实验,采用相对寻址方式

DDATA  SEGMENT                 ;定义源数据段

MSR DB "HELLO,WORLD!$"

LEN EQU $- MSR

DDATA  ENDS

EXDA      SEGMENT              ;定义附加数据段

MSD DB  LEN DUP(?)

EXDA      ENDS

MYSTACK   SEGMENT STACK        ;定义堆栈段

DW 20 DUP(?)

MYSTACK      ENDS

CODE      SEGMENT              ;定义代码段

ASSUME CS:CODE,DS:DDATA,ES:EXDA

START: MOV AX,DDATA

   MOV     DS,AX               ;装载数据段寄存器

   MOV     AX,EXDA

        MOV     ES,AX               ;装载附加数据段寄存器

        MOV SI,OFFSET MSR

        MOV     DI,OFFSET MSD

    MOV     CX,LEN

        MOV BX,0

NEXT:  MOV AL,MSR[BX] ;开始传输数据

    MOV     ES:MSD[BX],AL

        INC     BX

        LOOP    NEXT

        PUSH    ES

POP    DS                  ;将附加段寄存器指向的段值赋给数据段寄存器

    MOV     DX,OFFSET MSD

        MOV     AH,9

    INT     21H                 ;显示字符串

        MOV     AH,4CH

    INT     21H                 ;返回DOS状态

CODE    ENDS

    END  START

实验结果:

通过Tddebug软件写好实验程序后,对程序进行编译连接,最终生成执行文件,在dos环境下启动后,进入Tddebug,对程序进行单步执行,可看到在每一步执行过程中,程序所分得的地址单元。连接试验箱后,通过对试验箱的操作,能够看到在dos环境下程序的执行步骤。

代码运行结果:显示:“HELLO,WORLD!”

心得体会:

通过本次试验,是我回顾了在学习单片机的时候使用的Tddebug集成开发软件使用方法,了解了汇编程序的开发过程。能够在Tddebug环境下进行编辑、编译、连接程序,掌握了INT 21H软件中断的调用DOS内部子程序的方法。但对于DOS环境下的汇编程序的编辑、编译、连接使用还不是很熟悉,只能是Tddebug集成软件开发环境下熟悉的编译连接运行。

实验二

实验名称:

I/O程序设计

实验目的:

1.理解软中断的调用方法及中断过程。

2.掌握INT 21H软件中断来调用DOS系统I/O子程序的方法。

3.掌握将存储在内存单元中的数据在屏幕上显示的方法。

4.掌握从键盘输入信息到内存的方法。

实验内容:

1.将指定数据区中一个字节的数据以十六进制数形式显示在屏幕上。

2.编程由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。

3.从键盘输入两个1位十进制数,计算二者之和,并将结果显示在屏幕上。

4.编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上

实验步骤:

1.画出实验流程图。

2.运行Tddebug软件,选择Edit菜单编写实验程序

3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。

4.使用Rmrun菜单中的Run运行程序,观察运行结果。

5.使用Rmrun菜单中的Debug调试程序。单步执行指令,观察各寄存器及数据区的内容。

更改数据区中的数据,考察程序的正确性

实验代码:

DATA  SEGMENT

MES   DB  'Show a as hex:',0AH,0DH,'$'

SD    DB  'a'

DATA  ENDS

CODE  SEGMENT

  ASSUME  CS:CODE,DS:DATA

START:    MOV AX,DATA

  MOV     DS,AX

  MOV     DX,OFFSET MES;显示提示信息

  MOV     AH,09H     

  INT     21H    

  MOV     SI,OFFSET SD

  MOV     AL,DS:[SI]

  AND     AL,0F0H     ;取高4位

  MOV      CL,4

  SHR     AL,CL

  CMP     AL,0AH  ;是否是A以上的数

  JB      C2     

  ADD     AL,07H     

C2:   ADD AL,30H     

  MOV     DL,AL           ;显示字符

  MOV     AH,02H

  INT     21H

  MOV     AL,DS:[SI]

  AND     AL,0FH          ;取低4位

  CMP     AL,0AH

  JB      C3

  ADD     AL,07H

C3:   ADD AL,30H

  MOV     DL,AL           ;显示字符

  MOV     AH,02H

  INT     21H

  MOV     AH,4CH          ;返回DOS

  INT     21H

CODE  ENDS

  END START

实验结果:

代码运行结果:显示“61H”

心得体会:

本次实验要求我们将指定数据区的一个数据转换为其十六进制数,通过这次实验,我充分理解了什么是软中断,以及软中断的调用方法和中断过程,并了解了INT 21H软中断来调用DOS系统I/O子程序的方法,并知道如何将存储在内存单元中的素具显示在屏幕上。在老师的讲解过程中,我对试验提供的参考代码有了更深的了解,明白了如何进行调用软中断。

实验三

实验名称:

代码转换程序设计

实验目的:

1.了解微机中所使用的各类数制及编码方法。

2.掌握不同进制数及编码相互转换的程序设计方法,加深对数码转换的理解。

3.掌握将存储在内存单元中的数据以十六进制数形式、十进制数形式和二进制数形式显示在屏幕上的方法。

实验内容:

1.将5位十进制数的数字串转换为一个字的二进制数

2.编写程序将内存中一个字的数转换为十进制数的数字串显示。((压栈或者字符串)

3.编程将十进制的数字串转换为BCD码

4.编程将BCD码转换为二进制数

5.编程将二进制数转换为十进制数显示

实验步骤:

1.画出实验流程图。

2.运行Tddebug软件,选择Edit菜单编写实验程序

3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。

4.使用Rmrun菜单中的Run运行程序,观察运行结果。

5.使用Rmrun菜单中的Debug调试程序。单步执行指令,观察各寄存器及数据区的内容。

6.更改数据区中的数据,考察程序的正确性。

实验流程图:

                                           

代码:

DDATA   SEGMENT

MES DB  'The ascii code of decimal code are:$'

BUF DB  30H,30H,30H,31H,32H         ;十进制00012的ASCII码

    DB  10H DUP(0)

DDATA   ENDS

CODE SEGMENT

    ASSUME CS:CODE,DS:DDATA

START:MOV    AX,DDATA

     MOV        DS,AX

     MOV     SI,OFFSET BUF

     MOV        BL,0AH                ;送乘数

     MOV    CX,0004H              ;送转换位数

     MOV     AH,00H             

     MOV    AL,[SI]               ;取第一位ASCII码

     SUB    AL,30H

A1:   INC    SI

      IMUL   BL                    ;乘10 (AL*BL) 放在AX中

      ADD   AL,[SI]

      SUB   AL,30H

     LOOP   A1

     MOV     BX,AX

     MOV        DX,OFFSET MES            ;显示提示信息

     MOV        AH,09H

     INT        21H

     MOV     AX,BX                    ;显示结果

     MOV     CX,4

A3:   PUSH   CX

      MOV    CL,4

      ROL    AX,CL                     ;向左移位

      POP    CX

      MOV    BX,AX

      AND    AL,0FH                  ;高4位清零,保留低4位的值

      CMP    AL,0AH

     JB     A2     

     ADD    AL,07H     

A2:  ADD    AL,30H     

    MOV     DL,AL      

    MOV     AH,02H

INT     21H

    MOV    AX,BX

    LOOP   A3

    MOV    AH,4CH      

    INT   21H

CODE    ENDS

    END   START


实验结果:

代码运行结果:显示“00001010”

心得体会:

本次实验要求我们将5位十进制数的数字串转换为一个字的二进制数,通过这次实验,我了解了微机中所使用的各类数制及编码方法,并知道了不同进制数及编码相互转换的程序设计方法,加深了对数码转换的理解,并掌握了将存储在内存单元中的数据以十六进制数形式显示在屏幕上的方法。在刚开始实验的时候对于将十进制数转换为二进制有点不知道怎么办,虽然知道应该怎么算,但是却不知道怎么样写代码,通过对参考代码的理解,对于将十进制转换为二进制有了一定的概念,知道了要写一个转换进制的实验的基本步骤了。

      对上述实验我进行了一定的修改,代码如下:

data segment

      buf db 6,6 dup(0)

      msg1 db 'Please input X:',0ah,0dh,'$'

      msg2 db 0ah,0dh,'Please input P:',0ah,0dh,'$'

      msg3 db 0ah,0dh,'Result: ',0ah,0dh,'$'

data ends

code segment

      assume cs:code,ds:data  

             ;将字符串转换为十进制数的子程序         

             ;输入参数:字符处首地址

             ;输出参数:ax(保存十进制数)            

          StrToNum proc                     

                push bx

                mov bx,10

          StrToNum_s1:

                mul bx

                and buf[si],0fh

                add al,buf[si]

                inc si

                loop StrToNum_s1

                pop bx

                ret

          StrToNum endp

             ;功能:输出P进制数子程序

             ;输入参数:ax

             ;输出参数:无

             Print proc

                  push ax

                  push bx

                  push cx

                  push dx             ;保护

                 

                 

                  xor cx,cx

                  s1:

                      mov dx,0

                      div bx

                      push dx

                      inc cx

                      cmp ax,0

                      jne s1

                     

                      mov ah,02h

                  s2:

                      pop dx

                      add dl,30h

                      cmp dl,39h

                      ja s1                     

                      int 21h

                      loop s2

                      jmp ok

                      add dl,7h

                      int 21h

                      loop s2

                       

               ok:      

                  pop dx

                  pop cx

                  pop bx

                  pop ax   

                  ret

             Print endp            

                       

      start: mov ax,data

             mov ds,ax

             mov dx,offset msg1              ;输出msg1         

             mov ah,09h

             int 21h

            

             mov dx,offset buf               ;输入十进制数X

             mov ah,0ah

             int 21h

             mov cl,buf[1]

             mov si,2

             mov ax,0

             call StrToNum                   ;调用将字符串转换为十进制            

             push ax                         ;暂存ax

            

             mov dx,offset msg2              ;输出msg2

             mov ah,09h

             int 21h

            

             mov dx,offset buf               ;输入p

             mov ah,0ah

             int 21h

             mov cl,buf[1]

             mov si,2

             mov ax,0

             call StrToNum                   ;调用将字符串转换为十进制

             mov bx,ax                       

            

             mov dx,offset msg3               ;输出msg3

             mov ah,09h

             int 21h

            

             pop ax                          

            

             call Print

            

            

             mov ax,4c00h                                  int 21h

code ends

end start

运行结果如下:

Please input X:    //输入一个数

9

Please input P:    //选择显示输出结果的进制数

2

Result:

1001

实验四

实验名称:

综合程序设计

实验目的:

掌握子程序的写法、循环的调用,利用汇编语言编写简单的程序。

实验内容:

编程由键盘输入任意一位数,将该数以二进制数形式显示在屏幕上

要求:含有子程序,循环

实验步骤:

1.画出实验流程图。

2.运行Tddebug软件,选择Edit菜单编写实验程序

3.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。

4.使用Rmrun菜单中的Run运行程序,观察运行结果。

5.使用Rmrun菜单中的Debug调试程序。

实验流程图:

                                          

实验代码:

;输入一个数,选择显示进制,并在屏幕上显示出来

data segment

      buf db   ?

      msg1 db 'Please input X:',0ah,0dh,'$'

      msg2 db 0ah,0dh,'Result: ',0ah,0dh,'$'

data ends

code segment

      assume cs:code,ds:data  

           

      d_to_b  proc  near

          

            mov  buf,  2

            mov cx,    8

           

            mov al,    buf

       ed:    

            clc

            rcl  byte ptr buf,  1

            jnc  one

           

           

            mov ah,  02h

            mov dl,  '1'

            int 21h

            jmp ll

      

       one:

            mov  ah,  02h

            mov  dl,  '0'

            int  21h

       ll:      

            loop ed

            ret

      d_to_b  endp

                                   

      start: mov ax,data

             mov ds,ax

             mov dx,offset msg1              ;输出msg1         

             mov ah,09h

             int 21h

            

             mov  ah, 01h

             int  21h

             mov  buf, al

           

             mov dx,offset msg2              ;输出msg2

             mov ah,09h

             int 21h

             call d_to_b

             mov ax,4c00h                     ;返回

             int 21h

code ends

end start

实验结果:

代码运行结果:

Please input X:

6

Result:

00000110

心得体会:

本次实验是一个综合性实验的设计,在本次实验中,要求我们编写一个程序,实现从键盘任意输入一位数,将该数以二进制形式显示在屏幕上,并且在程序中必须包括子程序及循环。在做这个题目的过程中,遇到了很多问题,刚开始的时候是使用clc清零CF标志位,但是最终的到的结果是,无论输入什么数,都是00000000,最后经过和同学讨论,猜得到最后的正确结果,不是clc的问题而是需要把后面的一句改成“rcl  byte ptr buf,  1”,最后算是水里完成呢个了本次试验。通过这次实验,我对于汇编语言有了更深的了解,并学会了如何用汇编进行简单程序的编写。

相关推荐