鱼C论坛

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

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

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

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

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

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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

上图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-9-10 18:59:48 | 显示全部楼层
做晚饭去了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 01:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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