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

一、实验目的

1. 理解和掌握8086多个逻辑段的汇编源程序

2. 理解和熟练应用灵活的寻址方式

3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用

4. 掌握使用debug调试8086汇编程序的方法

二、实验准备

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

三,实验内容

1

 

 

 

(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = _076B___, 寄存器(CS) = __076C__

(2假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。

2.

     

 

          

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = _076B___, 寄存器(CS) = __076C__

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。

3.

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076A__,寄存器(SS) = __076C__,寄存器(CS) = __076E__。

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-4__,stack的段地址是 __X-2__。

4.

 

   

① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = __076C__,寄存器(SS) = __076E__,寄存器(CS) = __076A__。

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__,stack的段地址是__X+4__。

5.

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __2*[N/16] B_([]为向上取整)__。

 

     程序task1_4仍然可以正确执行。不用start指明程序入口时,程序会默认从代码的第一行进行读取。

 

三,

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

s:  mov dl, [bx]
    add dl, [16+bx]
    mov [32+bx], dl
    inc bx
    loop s

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

 反汇编:

 

 相加前:

 

 相加后:

 

 四,

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

s1:
    push [bx]
    add bx, 2
    loop s1

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

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

 反汇编:

加载前:

 

五,

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

 

 

g命令一次性执行到程序返回前

 

 

源代码中line19的作用是: 将小写字母转换成大写字母

 源代码中db 2,3,4,5,6 --> 改成: db 5 dup(2)

 

源代码中data段line4的字节数据的用途是:line4的作用是设置颜色

assume cs:code, ds:data, ss:stack

data segment
    db 'Pink Floyd      '
    db 'JOAN Baez       '
    db 'NEIL Young      '
    db 'Joan Lennon     '
data ends

stack segment
    dw 1 dup(?)
stack 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 bx,0
    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

 加载:

 

 反汇编:

 

结果:

 

七,

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

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

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

stack segment
    dw 1 dup(?)
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,1
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax

    mov di,0;data

;1
    mov bx,0;table
    mov si,0;table
    mov cx,5
year:
    push cx
    mov cx,4

year2:
    mov al,ds:[di]
    mov es:[bx+si],al
    inc si
    inc di
    loop year2

    pop cx
    add bx,10h
    mov si,0
    loop year

;2
    mov bx,0
    mov si,5
    mov cx,5
income:
    push cx
    mov cx,4

income2:
    mov al,ds:[di]
    mov es:[bx+si],al
    inc si
    inc di
    loop income2

    pop cx
    add bx,10h
    mov si,5
    loop income

;3
    mov bx,0
    mov si,10
    mov cx,5
num:
    push cx
    mov cx,2

num2:
    mov al,ds:[di]
    mov es:[bx+si],al
    inc si
    inc di
    loop num2

    pop cx
    add bx,10h
    mov si,10
    loop num

;4
    mov bx,0
    mov si,5
    mov cx,5
cal:
    mov ax,word ptr es:[bx+si]
    add si,2
    mov dx,word ptr es:[bx+si]
    add si,3
    div word ptr es:[bx+si]
    add si,3
    mov word ptr es:[bx+si],ax

    add bx,10h
    mov si,5
    loop cal

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

 调试截图:

 

 在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存

 

 

 

 

 

 

 

 

 

posted @ 2021-11-08 20:21  caiyacaiya  阅读(20)  评论(3编辑  收藏  举报