組合語言(第3版,王爽著):實驗7 定址方式在結構化資料訪問中的應用
阿新 • • 發佈:2022-05-26
- 思路:
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 和 遞增2table 段:
因為 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
- 除錯過程: