彙編語言實驗七

已知 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 
相關文章
相關標籤/搜索