汇编语言(第3版,王爽著):实验7 寻址方式在结构化数据访问中的应用

实验7 寻址方式在结构化数据访问中的应用

1. 思路:

data 段:
年份的数据:4 * 21 = 84 = 54H
公司年度总收入的数据:4 * 21 = 84 = 54H
雇员的数据:2 * 21 = 42 = 2AH

可以得出下面的关系:
data 段中,“年份”的起始地址为 0 (假设 bx = 0)
“公司年度总收入”的起始地址为 [bx + 54H]
“雇员数”的起始地址为 [bx + 54H + 54H]

一个年份 递增 到下一个年份数据,需要加 4
一个公司年度总收入 递增 到下一个公司年度总收入,需要加 4
一个雇员数 递增 到下一个雇员数,需要加 2
因此需要有两个寄存器来存放 递增4 和 递增2


table 段:
因为 8086CPU 是 16 位结构的 CPU,所以每次能够处理、传输、暂时存储的信息的最大长度是 16 位的。
table 段一行中,元素之间的表示不是很规律,因此每个循环直接操作一整行相关的数据。
对于 双字 类型的数据,需要分为两次来操作(高地址和低地址)。

2. 完成的程序如下:

assume cs:codesg

data segment
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
    db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
    db '1993', '1994', '1995'
    ; 以上是表示 21 年的 21 个字符串

    dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
    dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
    ; 以上是表示 21 年公司总收入的 21 个 dword 型数据

    dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
    dw 11542, 14430, 15257, 17800
    ; 以上是表示 21 年公司雇员人数的 21 个 word 型数据
data ends

table segment
    db 21 dup ('year summ ne ?? ')
table ends

codesg segment
start:  mov ax, data
        mov ds, ax
        mov di, 0           ; data 段 “年份” 和 “公司总收入” 的下标 index
        mov si, 0           ; data 段 “雇员人数” 的下标 index
        mov bx, 0           ; data 段的

        mov ax, table
        mov es, ax
        mov bp, 0           ; table 段的

        mov cx, 21          ; 循环次数为 21 次
    s:
        ; 年份的操作
        mov ax, ds:[bx + 0H + di]
        mov es:[bp + 0H], ax
        mov ax, ds:[bx + 2H + di]
        mov es:[bp + 2H], ax

        ; 公司年度总收入的操作
        mov ax, ds:[bx + 54H + di]           ; ds:[bx + 54H + 0H + di]
        mov es:[bp + 5H], ax
        mov ax, ds:[bx + 56H + di]           ; ds:[bx + 54H + 2H + di]
        mov es:[bp + 7H], ax

        ; 雇员人数的操作
        mov ax, ds:[bx + 0a8H + si]           ; ds:[bx + 54H + 54H + si]
        mov es:[bp + 0aH], ax

        ; 除法操作
        mov ax, ds:[bx + 54H + di]
        mov dx, ds:[bx + 56H + di]
        div word ptr ds:[bx + 0a8H + si]

        ; 人均收入的操作
        mov es:[bp + 0dH], ax

        add di, 4
        add si, 2
        add bp, 10H

        loop s

        mov ax, 4c00H
        int 21H
codesg ends

end start

3. 调试过程:

实验7 调试过程

posted @ 2022-05-26 12:56  夏夜星空晚风  阅读(152)  评论(0编辑  收藏  举报