組合語言(王爽第三版)實驗7 定址方式在結構化資料訪問中的應用
阿新 • • 發佈:2018-12-31
這個實驗我自己摸索了好幾個小時才弄出來,最後想通了發現自己把問題想複雜了。
1、個人認為最簡單的方法
assume cs:code,ds:data 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' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2558,2793,4037,5635,8226 dw 11542,14430,15257,17800 data ends table segment db 21 dup ('year summ ne ?? ') table ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax ;初始化變數 mov bx,0 ;table 段的行 mov si,0 ;操作年份、收入資料的變數 mov di,0 ;操作僱員數的變數 mov cx,21 s0: ;年份存入table段 mov ax,[si] mov es:[bx],ax mov ax,[si+2] mov es:[bx+2],ax ;收入存入table段 mov ax,[si+84] mov es:[bx+5],ax mov dx,[si+86] mov es:[bx+7],dx ;僱員數存入table段 mov bp,word ptr [di+168] mov es:[bx+10],bp ;人均收入存入table段 div bp mov es:[bx+13],ax add bx,16 add si,4 add di,2 loop s0 mov ax,4c00h int 21h code ends end start
這個實驗重點是:對資料的定址方式,以及合理使用暫存器。
推薦一篇文章:https://www.cnblogs.com/Base-Of-Practice/articles/6883907.html
對上面這兩點講的比較細。弄清楚了這兩點,再寫程式碼就清楚了。
2、我第一次寫的程式碼
表示程式碼邏輯再次看自己都看不懂
:(
哈哈。當時我是想盡量用到那個實驗之前學到的所有知識點。事實也是如此我用到了之前學過的絕大部分知識。雖然最後程式碼邏輯複雜,但是收穫滿滿。
assume cs:code,ds:data,ss:stack stack segment db 200 dup(0) stack ends 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' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2558,2793,4037,5635,8226 dw 11542,14430,15257,17800 data ends table segment db 21 dup ('year summ ne ?? ') table ends code segment start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov ax,table mov es,ax mov di,0 ;全域性讀取資料的索引變數 mov bx,0 ;表格行 push 0 ;先將讀取僱員數時的索引變數入棧 mov cx,21 s0: mov si,0 ;表格列 push di push cx mov cx,4 ;年份 s1: mov ax,[di] mov es:[bx+si],ax inc si inc di loop s1 pop cx ;分別用ax、dx儲存收入的高四位和第四位 mov si,0 pop di mov ax,[di+84] mov es:[bx+5+si],ax add si,2 add di,2 mov dx,[di+84] mov es:[bx+5+si],dx add di,2 ;算出人均收入 pop si div word ptr [si+168] ;僱員數存入table段 mov dx,word ptr [si+168] mov es:[bx+10],dx add si,2 push si ;人均收入存入table段 mov es:[bx+13],ax add bx,16 loop s0 mov ax,4c00h int 21h code ends end start