彙編語言程序設計

尋址方式在結構化數據訪問中的應用

本文來自王爽著《彙編語言(第三版)》實驗7

問題描述

power idea公司從1975年成立一直到1995年的基本情況如下:

年份 收入(千美元) 僱員(人) 人均收入(千美元)
1975 16 3 ?
1976 22 7 ?
1977 382 9 ?
1995 5937000 17800 ?

編程,將data段中的數據按如下格式寫入到table段中,並計算21年中的人均收入(取整),結果也按照下面的格式保存在table段中。

table段

編程思路

將data段的數據看作多個數組,table中的數據看作一個結構性數據的數組,每個結構型數據中包含多個數據項。
用bx定位每個結構型數據,立即數idata定位數據項,用si定位data段數組元素即可。要用到寄存器相對尋址[bx+idata]。

代碼實現

assume  cs:codesg,ds:data,es:table

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'
  ;偏移地址範圍0-53h,表示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
  ;偏移地址範圍54h-0a7h,表示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
  ;偏移地址範圍0a8h-0d1h,表示21年公司僱員人數的21word型數據
data ends

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

codesg  segment

start:  mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
;---------------保存年份--------------------------------
        mov si,0
        mov bx,0
        mov cx,21
        ;保存年份前兩字節
    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 si,54h
        mov bx,0
        mov cx,21
        ;保存總收入的前兩字節
    s1: mov ax,[si]
        mov es:[bx+5],ax
        ;保存總收入的後兩字節
        mov ax,[si+2]
        mov es:[bx+5+2],ax
        add si,4

        add bx,10h
        loop s1
;----------------保存僱員數------------------------------
        mov si,0a8h
        mov bx,0
        mov cx,21

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

        add bx,10h
        loop s2
;-------------計算並保存人均收入-------------------------

        mov bx,0
        mov cx,21

    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 ax,4c00h
        int 21h

codesg  ends

end start

總結

這裏的彙編程序就相當於C程序中給結構體數組賦值。彙編中的一些尋址方式(比如:[bx+idata],[bx+si],[bx+si+idata])的操作和高級語言中的數組,結構體“太相似”了。因此要完成這個程序並不困難。

另外,明天彙編語言程序設計這門課就要期末考試了,我平時不會在博客上貼上彙編的代碼,今天就算個福利,把自己略顯幼稚的彙編代碼貼上,希望大家都能在考試中取得好成績。

發佈了58 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章