| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
assume cs:code,ds:data,ss:stack,es:extend 
data segment          ;初始数据放数据段 
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983 
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992 
dd 1993,1994,1995 
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 
dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
dd 11542,14430,15257,17800 
dd 21 dup(0) 
data ends 
extend segment               ;扩展段存放转化好的字符串,每个字符串以0结尾 
dw 256 dup(0) 
extend ends 
stack segment              ;定义栈段 
dw 128 dup(0) 
stack ends 
code segment 
start:mov ax,data 
      mov ds,ax 
   mov ax,extend 
   mov es,ax 
   mov ax,stack 
   mov ss,ax 
   mov sp,128 
   mov si,0 
   mov di,0               ;初始化数据 
    
   push dx 
   push ax 
   push si 
   mov cx,21 
 s999:mov ax,84[si] 
   mov dx,84[si+2] 
   div word ptr 168[si] 
   mov word ptr 252[si],ax 
   add si,4 
   loop s999  
   pop si 
   pop ax 
   pop dx                 ;s999循环主要作用:把最后一项数据求出来放到初始数据段里 
    
   mov cx,84              ;所有需要转化的数据次数 
   s0:mov ax,ds:[si] 
   mov dx,ds:[si+2] 
   call dtoc               ;调用转化字符串的子程序3 
   add si,4 
   loop s0                 ;最外面的循环 
   
  ;以下指令是把数据显示出来 
   
  mov dh,5               ;第5行开始      
     mov dl,3               ;第3列开始 
  mov cl,2             ;颜色为绿色 
  mov di,0 
   
  mov cx,4 
lie:push cx                      ;lie循环主要作用:把四列分四次显示出来 
   
      mov cx,21 
    hang:push cx                 ;hang循环主要作用:把第一列21个年份分21次显示出来 
         mov cl,2 
         call show_str  
         inc dh 
      inc di 
      pop cx 
         loop hang 
  
 mov dh,5                 
 add dl,0ah               
 pop cx 
 loop lie 
  mov ax,4c00h            ;程序到这里结束 
  int 21h 
    
    
show_str:mov ax,0b800h            ;解决显示的子程序1 
         mov ds,ax 
   mov si,0                 ;初始化子程序数据 
    
   mov ah,0 
   mov al,0a0h 
   dec dh 
   mul dh             ;计算出行偏移 
   mov si,ax       
    
   mov ah,0 
   mov al,2h 
   dec dl 
   mul dl            ;计算出列偏移 
   add si,ax         ;行与列加起来合成一个偏移地址 
    
   inc dh 
   inc dl 
    
  mov bl,cl          ;把颜色属性给bl 
     
   todo:mov cl,es:[di] 
        mov ch,0 
  jcxz ok            ;判断si的值是否为0,是就跳转到OK,不是就执行下面指令 
  mov al,es:[di] 
  mov ds:[si],al     ;把字符串的值赋值给显存,显示出来 
  mov ds:1h[si],bl   ;把颜色属性的值赋值给显存,显示出来 
  inc di 
  add si,2 
  jmp short todo 
    
   ok: 
   ret 
    
    
dtoc:push ax            ;解决字符串转换的子程序3 
     push bx 
  push cx 
  push dx 
  push si             
   
  mov si,0           ;si用于记录位数 
  s1:call divdw         ;调用不会除法溢出子程序2 
     mov bx,cx          ;把余数给bx 
  mov cx,ax          ;把商给cx 
  jcxz ok1 
  add bx,30h         ;余数加30H变ASCII值 
  push bx            ;余数入栈 
  inc si              
  jmp short s1 
   
 ok1:add bx,30h 
     push bx 
  inc si 
   
  mov cx,si       ;把si记录的位数给cx作为循环次数 
  s2:pop ax          ;把入栈的余数逆序出栈 
  mov es:[di],al  ;把转化好的每个位的ASCII值给ES段里 
  inc di 
  loop s2 
    
   inc di 
   mov byte ptr es:[di],0      ;每个字符串以一个0结尾 
    
    
      pop si 
   pop dx 
   pop cx 
   pop bx 
   pop ax                
      ret 
   
divdw:mov cx,0ah          ;解决除法溢出的子程序2 
      push ax 
      mov ax,dx 
   mov dx,0 
   div cx 
   mov bx,ax 
   pop ax 
   div cx 
   mov cx,dx 
   mov dx,bx 
   ret 
    
code ends 
end start 
 
 |   
 
 
 
 |