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

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

 

 

在此时DS=076A,SS=076B,CS=076C
程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。
 
任务1-2
task1_2.asm
在debug中执行到line17结束、line19之前

 

 

在此时DS=076A,SS=076B,CS=076C
程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1。
 
任务1-3
task1-3.asm
在debug中执行到line17结束、line19之前

 

 

在此时DS=076A,SS=076C,CS=076E
程序加载后,code段的段地址是X,则,data段的段地址是X-4, stack的段地址是X-2。
任务1-4
task1-4.asm

 

 

在debug中执行到line17结束、line19之前
 
在此时DS=076C,SS=076E,CS=076A
程序加载后,code段的段地址是X,则,data段的段地址是X+2, stack的段地址是X+4。
 
任务1-5
对于如下定义的段,程序加载后,实际分配给该段的大小是 N字节
将所有伪指令end start改成end
task1_1不能正确执行

 

 task1_2不能正确执行

 

  task1_3不能正确执行

 

 

 task1_4可以正确执行

 

 

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

实验代码task2.asm

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

 补充后的task3.asm源码

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 ds,ax
    mov bx,0
    mov cx,10
    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

 task4.asm源码

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等数据,程序存储调用方式的不同.同时我复习了并且巩固了div的用法,在32位除以16位以及16位除以8位时div的区别。而且通过将end start的start去除的实验,我知道了start的作用,以及去掉后可能造成的影响.

posted @ 2021-11-07 16:42  居林超  阅读(50)  评论(2)    收藏  举报