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

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

這個實驗我自己摸索了好幾個小時才弄出來,最後想通了發現自己把問題想複雜了。


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