合肥工业大学汇编语言程序设计实验报告

时间:2024.4.20

合肥工业大学

计算机与信息学院

实验报告

    程:汇编语言程序设计

专业班级:

    号:

    名:


实验一  Debug程序的使用

一.   实验目的

1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。

2、掌握8086/8088的寻址方式及多字节数据的处理方法。

二.   实验内容

实验内容:

1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。

2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。

实验要求:

本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。

三.   实验过程和程序

1、启动DOS操作系统

2、运行DEBUG.COM程序(若当前盘为C)

   C:>DEBUG↙

   – ;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)

3、用“A”命令编辑和汇编源程序

   –A ↙

   186E:0100    MOV  AX,[0200]↙

   186E:0103    MOV  BX,[0202]↙

   186E:0107    ADD  AX,[0204]↙

   186E:010B    ADC  BX,[0206]↙

   186E:010F    MOV  [0208],AX↙

   186E:0112    MOV  [020A],BX↙

   186E:0116    ↙

4、用“U”命令反汇编验证源程序

   –U CS:0100↙

   186E:0100   A10002    MOV  AX,[0200]

   186E:0103   8B1E0202  MOV  BX,[0202]

   186E:0107   03060402   ADD  AX,[0204]

   186E:010B   131E0602  ADC   BX,[0206]

   186E:010F   A30802    MOV  [0208],AX

   186E:0112   891E0A02  MOV  [020A],BX

   186E:0116  

注意:

   1)检查源程序是否有错误,若有则返回到第3步用“A 地址”命令进行修改,直到程序无错误。

   2)DEBUG约定在其命令或源程序中所涉及到的数据均被看作十六进制数,其后不用“H”说明。

   3)在DEBUG下,源程序中不能使用“标号”、“变量”和一些伪指令。

   4)在DEBUG下,大小写不敏感。

5、程序未执行前,用“R”命令观察,相关寄存器的内容。

–R↙

如:(AX)= 0000H,(BX)= 0000H,(SI)= 0000H

   (DI)= 0000H,(CS)= 13F5H,(IP)= 0100H

6、在程序未执行前,用“D”命令观察DS:0200H,DS:0204H、DS:0208H单元的内容

    –D  200 20B ↙

7、用“G”命令运行源程序

    –G  =100  0116 ↙

8、再用“D”命令观察DS:0200H~DS:020BH字节单元中的内容

    –D  200  20B↙

  9、用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄器内容的变化,并与预计的结果相比较。

       注意:D命令显示内存数据,注意观察多字节数据在内存中的存放方式。

指令执行的时。

程序运行结果:(AX)=1110H,(BX)=1111H

                 DS:0208H四字节单元的内容: 11111110H 

四.   实验结果(包括必要的截图)

五.   实验体会

    通过这次实验的练习,我熟悉了在DEBUG的环境下,汇编程序中的命令,并且学会调试运行汇编语言源程序,掌握8086/8088的寻址方式及多字节数据的处理方法。虽然自己动手实现了简单的计算的中间出现了很多错误,但是在查阅书本以及在老师和同学的帮助下完成了实验任务。
实验二  汇编语言程序设计(顺序、循环)

一.   实验目的

1、掌握顺序和循环程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

二.   实验内容

1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:

①计算表达式值(V–(X*Y+Z-720))/X;

②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。

2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示出来)

3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,输出‘No’)。

三.   实验过程和程序

1)data segment

     x dw 1

     y dw 0

     z dw 0

     v dw 0

     sum1 dw ?

     sum2 dw ?

data ends

code segment

     assume cs:code,ds:data

start:

     mov ax,data

     mov ds,ax

     mov ax,x

     imul y

     mov cx,ax

     mov bx,dx

     mov ax,z

     cwd

     add cx,ax

     adc bx,dx

     sub cx,720

     sbb bx,0

     mov ax,v

     cwd

     sub ax,cx

     sbb dx,bx

     idiv x

     mov sum1,ax

  

     mov sum2,dx

    mov ax,4c00h

int 21h

code   ends

     end start

2data segment

       grade dw 98,98,96,95,94,93,87,86,85,97,86

   

data ends

code segment

       assume cs:code,ds:data

start:

      mov ax,data

      mov ds,ax

      xor ax,ax

      mov cx,11

      mov bx,offset grade

   

