| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 purplenight 于 2016-1-12 20:43 编辑  
- assume cs:code,ds:data,es:table
 
  
- data segment
 
 -         db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
 
 -         db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
 
 -         db '1989', '1990', '1991', '1992', '1993', '1994', '1995'
 
 -         
 
 -         dd 16, 22, 382, 1356, 2390, 8000, 16000
 
 -         dd 24486, 50065, 97479, 140417, 197514, 345980, 590827
 
 -         dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5837000
 
 -         
 
 -         dw 3, 7, 9, 13, 28, 38, 130
 
 -         dw 220, 476, 778, 1001, 1442, 2258, 2793
 
 -         dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
 
 - data ends
 
  
- table segment
 
 -         db 21 dup ('year summ ne ?? ')
 
 - table ends
 
  
- new segment
 
 - ;       db 672 dup(0)
 
 -         db 21 dup('year            7       5      ', 0)
 
 - new ends 
 
  
- code segment
 
 - start:  mov ax, data
 
 -         mov ds, ax
 
 -         mov ax, table
 
 -         mov es, ax
 
  
-         mov bx, 0
 
 -         mov si, 0
 
 -         mov di, 0
 
 -         
 
 -         push dx ;S1循环中会被使用
 
 -         push di
 
 -         push si
 
 -         push bx
 
 -         push ax
 
 -         mov cx, 21
 
 - S1:     mov ax, [bx].0h
 
 -         mov dx, [bx].2h
 
 -         mov es:[si].0h, ax
 
 -         mov es:[si].2h, dx
 
 -         
 
 -         mov ax, [bx].54h
 
 -         mov dx, [bx].56h
 
 -         mov es:[si].5h, ax
 
 -         mov es:[si].7h, dx
 
  
-         div word ptr [di].0A8h ;ds:0A8h[di]
 
 -         mov es:[si].0dh, ax
 
 -         
 
 -         mov ax, [di].0A8h
 
 -         mov es:[si].0Ah, ax
 
 -         
 
 -         add di, 2 
 
 -         add bx, 4 
 
 -         add si, 16
 
 -         loop S1
 
 -         
 
 -         pop ax ;table偏移首地址
 
 -         pop bx ;0
 
 -         pop si ;0
 
 -         pop di ;0
 
 -         pop dx ;循环中dx值被修改了 
 
 -         
 
 - ;这一部分主要作用将table16*21内存区间的数据按照如下格式转换
 
 - ;   table 16*21
 
 - ;   1466:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
 
 - ;   1466:0010  31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
 
 - ;                             __ __ __ __ 转换为10进制
 
 - ;   new  32*21                dx=h  ax=L
 
 - ;   1466:00xx  31 39 37 35 00 00 00 00 00 00 __ __ __ __  
 
 - ;
 
 -         mov ax, new
 
 -         mov ds, ax
 
 -         
 
 -         push dx 
 
 -         push di
 
 -         push si
 
 -         push bx
 
 -         push ax
 
 -         
 
 -         mov si, 0
 
 -         mov bx, 0
 
 -         call dtoc
 
 -         ;数据复制完成后执行over处代码       
 
 - over:   pop ax
 
 -         pop bx
 
 -         pop si
 
 -         pop di
 
 -         pop dx
 
 - ;屏幕输出
 
 -         mov ax, 0b800h
 
 -         mov es, ax
 
 -         
 
 -         mov si, 0
 
 -         mov di, 0
 
 -         mov bx, 0280h;01e0h
 
 -         mov al, 02h
 
 -         mov cx, 21
 
 - s:      push cx   
 
 - sss:    mov cl, ds:[si]
 
 -         jcxz ookk
 
 -         
 
 -         mov es:[bx+di], cl
 
 -         mov es:[bx+di].01h, al
 
 -         
 
 -         add di, 2
 
 -         inc si
 
 -         jmp short sss ;s1重复吗 确实 标签名不能重复
 
 - ookk:
 
 -         inc si
 
 -         mov di, 0
 
 -         add bx, 160
 
 -         pop cx
 
 -         loop s
 
 - ;成功运行2015 9-10 18:07
 
 - ;09-08: 20:10-22-25
 
 - ;09-10: 09:00-13:30 14:00-18:07
 
 - ;共计耗时: 10:52半天时间
 
 -         
 
 -         mov ax, 4c00h
 
 -         int 21h
 
 - dtoc:   mov cx, 21
 
 - copy9x: mov ax, es:[si]
 
 -         mov ds:[bx+si], ax
 
 -         mov ax, es:[si+2]
 
 -         mov ds:[bx+si+2], ax
 
 -         add bx, 16
 
 -         add si, 16
 
 -         loop copy9x
 
 -         
 
 -                     ;循环结束后cx=0, si=16*20, bx=16*20, ax= 3935
 
  
