purplenight 发表于 2015-9-10 18:51:01

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

本帖最后由 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, .0h
      mov dx, .2h
      mov es:.0h, ax
      mov es:.2h, dx
      
      mov ax, .54h
      mov dx, .56h
      mov es:.5h, ax
      mov es:.7h, dx

      div word ptr .0A8h ;ds:0A8h
      mov es:.0dh, ax
      
      mov ax, .0A8h
      mov es:.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:000031 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
;   1466:001031 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
;                           __ __ __ __ 转换为10进制
;   new32*21                dx=hax=L
;   1466:00xx31 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:
      jcxz ookk
      
      mov es:, cl
      mov es:.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:
      mov ds:, ax
      mov ax, es:
      mov ds:, 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:.5h
      mov dx, es:.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:.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:.0ah
nene:   mov dx, 0
      div cx
      add dx, 30h
      mov ds:.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:.0dh
nenene: mov dx, 0
      div cx
      add dx, 30h
      mov ds:.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

purplenight 发表于 2015-9-10 18:58:35

本帖最后由 purplenight 于 2017-11-14 10:21 编辑

上图

purplenight 发表于 2015-9-10 18:59:48

做晚饭去了。
页: [1]
查看完整版本: 汇编 课程设计1 大家别说我代码哪不对, 看看就好,很累了