loop1:   add ax,[bx]

        inc bx

        inc bx

        loop loop1

           mov cx,11

           idiv cx

        mov bx,ax

        mov ax,4c00h

        int 21h

 Code  ends

       end start

3)DATA SEGMENT
BUF DB 50, ?, 50 DUP(24H)
CHAR  DB 0AH,0DH,"$"
DATA ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
   
    MOV AH,10
    LEA DX,BUF
    INT 21H

    LEA DX,CHAR
    MOV AH,9
    INT 21H
   
    LEA DX,BUF+2
    MOV AH,9
    INT 21H
   
    MOV AH,4CH
    INT 21H

四.实验结果(包括必要的截图)

五.实验体会

    通过这次实验的练习,我掌握了顺序和循环程序结构和设计方法,并且可以自己动手在debug下运用顺序和循环的程序结构自己设计汇编的代码,另外这节课我还学会了在在屏幕上输入和输出字符串,非常的有趣,顺便我又熟悉了一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程,感觉收获颇丰。挺高了自己对于学习汇编的兴趣。

实验三  汇编语言子程序设计(分支、子程序)

一.   实验目的

1、掌握分支和子程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

3、通过汇编语言了解高级语言的参数传递等知识。

二.   实验内容

1、1. BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。

2. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。

3. 实践CàAsm的转换过程。

三.   实验过程和程序

1.

;实验三 第一题

DATA   SEGMENT

;定义提示信息msg,msgi分别代表第i字节出为1

msg1     db'the 1 bit is 1',0dh,0ah,'$'    

msg2     db'the 2 bit is 1',0dh,0ah,'$'

msg3     db'the 3 bit is 1',0dh,0ah,'$'

msg4     db'the 4 bit is 1',0dh,0ah,'$'

msg5     db'the 5 bit is 1',0dh,0ah,'$'

msg6     db'the 6 bit is 1',0dh,0ah,'$'

msg7     db'the 7 bit is 1',0dh,0ah,'$'

msg8     db'the 8 bit is 1',0dh,0ah,'$'

DATA   ENDS

STACKS SEGMENT

    ;未定义栈内容

STACKS      ENDS

CODES       SEGMENT

          ASSUME CS:CODES,DS:DATA,SS:STACKS

START:

          MOV AX,DATA

          MOV DS,AX

   

       ;程序代码部分

         xor bx,bx             ;用异或将bx,dx部分清零

          xor dx,dx

          mov bl,08h          ;将00001000b赋值给bl

          mov cx,8             ;利用loop进行8次循环

Lp1:      shr bl,1         ;将bl进行逻辑右移一次

          jc next                 ;判断CF中数据是否为1,若是跳转到next处

          add dx,3              ;dx加3

          loop Lp1

next:     mov ah,09h

          lea si,table    ;将转移表的地址传入到si中

          add si,dx             ;得到转移表的CF为1的地方

              jmp si

table:

       ;同一个代码段内使用near跳转

          jmp near ptr l1  

          jmp near ptr l2  

          jmp near ptr l3  

          jmp near ptr l4  

          jmp near ptr l5  

          jmp near ptr l6  

          jmp near ptr l7  

          jmp near ptr l8

    ;Li: 将msgi的地址传入到dx中,并跳转到done处

l1:          lea dx,msg1

          jmp done

l2:          lea dx,msg2

          jmp done

l3:          lea dx,msg3

          jmp done

l4:          lea dx,msg4

          jmp done

l5:          lea dx,msg5

          jmp done

l6:          lea dx,msg6

          jmp done

l7:          lea dx,msg7

          jmp done

l8:          lea dx,msg8

          jmp done

          ;返回汇编窗口

done:    int 21h 

              MOV AH,4CH

              INT 21H

              ;代码部分结束

             

CODES ENDS

          END START

2.DATAS     SEGMENT

x           dw 6

y           dw 8

DATAS       ENDS

STACKS     SEGMENT

    ;未定义栈部分

STACKS     ENDS

CODES       SEGMENT

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

