鱼C论坛

 找回密码
 立即注册
查看: 1765|回复: 2

[技术交流] 汇编 课程设计1 大家别说我代码哪不对, 看看就好,很累了

[复制链接]
发表于 2015-9-10 18:51:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 purplenight 于 2016-1-12 20:43 编辑
  1. assume cs:code,ds:data,es:table

  2. data segment
  3.         db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
  4.         db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
  5.         db '1989', '1990', '1991', '1992', '1993', '1994', '1995'
  6.         
  7.         dd 16, 22, 382, 1356, 2390, 8000, 16000
  8.         dd 24486, 50065, 97479, 140417, 197514, 345980, 590827
  9.         dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5837000
  10.         
  11.         dw 3, 7, 9, 13, 28, 38, 130
  12.         dw 220, 476, 778, 1001, 1442, 2258, 2793
  13.         dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
  14. data ends

  15. table segment
  16.         db 21 dup ('year summ ne ?? ')
  17. table ends

  18. new segment
  19. ;       db 672 dup(0)
  20.         db 21 dup('year            7       5      ', 0)
  21. new ends

  22. code segment
  23. start:  mov ax, data
  24.         mov ds, ax
  25.         mov ax, table
  26.         mov es, ax

  27.         mov bx, 0
  28.         mov si, 0
  29.         mov di, 0
  30.         
  31.         push dx ;S1循环中会被使用
  32.         push di
  33.         push si
  34.         push bx
  35.         push ax
  36.         mov cx, 21
  37. S1:     mov ax, [bx].0h
  38.         mov dx, [bx].2h
  39.         mov es:[si].0h, ax
  40.         mov es:[si].2h, dx
  41.         
  42.         mov ax, [bx].54h
  43.         mov dx, [bx].56h
  44.         mov es:[si].5h, ax
  45.         mov es:[si].7h, dx

  46.         div word ptr [di].0A8h ;ds:0A8h[di]
  47.         mov es:[si].0dh, ax
  48.         
  49.         mov ax, [di].0A8h
  50.         mov es:[si].0Ah, ax
  51.         
  52.         add di, 2
  53.         add bx, 4
  54.         add si, 16
  55.         loop S1
  56.         
  57.         pop ax ;table偏移首地址
  58.         pop bx ;0
  59.         pop si ;0
  60.         pop di ;0
  61.         pop dx ;循环中dx值被修改了
  62.         
  63. ;这一部分主要作用将table16*21内存区间的数据按照如下格式转换
  64. ;   table 16*21
  65. ;   1466:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
  66. ;   1466:0010  31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
  67. ;                             __ __ __ __ 转换为10进制
  68. ;   new  32*21                dx=h  ax=L
  69. ;   1466:00xx  31 39 37 35 00 00 00 00 00 00 __ __ __ __  
  70. ;
  71.         mov ax, new
  72.         mov ds, ax
  73.         
  74.         push dx
  75.         push di
  76.         push si
  77.         push bx
  78.         push ax
  79.         
  80.         mov si, 0
  81.         mov bx, 0
  82.         call dtoc
  83.         ;数据复制完成后执行over处代码      
  84. over:   pop ax
  85.         pop bx
  86.         pop si
  87.         pop di
  88.         pop dx
  89. ;屏幕输出
  90.         mov ax, 0b800h
  91.         mov es, ax
  92.         
  93.         mov si, 0
  94.         mov di, 0
  95.         mov bx, 0280h;01e0h
  96.         mov al, 02h
  97.         mov cx, 21
  98. s:      push cx   
  99. sss:    mov cl, ds:[si]
  100.         jcxz ookk
  101.         
  102.         mov es:[bx+di], cl
  103.         mov es:[bx+di].01h, al
  104.         
  105.         add di, 2
  106.         inc si
  107.         jmp short sss ;s1重复吗 确实 标签名不能重复
  108. ookk:
  109.         inc si
  110.         mov di, 0
  111.         add bx, 160
  112.         pop cx
  113.         loop s
  114. ;成功运行2015 9-10 18:07
  115. ;09-08: 20:10-22-25
  116. ;09-10: 09:00-13:30 14:00-18:07
  117. ;共计耗时: 10:52半天时间
  118.         
  119.         mov ax, 4c00h
  120.         int 21h
  121. dtoc:   mov cx, 21
  122. copy9x: mov ax, es:[si]
  123.         mov ds:[bx+si], ax
  124.         mov ax, es:[si+2]
  125.         mov ds:[bx+si+2], ax
  126.         add bx, 16
  127.         add si, 16
  128.         loop copy9x
  129.         
  130.                     ;循环结束后cx=0, si=16*20, bx=16*20, ax= 3935

  131.         mov ax, 0   ; ???要不要ax=0
  132.         mov si, 0   ;控制数据复制来源
  133.         mov bx, 0
  134.         mov di, 6   ;完成向new写字符串

  135. ; 设计将dword型数据转变为十进制的字符串
  136.         mov cx, 21  ;控制数据复制次数
  137. copysum:push cx
  138.         mov cx, 0ah
  139.         mov ax, es:[si].5h
  140.         mov dx, es:[si].7h
  141.         ;push si
  142.         ;push bx      ;divdw中需要使用与修改bx, 所以要安全的保存
  143.         mov di, 6    ;push di ;divdw中需要使用与修改bx, 所以要安全的保存
  144.         call divdw
  145.         
  146.         ;pop bx  ;还原被divdw修改的bx值
  147.         ;push si
  148.         add bx, 32   ;  显示错误是这个原因吗30 ;指向下一个保存字符串首地址
  149.         add si, 16
  150.         pop cx
  151.         loop copysum
  152. ;       ret

  153.         mov ax, 0   ; ???要不要ax=0
  154.         mov si, 0   ;控制数据复制来源
  155.         mov bx, 0
  156.         mov di, 4   ;完成向new写字符串
  157.         ;将dword型数据转变为十进制的字符串   
  158.         mov cx, 21  ;控制数据复制次数
  159.         call copyne
  160.         
  161.         mov ax, 0   ; ???要不要ax=0
  162.         mov si, 0   ;控制数据复制来源
  163.         mov bx, 0
  164.         mov di, 2   ;完成向new写字符串
  165.         ;将dword型数据转变为十进制的字符串   
  166.         mov cx, 21  ;控制数据复制次数
  167.         call copyend
  168.         
  169.         ret
  170. divdw:  push si
  171.         push bx
  172.         push ax
  173.         mov cx, 0ah
  174.         mov ax, dx
  175.         mov dx, 0
  176.         div cx
  177.         mov bx, ax
  178.         
  179.         pop ax           ;出栈ax
  180.         div cx
  181.         add dx, 30h       ; 要注意0ah=10 10h=16

  182.         mov si, bx       ;将原来的值保存
  183.         pop bx
  184.         mov ds:[bx+di].0ah, dl  ; mov cx, dx  ; 保存余数
  185.         push bx
  186.         mov bx, si

  187.         mov dx, bx  ;dx 高16位 ax=低16位
  188.         ;因为bx取代dx原来的值包括dx+30h
  189.         ;无须push dx

  190.         push cx ;将cx=10
  191.         mov cx, ax ;将ax是否商为0赋给cx, 判断是否跳出循环
  192.         jcxz savesum; cx=0跳到savsum
  193.         
  194.         pop cx;当ax=/= 0, 恢复原来cx值
  195.         dec di
  196.         pop bx;push bx错了
  197.         pop si;push si
  198.         loop divdw

  199. savesum:pop cx ;一定要注意push与pop是如何对应
  200.         pop bx
  201.         pop si
  202.         ret;

  203. copyne: push cx
  204.         mov cx, 0ah
  205.         mov ax, es:[si].0ah
  206. nene:   mov dx, 0
  207.         div cx
  208.         add dx, 30h
  209.         mov ds:[bx+di].014h, dl
  210.         dec di
  211.         mov cx, ax
  212.         jcxz ok   ;在这里如果不加上下边语句会错误
  213.         mov cx, 0ah     
  214.         jmp short nene;loop nene
  215. ok:     ;
  216.         mov di, 4 ; mov di, 0
  217.         add si, 16
  218.         add bx, 32
  219.         pop cx
  220.         loop copyne
  221.         ret
  222.         
  223. copyend:push cx
  224.         mov cx, 0ah
  225.         mov ax, es:[si].0dh
  226. nenene: mov dx, 0
  227.         div cx
  228.         add dx, 30h
  229.         mov ds:[bx+di].01ch, dl
  230.         dec di
  231.         mov cx, ax
  232.         jcxz ok1   ;在这里如果不加上下边语句会错误
  233.         mov cx, 0ah     
  234.         jmp short nenene;loop nene
  235. ok1:     ;
  236.         mov di, 2 ;mov di, 0
  237.         add si, 16
  238.         add bx, 32
  239.         pop cx
  240.         loop copyend
  241.         ret
  242.         
  243. code ends
  244. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-9-10 18:58:35 | 显示全部楼层
本帖最后由 purplenight 于 2017-11-14 10:21 编辑

上图
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-9-10 18:59:48 | 显示全部楼层
做晚饭去了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表