-         mov ax, 0   ; ???要不要ax=0
 
 -         mov si, 0   ;控制数据复制来源
 
 -         mov bx, 0
 
 -         mov di, 6   ;完成向new写字符串
 
  
- ; 设计将dword型数据转变为十进制的字符串 
 
 -         mov cx, 21  ;控制数据复制次数
 
 - copysum:push cx
 
 -         mov cx, 0ah
 
 -         mov ax, es:[si].5h
 
 -         mov dx, es:[si].7h
 
 -         ;push si
 
 -         ;push bx      ;divdw中需要使用与修改bx, 所以要安全的保存
 
 -         mov di, 6    ;push di ;divdw中需要使用与修改bx, 所以要安全的保存
 
 -         call divdw
 
 -         
 
 -         ;pop bx  ;还原被divdw修改的bx值
 
 -         ;push si
 
 -         add bx, 32   ;  显示错误是这个原因吗30 ;指向下一个保存字符串首地址
 
 -         add si, 16 
 
 -         pop cx
 
 -         loop copysum
 
 - ;       ret
 
  
-         mov ax, 0   ; ???要不要ax=0
 
 -         mov si, 0   ;控制数据复制来源
 
 -         mov bx, 0
 
 -         mov di, 4   ;完成向new写字符串
 
 -         ;将dword型数据转变为十进制的字符串    
 
 -         mov cx, 21  ;控制数据复制次数
 
 -         call copyne
 
 -         
 
 -         mov ax, 0   ; ???要不要ax=0
 
 -         mov si, 0   ;控制数据复制来源
 
 -         mov bx, 0
 
 -         mov di, 2   ;完成向new写字符串
 
 -         ;将dword型数据转变为十进制的字符串    
 
 -         mov cx, 21  ;控制数据复制次数
 
 -         call copyend
 
 -         
 
 -         ret
 
 - divdw:  push si
 
 -         push bx
 
 -         push ax
 
 -         mov cx, 0ah
 
 -         mov ax, dx
 
 -         mov dx, 0
 
 -         div cx
 
 -         mov bx, ax
 
 -         
 
 -         pop ax           ;出栈ax
 
 -         div cx
 
 -         add dx, 30h       ; 要注意0ah=10 10h=16
 
  
-         mov si, bx       ;将原来的值保存
 
 -         pop bx
 
 -         mov ds:[bx+di].0ah, dl  ; mov cx, dx  ; 保存余数
 
 -         push bx
 
 -         mov bx, si
 
  
-         mov dx, bx  ;dx 高16位 ax=低16位
 
 -         ;因为bx取代dx原来的值包括dx+30h
 
 -         ;无须push dx
 
  
-         push cx ;将cx=10
 
 -         mov cx, ax ;将ax是否商为0赋给cx, 判断是否跳出循环
 
 -         jcxz savesum; cx=0跳到savsum
 
 -         
 
 -         pop cx;当ax=/= 0, 恢复原来cx值
 
 -         dec di
 
 -         pop bx;push bx错了
 
 -         pop si;push si
 
 -         loop divdw
 
  
- savesum:pop cx ;一定要注意push与pop是如何对应
 
 -         pop bx
 
 -         pop si
 
 -         ret;
 
  
- copyne: push cx
 
 -         mov cx, 0ah
 
 -         mov ax, es:[si].0ah
 
 - nene:   mov dx, 0
 
 -         div cx
 
 -         add dx, 30h
 
 -         mov ds:[bx+di].014h, dl
 
 -         dec di
 
 -         mov cx, ax
 
 -         jcxz ok   ;在这里如果不加上下边语句会错误
 
 -         mov cx, 0ah     
 
 -         jmp short nene;loop nene
 
 - ok:     ;
 
 -         mov di, 4 ; mov di, 0
 
 -         add si, 16
 
 -         add bx, 32
 
 -         pop cx
 
 -         loop copyne
 
 -         ret
 
 -         
 
 - copyend:push cx
 
 -         mov cx, 0ah
 
 -         mov ax, es:[si].0dh
 
 - nenene: mov dx, 0
 
 -         div cx
 
 -         add dx, 30h
 
 -         mov ds:[bx+di].01ch, dl
 
 -         dec di
 
 -         mov cx, ax
 
 -         jcxz ok1   ;在这里如果不加上下边语句会错误
 
 -         mov cx, 0ah     
 
 -         jmp short nenene;loop nene
 
 - ok1:     ;
 
 -         mov di, 2 ;mov di, 0
 
 -         add si, 16
 
 -         add bx, 32
 
 -         pop cx
 
 -         loop copyend
 
 -         ret
 
 -         
 
 - code ends
 
 - end start
 
  复制代码 |   
 
 
 
 |