汇编语言实验报告

合肥工业大学

计算机与信息学院

实验报告

    程:汇编语言程序设计

专业班级:

    号:

    名:


实验一  Debug程序的使用

一.  实验目的

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

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

二.  实验内容

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

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

要求:

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

三.  实验过程和程序

1.

e ds:0200 78 56 34 12

e ds:0204 98 BA DC FE

2.

直接寻址:

mov ax,[0200]

mov bx,[0202]

add ax,[0204]

adc bx,[0206]

mov [0208 ],ax

mov [020a],bx

间接寻址:

mov si,[0200]

mov di,[0204]

mov bx,[0208]

mov ax,[si]

mov dx,[si+2]

add ax,[di]

adc dx,[di+2]

mov [bx],ax

mov [bx+2],dx

附加题1

e ds:0000 1c 02

e ds:0002 01 00

e ds:0004 FF FF

e ds:0006 38 04

e ds:0008 00 00

Microsoft Windows [???? 6.1.7600]

???????? (c) 20## Microsoft Corporation????????????????

C:\Users\Administrator>debug

-e ds:0000 1c 02

-e ds:0002 01 00

-e ds:0004 FF FF

-e ds:0006 38 04

-e ds:0008 00 00

-a

13B3:0100 mov ax,[0000]

13B3:0103 mov bx,[0002]

13B3:0107 imul bx

13B3:0109 mov cx,ax

13B3:010B mov bx,dx

13B3:010D mov ax,[0004]

13B3:0110 cwd

13B3:0111 add cx,ax

13B3:0113 adc bx,dx

13B3:0115 sub cx,21c

13B3:0119 sbb bx,0

13B3:011C mov ax,[0006]

13B3:011F cwd

13B3:0120 sub ax,cx

13B3:0122 sbb dx,bx

13B3:0124 mov bx,[0000]

13B3:0128 idiv bx

13B3:012A mov [0008],ax

13B3:012D

-g =0100 012d

AX=0002  BX=021C  CX=FFFF  DX=0001  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=13B3  ES=13B3  SS=13B3  CS=13B3  IP=012D   NV UP EI PL ZR AC PE CY

13B3:012D 0000         

ADD     [BX+SI],AL                         DS:021C=00

-

四.  实验结果

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

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

附加题1

五.  实验体会

通过本次试验熟悉了DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。以及DEBUG下的八个基本的指令,如a,g,t,u等等。初步掌握了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

sum1 dw 0

sum2 dw 0 

x dw 21CH

y dw 1H

z dw 0FFFFH

v dw 438H    

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov ax,x

mov bx,y

imul bx

mov cx,ax

mov bx,dx

mov ax,z

cwd

add cx,ax

adc bx,dx

sub cx,0D0H

sbb bx,0

mov ax,v

cwd

sub ax,cx

sbb dx,bx

mov bx,x

idiv bx

mov sum1,ax

mov sum2,dx

mov ah,4ch

int 21h

Code ends

       end start


2.


Data  segment

grade dw 10 dup (50,60,70,80,90)

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov cx,50

mov bx,0

mov ax,0

again:

add ax,grade[bx]

inc bx

inc bx

loop again

mov bx,50

div bx

mov ah,4ch

int 21h

      

Code ends

       end start


3.


len equ 51

Data  segment

string db len,?,len dup(?)

lf db 0ah

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

lea dx,string

mov ah,0ah

int 21h

mov dl,lf

mov ah,2

int 21h

mov cl,string[1]

mov ch,0

lea bx,string[2]

add bx,cx

mov byte ptr [bx],'$'

lea dx,string[2]

mov ah,09h

int 21h

mov ah,4ch

int 21h

      

Code ends

       end start


四.  实验结果

1.

x dw 21CH

y dw 1H

z dw 0FFFFH

v dw 438H      结果为 sum1=0001  sum2=00d1

2.

输入10组数据,分别为50,60,70,80,90

输出 为46h

3.

输入:string

输出:string

五.  实验体会

掌握了顺序和循环程序结构和设计方法,以及字符、字符串的输入和显示,熟悉了在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有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。

三.  实验过程和程序

1.

地址表方法:


Data  segment

x db 10h

addrtbl dw l0,l1,l2,l3,l4,l5,l6,l7

s0 db 'The 0 Bit is 1.$'

s1 db 'The 1 Bit is 1.$'

s2 db 'The 2 Bit is 1.$'

s3 db 'The 3 Bit is 1.$'

s4 db 'The 4 Bit is 1.$'

s5 db 'The 5 Bit is 1.$'

s6 db 'The 6 Bit is 1.$'

s7 db 'The 7 Bit is 1.$'

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov cx,8

mov bl,x

again:

shr bl,1

jnc l

mov si,8

sub si,cx

shl si,1

jmp addrtbl[si]

l0:

lea dx,s0

jmp output

l1:

lea dx,s1

jmp output

l2:

lea dx,s2

jmp output

l3:

lea dx,s3

jmp output

l4:

lea dx,s4

jmp output

l5:

lea dx,s5

jmp output

l6:

lea dx,s6

jmp output

l7:

lea dx,s7

jmp output

l:

loop again

output:

mov ah,9h

int 21h

mov ah,4ch

int 21h

      

Code ends

       end start


转移表方法:


Data  segment

x db 80h

addrtbl dw l0,l1,l2,l3,l4,l5,l6,l7

s0 db 'The 0 Bit is 1.$'

s1 db 'The 1 Bit is 1.$'

s2 db 'The 2 Bit is 1.$'

s3 db 'The 3 Bit is 1.$'

s4 db 'The 4 Bit is 1.$'

s5 db 'The 5 Bit is 1.$'

