实验二 多个逻辑段的汇编源程序编写和调试

一、实验目的
1. 理解和掌握8086多个逻辑段的汇编源程序
2. 理解和熟练应用灵活的寻址方式
3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用
4. 掌握使用debug调试8086汇编程序的方法
 
二、实验准备
复习教材5-8章:
包含多个逻辑段的汇编源程序结构
寻址方式
汇编指令loop, div用法
 
 
三、实验内容
1. 实验任务1
1-1:在debug中执行到line17结束、line19之前

DS=076A,SS=076B,CS=076C

code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。

 

1-2:在debug中执行到line17结束、line19之前

DS=076A,SS=076B,CS=076C

code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。

 

1-3:在debug中执行到line17结束、line19之前

 

DS=076A,SS=076C,CS=076E

code段的段地址是X,则,data段的段地址是X-4, stack的段地址是X-2。

 

1-4:在debug中执行到line17结束、line19之前

DS=076C,SS=076E,CS=076A

code段的段地址是X,则,data段的段地址是X+2, stack的段地址是X+4。

 

1-5:

对于如下定义的段,程序加载后,实际分配给该段的大小是 N字节

将所有伪指令end start改成end:只有 task1_4可以正确执行可以正确执行

因为end start改为end后,前三个以数据段开头,cs指向出现错误,而第四个开头即为程序段,所以仍然能执行.

 

 

 

实验任务2

代码:

assume cs:code
code segment
start:
    mov ax,0b800h
    mov ds,ax
    mov bx,0f00h
    mov ax,0403h

    mov cx,80
    s:
    mov ds:[bx],ax
    add bx,2
    loop s

    mov ah, 4ch
    int 21h
code ends
end start

 

 

实验任务3:

代码:

assume cs:code
data1 segment
    db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends

data2 segment
    db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
data2 ends

data3 segment
    db 16 dup(0)
data3 ends

code segment
start:
    mov ax, data1
    ; mov ax, data2
    ; mov ax, data3
    mov ds,ax
    mov bx,0
    mov cx,10h
    s:
    mov ax,ds:[bx]
    add ax,ds:[bx+10h]
    mov ds:[bx+20h],ax
    inc bx
    loop s

    mov ah, 4ch
    int 21h
code ends
end start

反汇编:

 

内存情况:

 

实验任务4:

assume cs:code

data1 segment
    dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends 

data2 segment
    dw 8 dup(?)
data2 ends

code segment
start:
    
    mov ax, data1
    mov ds, ax
    mov ax, data2
    mov es, ax
    mov ss, ax
    mov sp, 32

    mov bx, 0
    mov cx, 8
s1: push [bx]
    add bx, 2
    loop s1

    mov bx,16
    mov cx, 8
s2: pop  [bx]
    add bx, 2
    loop s2

    mov ah, 4ch
    int 21h
code ends
end start

结果:

内存情况:

 

 

实验任务5:

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 2, 3, 4, 5, 6
data ends

code segment
start:
        mov ax, data
        mov ds, ax

        mov ax, 0b800H
        mov es, ax

        mov cx, 5
        mov si, 0
        mov di, 0f00h
s:      mov al, [si]
        and al, 0dfh
        mov es:[di], al
        mov al, [5+si]
        mov es:[di+1], al
        inc si
        add di, 2
        loop s

        mov ah, 4ch
        int 21h
code ends
end start

结果:

 25行之后27行之前

 源程序的功能是打印大写彩色的NUIST

第4行用来设置显示字符的颜色

 

实验任务6:

assume cs:code, ds:data
data segment
    db 'Pink Floyd      '
    db 'JOAN Baez       '
    db 'NEIL Young      '
    db 'Joan Lennon     '
data ends

code segment
start:
   mov ax, data
   mov ds, ax

   mov cx, 64
   mov bx, 0
s: or  [bx], byte ptr 20h
   inc bx
   loop s

   mov ah, 4ch
   int 21h
code ends
end start

结果:

 

 

实验任务7:

assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979' 
    dw  16, 22, 382, 1356, 2390
    dw  3, 7, 9, 13, 28 
data ends

table segment
    db 5 dup( 16 dup(' ') )  ;
table ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, table
    mov es, ax

    mov cx, 5
    mov bx, 0
    mov si, 0
s1: mov ax, [si]
    mov es:[bx], ax
    mov ax, [si+2]
    mov es:[bx+2], ax
    add bx, 16
    add si, 4
    loop s1

    mov cx, 5
    mov bx, 5
    mov si, 20
s2: mov ax, [si]
    mov es:[bx], ax
    mov ax, 0000h
    mov es:[bx+2], ax
    add bx, 16
    add si, 2
    loop s2

    mov cx, 5
    mov bx, 10
    mov si, 30
s3: mov ax, [si]
    mov es:[bx], ax
    add bx, 16
    add si, 2
    loop s3

    mov cx, 5
    mov si, 5
s4: mov ax, es:[si]
    mov bl, es:[si+5]
    div bl
    mov es:[si+8], al
    add si, 16
    loop s4

    mov ah, 4ch
    int 21h
code ends
end start

结果:

 

实验总结

通过这次的实验我更加理解了数据存储在内存中的形式,理解了db,dw的不同。也知道了cs ds等数据,程序存储调用方式的不同。

 

posted @ 2021-11-07 20:13  0158李国龙  阅读(70)  评论(3编辑  收藏  举报