王爽彙編第三版 實驗七
阿新 • • 發佈:2019-01-26
assume cs:code,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'
;db 位元組型資料,這裡'1975'不是我們所理解的十進位制1975而是字串
;所以每個年份佔4 個位元組,總共佔了21*4=84個位元組
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;db(dword)佔4位元組,所以收入佔了21*4=84位元組
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;dw 每個資料佔2個位元組,共佔21*2=42位元組
data ends
table segment
db 21 dup ('year summ ne ?? ') ;引號裡的字母無所謂後面會被覆蓋這裡只是提示錄入的是什麼資訊
table ends
code segment
start: mov ax,data
mov ds,ax ; ds:0指向data中的第一個資料
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0 ;原來我也想過用棧,但是入棧是反向存入資料,不對,我也不知道用幾個暫存器
;先定義這麼多,多退少補
mov cx,21 ;因為有21行table,其實這一道題也就是湊每一行的內容,然後其他行都是迴圈得到
s: mov ax,[bx]
mov es:[si],ax ;將ds:[bx]的資料放入es:[si]中
mov ax,[bx+2]
mov es:[si+2],ax ;到這裡'1975'放入table第一行它的位置,下面是放空格
mov byte ptr [si+4],20h ;看書上表格可以知道這是第5個位置所以是si+4,ASCII碼空格是20h
mov ax,[bx+84] ;因為收入的資料放在ds:84
mov es:[si+5],ax
mov ax,[bx+86]
mov es:[si+7],ax ;年收入的資料錄入了,下面是空格
mov byte ptr [si+9],20h ;因為ax佔兩個位元組所以是si+9
mov ax,[di+168] ;原本這裡我寫的是[bx+168],但是迴圈到下一行你會發現年份和收入和下一個資料的間隔是4個位元組
mov es:[si+10],ax ;但是僱員數間隔是dw型資料,只有兩個位元組,所以不能用bx表示了
mov byte ptr [si+12],20h
mov ax,[bx+84]
mov dx,[bx+86] ;因為收入是db資料,所以用ax存放低位,dx存放高位資料
div word ptr es:[si+10] ;用dx:ax中的資料除以ds:[di+168]中的資料
mov es:[si+13],ax ;因為商存在ax中,所以把ax中的資料轉到es:[si+13]中
;第一行資料錄入完了,開始下一行,然後看還有哪些資料是需要改動的,哪些是固定不變的
add bx,4 ;bx表示下一個db型別的資料,所以加4
add di,2 ;di表示dw型資料
add si,10h ;表示將es指向下一行資料首地址
loop s
mov ax,4c00h
int 21h
code ends
end start