已知 data 段:編程
assume cs:codesg 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' # 以上表示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 # 以上表示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 # 以上表示21年公司僱員人數的21個word型數據 data ends table segment db 21 dup ('year summ ne ??') table ends
編程,將 data 段中的數據按以下格式寫入到 table 段中,並計算 21 年中的人均收入(取整),結果也按照下面的格式保存在 table 段中。數組
代碼和分析以下:oop
# 思考兩個問題: 1. 要處理的數據在什麼地方?(數據源在 data 段中; 數據目的在 table 段中) 2. 要處理的數據有多長? # # 將 data 段中的數據看做多個數組; table 段中的數據看做一個數組,數組的每個元素是一個結構體 # # 對 data 段中的數據進行**重排**, 成一個結構體的數組, 只需循環 21 次, 每次完成一個數組結構體元素的賦值 # # [bx].idata[di] 用來定位 table 段 ; [bp + si] 用來定位 data 段 # # 1. 初始化操做: # # 1)取得data段和table的段的起始地址,分別用 ds:si 和 es:di 指向 # 2)初始化cx的值爲21,也就是循環次數爲21 # 3)引入bx,控制si的增量保持爲4。緣由:僱員和人均收入記錄中的每一個數據項長度是2,而其它每一個數據項的 # 長度均爲4,爲了能在一個循環中進行操做,必須使得他們的增量保持一致 # 4)入口地址:標號next: # # 2. 循環體 # # 1)移動年份數據 # 2)移動總收入數據 # 3)sub si,bx # 4)移動僱員數據 # 5)進行除法操做求出人均收入,並移動人均收入 # # 3. 參數修改 # # 1)si增長4,用si指向每一個數據項 # 2)di增長16,用di指向每行 # 3)bx增長2,與sub si,bx配合控制僱員和人均收入兩個數據在data段中的位置 # # 4. 循環控制 # loop next # # 5. 程序返回 # mov ah,4ch # int 21h assume cs:codesg 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' # 以上表示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 # 以上表示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 # 以上表示21年公司僱員人數的21個word型數據data ends 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 ;將源數據和目的數據的段地址記錄在段寄存器中 sub si,si sub di,di ;分別存放兩個數據段的偏移地址, 初始值是 0 mov cx,21 sub bx,bx ;這裏引入bx是爲了很好的控制一次循環事後 si 的增量保持在 4 # 下面移動年份數據, 一次循環須要移動 4 個字節 next: mov ax , ds:[si] mov es:di , ax ;先移動頭 2 個字節 mov ax , ds:[si+2] mov es:[di+2] , ax ;再移動後 2 個字節 mov byte ptr es:[di+4] , 20h ;向目的地的年份數據後面放一個空格(大小爲一個字節) # 下面移動收入數據, 一次循環須要移動 4 個字節 mov ax , ds:[si+84] mov es:[di+5] , ax ;先移動頭 2 個字節 mov ax , ds:[si+86] mov es:[di+7] , ax ;再移動後 2 個字節 mov byte ptr es:[di+9] , 20h ;向目的地的收入數據後面放一個空格(大小爲一個字節) # 下面移動僱員數據, 一次循環須要移動 2 個字節 sub si , bx ;bx 用來補齊 mov ax , ds:[si+168] mov es:[di+10] , ax ;先移動頭 2 個字節 add si , bx ;還原 si mov byte ptr es:[di+12] , 20h ;向目的地的僱員數據後面放一個空格(大小爲一個字節) # 計算平均收入數據 mov dx , ds:[si+86] ; 移動被除數高 16 bit mov ax , ds:[si+84] ; 移動被除數低 16 bit div word ptr es:[di+10] ; 進行除法操做求出人均收入 mov es:[di+13],ax ; ax默認存儲商, bx默認存儲餘數 mov byte ptr es:[di+15],20h add si , 4 add di , 16 ; si-> 0 4 8 12 add bx , 2 ; 若是不加 2 的話, 會遺漏數據--> ; bx-> 0 2 4 6 8 10 12 loop next ; 3 7 9 13 28 38 130 mov ah , 4ch int 21h codesg ends end start