START:

          MOV AX,DATAS

          MOV DS,AX

          ;主程序部分

          mov ax,x      ;分别将x,y压栈

          push ax

          mov ax,y

          push ax

          call f             ;调用子程序f(x,y)

          add sp,4

          pop ax

          pop ax          ;子程序调用结束,弹栈

          MOV AH,4CH

          INT 21H

         

          ;子程序部分

f             proc

          push bp

          mov  bp,sp

          push ax

          push dx

          push bx

          mov  bx,[bp+4] ;bx=y

          mov  ax,[bp+6]  ;ax=x

          imul bx                ;x*y

          add  ax,[bp+6]  ;x*y+x

          adc  dx,0          

          sub  ax,[bp+4]   ;x*y+x-y

          sbb  dx,0

          pop  bx

          pop  dx

          pop  ax

          ret

f           endp

   

CODES ENDS

          END START

四.   实验结果(包括必要的截图)

五.   实验体会

     通过这次实验的练习,我掌握分支和子程序结构和设计方法,特别是地址表和转移表的运用,已经可以熟练的运用转移表和地址表进行分支结构的设计,实验二又让我对子程序参数的调用有了深刻的体会,知道了在运用堆栈进行参数传递时需要注意的要点,另外这次实验又让我再一次熟悉一遍在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。


实验四  汇编语言高级编程专题

一.   实验目的

1、汇编语言宏程序设计;

2、 掌握中断服务子程序的编写。

3、 汇编语言与高级语言的混编。

二.   实验内容

1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min

2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。

3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。

    char dbyte[] = {0x34,0x45,0x56,0x67,0xaf};

三.   实验过程和程序

1;宏 min3

min3      macro x,y,z

              mov al,x

              mov bl,y

              mov cl,z

              cmp al,bl       ;比较al,bl

              jae j1          ;bl<al   

              jmp j2           ;否则al<bl

             

j1:          cmp bl,cl       ;比较bl,cl

              jae j3             ;cl<bl

jmp        j5                  ;否则bl<cl

j2:          cmp al,cl       ;比较al,cl

              jae j3             ;cl<al

              jmp j4           ;否则al<cl

             

j3:          mov ah,02h  ;min cl

              mov dl,cl

              or dl,30h

              int 21h

              jmp done

 

j4:          mov ah,02h  ;min al

              mov dl,al

              or dl,30h

              int 21h

              jmp done

             

j5:          mov ah,02h  ;min bl

              mov dl,bl

              or dl,30h

              int 21h

              jmp done

             

done:     mov ah,4ch

              int 21h

              endm

DATAS SEGMENT

    ;未定义数据段数据

DATAS ENDS

STACKS SEGMENT

    ;未定义栈段数据

STACKS ENDS

CODES SEGMENT

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

START:

    MOV AX,DATAS

    MOV DS,AX

   

      min3 2,1,6    ;找出2 1 6三数中最小数

     

    MOV AH,4CH

    INT 21H

CODES ENDS

END START

2.

DATA SEGMENT

    OLDISR DW ?,?

    TIMER DB 100

    COUNTER DW 0

    ISDONE DB 0

DATA ENDS

STACKS SEGMENT

    ;未定义

STACKS ENDS

CODES SEGMENT

    ASSUME CS:CODES,DS:DATA,SS:STACKS

START:

    MOV AX,DATA

    MOV DS,AX

    xor ax,ax

    MOV ES,AX

    xor cx,cx 

    MOV AX, ES:[1ch*4]

    MOV OLDISR[0],AX

    MOV AX,ES:[1ch*4+2]

    MOV OLDISR[2], AX

    MOV WORD PTR ES:[1ch*4], OFFSET ISR

    MOV WORD PTR ES:[1ch*4+2],SEG ISR

WAITHERE:

    CMP ISDONE,1

    JNZ WAITHERE 

EXIT:    

    MOV AX,OLDISR[0]

    MOV ES:[1ch*4],AX

    MOV AX,OLDISR[2]

    MOV ES:[1ch*4+2],AX   

    MOV AX,4C00H

    INT 21H

     

ISR PROC FAR

    PUSH DX

    PUSH AX

    MOV AX,DATA

    MOV DS,AX

    STI

    INC TIMER

AGAIN:

       mov ah,0bh

       int 21h

       or al,al

       jz j2

       MOV AH,8    ;不显示输入的字符

       INT 21H

       CMP AL,  'a'

       JNE j2

       MOV AH,2h

       MOV DL,10

       INT 21H     

       MOV COUNTER,0