s6 db 'The 6 Bit is 1.$'

s7 db 'The 7 Bit is 1.$'

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov cx,8

mov bl,x

again:

shr bl,1

jnc l

mov si,8

sub si,cx

l:

loop again

lea ax,jmptbl

mov cx,si

shl si,1

add si,cx

add ax,si

jmp ax

jmptbl:

jmp near ptr l0

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

l0:

lea dx,s0

jmp output

l1:

lea dx,s1

jmp output

l2:

lea dx,s2

jmp output

l3:

lea dx,s3

jmp output

l4:

lea dx,s4

jmp output

l5:

lea dx,s5

jmp output

l6:

lea dx,s6

jmp output

l7:

lea dx,s7

jmp output

output:

mov ah,9h

int 21h

mov ah,4ch

int 21h

Code ends

       end start


2.


Data  segment

x dw 1

y dw 2

z dw 0

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

sub sp,4

push y

push x

call f

pop z

mov ah,4ch

int 21h

      

f proc near

  push bp

  mov bp,sp

  push si

  push dx

  push cx

  push bx

  push ax

  mov ax,[bp+4]

  mov cx,ax

  mov bx,[bp+6]

  imul bx

  mov si,0

  add ax,cx

  adc dx,si

  mov si,0

  sub ax,bx

  sbb dx,si

  mov [bp+8],ax

  mov [bp+10],dx

  ret 4

f endp

Code ends

       end start


四.  实验结果

1

地址表方法:

BL中存储的数为:  10h

输出结果为: The 4 bit is 1.

转移表方法:

BL中存储的数为:  80h

输出结果为: The 7 bit is 1.

2.

五.  实验体会

通过本次试验,掌握了分支和子程序结构和设计方法;实现了转移表以及地址表的创建及调用,以及几种参数传递的方式,进一步熟悉了在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

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

一.  实验目的

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

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

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

二.  实验内容

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

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

三.  实验过程和程序

1.


MIN3 macro x,y,z,min

     mov al,x

     mov bl,y

     mov cl,z

     cmp al,bl

     jc l1

     cmp bl,cl

     jc l2

     mov min,cl

     jmp exit

l1:  cmp al,cl

     jc l3

     mov min,cl

     jmp exit

l2:  mov min,bl

     jmp exit

l3:  mov min,al

exit:

endm

Data  segment

x db 03h

y db 02h

z db 01h

min db ?

Data        ends

Code        segment

       assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

MIN3 x,y,z,min

add min,30h

mov dl,min

mov ah,02h

int 21h

mov ah,4ch

int 21h

      

Code ends

         end start



2.

 INTNO EQU 1CH

    USEINT = 59

DATA SEGMENT

      OLDISR DW ?,?

      TIMER DB 100

      COUNTER DW 60

      ISDONE DB 0

DATA ENDS

   

CODE SEGMENT

      ASSUME CS:CODE,DS:DATA

START:

      MOV AX,DATA

      MOV DS,AX

     

      MOV AX,0

      MOV ES,AX

                          ;PROTECT

    IF USEINT

      MOV AL, INTNO

      MOV AH,35H

      INT 21H

      ;ES:BX

      MOV OLDISR[0], BX

      MOV AX,ES

      MOV OLDISR[2], AX

    ELSE 

      CLI

      MOV AX, ES:[INTNO*4]

      MOV OLDISR[0],AX

      MOV AX,ES:[INTNO*4+2]

      MOV OLDISR[2], AX

      STI

    ENDIF

   

      ;SET NEW ISR

    IF USEINT

      PUSH DS

      MOV AX, SEG ISR

      MOV DS,AX

      MOV DX, OFFSET ISR

      MOV AL, INTNO

      MOV AH, 25H

      INT 21H

      POP DS

    ELSE 

      CLI

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

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

      STI

    ENDIF

                                            ;WAIT HERE

WAITHERE:

    CMP ISDONE,1

    JNZ WAITHERE

 

EXIT:                                       ;RESTORE

   IF USEINT

      PUSH DS

      MOV DX,OLDISR[0]

      MOV AX,OLDISR[2]

      MOV DS,AX

      MOV AL, INTNO

      MOV AH, 25H

      INT 21H

      POP DS

    ELSE 

      CLI

      MOV AX,OLDISR[0]

      MOV ES:[INTNO*4],AX

      MOV AX,OLDISR[2]

      MOV ES:[INTNO*4+2],AX

      STI

    ENDIF

       

      MOV AX,4C00H

      INT 21H

     

ISR PROC FAR

        PUSH DX

        PUSH AX

       

        MOV AX,DATA

        MOV DS,AX

        STI               ;便于中断嵌套

                           ;COUNT HERE

        INC TIMER

AGAIN:

        CMP TIMER, 1000/55         ;18

        JB DONE

        MOV TIMER,0

                            ;carriage

        MOV AH,2

        MOV DL,13

        INT 21H

                            ;print time

        MOV AX,COUNTER

        MOV DL,10

        DIV DL

        MOV DH,AH

        MOV DL,AL

        MOV AH,2

        ADD DL,30H

        INT 21H

        MOV DL,DH

        ADD DL,30H

        INT 21H

       

        DEC COUNTER

        JGE DONE

        MOV ISDONE,1

DONE:

        PUSHF

        CALL DWORD PTR OLDISR

        CLI

        POP AX

        POP DX

        IRET             ;中断返回

ISR ENDP

CODE ENDS

      END START


四.  实验结果

1.

输入:x,y,z分别是03h  02h  01h

输出:1

2.

五.  实验体会

    通过本次试验熟悉了汇编语言宏程序设计;掌握中断服务子程序的编写,其中应注意恢复原中断指令,将ds重新指向数据段。

相关推荐