王爽汇编(第三版)实验7

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'
  ;以上是表示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 ?? ')  ;程序目标段,共(16*21)字节
table ends


code segment
start:mov ax,data
 mov ds,ax           ;data数据放在DS
   mov ax,table
 mov es,ax          ;table数据放在ES
 
 mov ax,0            ;ax清零
 mov dx,0            ;dx清零,用于存放年份和总收入的高位
 mov bx,0            ;用于table段的偏移地址
 mov si,0            ;与data段结合,用于年份和总收入偏移地址
 mov di,0            ;与data段结合,用于雇员数据偏移地址
 
 mov cx,21           ;循环次数
s:mov ax,[si]
 mov es:[bx],ax      ;年份低位复制(数据为4个字节,ax只能转移2个字节)
 mov dx,[si+2]
 mov es:[bx+2],dx    ;年份高位复制
 
 mov ax,[si+84]      ;跳过年份数据共84个字节指向总收入
 mov es:[bx+5],ax    ;总收入低位复制
 mov dx,[si+86]
 mov es:[bx+7],dx    ;总收入高位复制(跳过2个低位字节所以分别+2)
 ;注意此时ax+dx 分别存放的是总收入的低位与高位(32位被除数)
 div word ptr [di+168]  ;所以可以先计算人均收入,除数指向员工人数word型数据(16位)
 mov es:[bx+13],ax    ;商放入table段 D 处
 
 mov ax,[di+168]
      mov es:[bx+10],ax    ;员工人数复制放于table段 A 处
 
      add bx,16            ;table段指向下一行
      add si,4             ;指向下一个年份数据
      add di,2             ;指向下一个雇员数据  
 ;年份和总收入都看作是4个字节的字符串,所以可以共用一个变量si
 loop s
 
 mov ax,4c00h
 int 21h
code ends
end start  
  
阅读更多
上一篇游戏外挂的学习步骤
下一篇一个32岁入门的70后程序员给我的启示
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