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

一、实验目的
1. 理解和掌握8086多个逻辑段的汇编源程序
2. 理解和熟练应用灵活的寻址方式
3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用
4. 掌握使用debug调试8086汇编程序的方法

二、实验准备
复习教材5-8章:
包含多个逻辑段的汇编源程序结构
寻址方式
汇编指令loop, div用法

三、实验内容

1. 实验任务1
此实验任务中,包含4个子任务。逐一实践,结合实践观察、验证,回答问题。
任务1-1
对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =
_076B___, 寄存器(CS) = _076C___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2___, stack的段地址是_X-1___。

 

任务1-2
对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =
_076B___, 寄存器(CS) = _076C___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2___, stack的段地址是_X-1___。

 

任务1-3
对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =
_076C___, 寄存器(CS) = _076E___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4___, stack的段地址是_X-2___。

 

任务1-4
对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

 ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076C___, 寄存器(SS) =
_076E__, 寄存器(CS) = _076A___
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2___, stack的段地址是_X+4___。

 

任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __16 × [N / 16] B__。

xxx segment
    db N dup(0)
xxx ends

 

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。

程序task1_4.asm可以正确执行,因为end start指明了程序从start开始执行,而只有task1_4.asm的程序段在最上面.

 

 

2. 实验任务2
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数
据03 04。

assume cs:code

code segment
start:
    mov ax,0b800h
    mov ds,ax
    mov ax,0403h
    mov bx,0f00h
    mov cx,50h
s:
    mov [bx],ax
    add bx,2
    loop s
    
    mov ah,4ch
    int 21h
code ends
end start

 

运行截图: 

 

3. 实验任务3

要求:
① 编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。
② 在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1,
data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。

完整代码如下:

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,0ah
s:mov ax,[bx]
   add ax,[bx+10h]
   mov [bx+20h],ax
   inc bx
   loop s
    
    mov ah,4ch
    int 21h
code ends
end start

 

 

编译运行截图:

 

运行之前:

 

 

运行之后:

 

 

 

 

 

 

4. 实验任务4

要求:
① 补全程序,实现把逻辑段data1中的8个字数据逆序存储到逻辑段b中。
② 汇编、连接后,在debug中加载程序,运行到line15程序退出前,使用d命令查看数据段data2对应的
内存空间,确认是否实现题目要求。

assume cs:code

data1 segment
  dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends
data2 segment
  dw 8 dup(0)
data2 ends
code segment

start: 
mov ax,data1
mov ds,ax
mov bx,0
mov cx,8
s1: 
push [bx]
add bx,2
loop s1
mov ax,data2
mov ds,ax
mov bx,0
mov cx,8
s2: 
pop [bx]
add bx,2
loop s2

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

 

  

执行前:

 

 执行后:

 

 数据已经被逆序存放在data2处

 

5. 实验任务5

源码如下:

assume cs:code, ds:data
data segment
        db 'Nuist'
        ;db 2, 3, 4, 5, 6
        db 5 dup(2)
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

 

阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指
令的功能。
(1)对程序进行汇编、链接,得到可执行文件,运行并观察结果。
(2)使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察
结果。
(3)源代码中line19的作用是?
(4)修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。

db 2,3,4,5,6 
--> 改成:
db 5 dup(2)  或 db 5 dup(5)

(1)运行结果为:

 

 (2)返回之后运行结果为:

 

 (3)line19的作用为输出的大小写转换

(4)修改后的运行结果为

 

 所以line4的作用是改变输出颜色

 

6. 实验任务6

要求:
① 补全程序,将data段中的每行第一个单词从大写->小写。
② 在debug中加载程序,反汇编,执行到line13退出前,用d命令查看data段对应的内存空间,确认每
行第一个单词已经由大写->小写。

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,stack
mov ss,ax
mov sp,1

mov ax,data
mov ds,ax

mov ax,data
mov es,ax
mov cx,4

s:
push cx
mov cx,4

s2:
mov al,es:[bx]
or al,20h
mov es:[bx],al
inc bx
loop s2

pop cx
mov ax,es
inc ax
mov es,ax

loop s


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

 

编译运行后查看:

 

 

 完成大小写转换

 

7. 实验任务7

要求:
① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。
表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用
空格间隔。

② 汇编、连接后,在debug中加载、调试程序。灵活、合理使用u命令、g命令、d命令,显示刚开始逻
辑段table的数据信息,以及,结构化存入数据后,数据段table的数据信息,确认实现题目要求。

 源代码:

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 bx, 0
    mov si, 0
    mov cx, 5

s0:
    mov ax, [si]    
    mov es:[bx], ax
    mov ax, [si+2]
    mov es:[bx+2], ax
    add si, 4
    add bx, 10h
    loop s0

    mov bx, 0 
    mov si, 14h
    mov cx, 5

s1:
    mov ax, [si]
    mov es:[bx+5], ax
    mov ax, 0
    mov es:[bx+5+2], ax
    add si, 2
    add bx, 10h
    loop s1

    mov bx, 0 
    mov si, 1eh
    mov cx, 5

s2:
    mov ax,[si]
    mov es:[bx+0ah], ax
    add si, 2
    add bx, 10h
    loop s2

    mov bx, 0
    mov cx, 5

s3:
    mov ax, es:[bx+5]
    mov dx, es:[bx+5+2]
    div word ptr es:[bx+0ah]
    mov es:[bx+0dh], ax
    add bx, 10h
    loop s3
    
    mov ah, 4ch
    int 21h
code ends
end start

 

 反汇编:

原始数据:

 

结构化存入数据:

 

 

posted @ 2021-11-09 10:40  嘉嘉组豪  阅读(99)  评论(2)    收藏  举报