1. 程式人生 > 其它 >組合語言(第3版,王爽著):實驗7 定址方式在結構化資料訪問中的應用

組合語言(第3版,王爽著):實驗7 定址方式在結構化資料訪問中的應用

  • 思路:

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 段一行中,元素之間的表示不是很規律,因此每個迴圈直接操作一整行相關的資料。
對於 雙字 型別的資料,需要分為兩次來操作(高地址和低地址)。

  • 完成的程式如下:
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
  • 除錯過程: