1. 程式人生 > >王爽彙編第三版 實驗七

王爽彙編第三版 實驗七

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

程式執行前es中的資料情況
程式執行後的es中的資料情況