j2: CMP TIMER, 1000/55 

    JB DONE

       MOV TIMER,0

       MOV AH,2

       MOV DL,13

       INT 21H

j3:   MOV AX,COUNTER

       MOV DL,10

       DIV DL

       MOV DH,AH

       MOV DL,AL

       MOV AH,2

       ADD DL,30H

       INT 21H

       mov ah,2

       mov dl,dh

       ADD DL,30H

       INT 21H

       inc COUNTER

       cmp COUNTER,60

       JNE DONE

       MOV ISDONE,1 

DONE:

       PUSHF

       CALL DWORD PTR OLDISR

       CLI

       POP AX

       POP DX

       IRET             ;中断返回

       ISR ENDP

CODES ENDS

END START

3.

#include <iostream>

using namespace std;

int main(){

char dbyte[]={0x34,0x45,0x56,0x67,0x67};

       __asm{

              mov esi,0

again:

                     mov cl,4

                     ror dbyte[esi],4

                     inc esi

                     cmp esi,5

                     jne again

       }

       for(int i=0;i<5;i++)

              cout<<dbyte[i];

return 0;

}

四.   实验结果(包括必要的截图)

五.   实验体会

    这次实验的练习,使我对汇编语言中宏程序有了一定的了解,并且自己动手编写了宏程序,另外我还掌握了中断服务子程序的编写,感觉非常的复杂,很长时间找不到头绪,最后请教了老师和同学。在他们的帮助下完成了实验。虽然花了很久的时间,但是还是非常值得的。

更多相关推荐:
汇编语言程序设计实验报告

实验报告实验名称专业班级信息安全学号姓名实验一汇编语言上机过程和Debug常用调试命令一实验目的学习程序设计的基本方法和技能熟练掌握用汇编语言设计编写调试和运行程序的方法二实验题目熟悉与实验有关的系统软件如编辑...

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

汇编语言实验报告题目1实验方法2用表格形式显示字符3分类统计字符个数4查找电话号码学生学院计算机学院专业班级06学号31学生姓名指导教师2008年6月1日计算机学院06专业班组学号姓名协作者实验题目实验方法实验...

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

学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号13514031姓名于志佳指导教师徐静实验一DEBUG的使用实验目的1熟悉在计算机上建立...

汇编语言子程序结构实验报告

XXXX学院信息学院实验名顺序结构程序设计实验室实验楼403实验日期20xx61912345

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

汇编语言程序设计实验报告实验室S318最后一次实验时间20xx年5月18日第12周星期二12节学院计算机科学与技术学院专业计算机科学与技术实验一实验题目认识Tddebug集成环境实验目的1234熟悉汇编程序的开...

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

12345678910111213141516171819

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

汇编语言程序设计实验报告姓名班级汇编语言程序设计实验报告姓名班级汇编语言程序设计实验报告姓名班级

汇编语言第7次实验报告:非数值运算程序设计

四川大学计算机学院软件学院实验报告123456789

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

基础汇编语言程序设计实验实验目的1了解教学计算机的指令格式指令编码选择的寻址方式和每一条指令的具体功能为进一步学习运算器组成和控制器设计打好基础2了解汇编语言的语句与机器语言的指令之间的对应关系了解伪指令在汇编...

汇编语言程序设计报告

课程设计报告20xx20xx年度第1学期名称汇编语言程序设计报告题目院系班级学号学生姓名指导教师设计周数成绩日期20xx年12月30日课程课程设计综合实验报告一课程设计综合实验的目的与要求1掌握实验运行汇编语言...

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

西安财经学院信息学院《汇编语言程序设计》实验报告实验名综合实验程序设计实验室实验日期20##-12-15一、实验目的及要求1.悉debug命令,学习汇编语言的调试环境;2.熟练撑握一些简单程序的调试,理解基本的…

简易计算器的汇编语言程序设计报告

设计内容计算器程序设计学院信息管理学院班级会计1204班制作人员史凡史明坤学号1220xx4149指导教师周作涛1目录一程序功能设计界面错误未定义书签二程序流程图及其说明错误未定义书签1程序流程图42流程图说明...

汇编语言程序设计实验报告(33篇)