| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 936 人关注过本帖
标题:求王爽汇编语言 课程设计1 的代码!
取消只看楼主 加入收藏
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
结帖率:100%
收藏
已结贴  问题点数:0 回复次数:3 
求王爽汇编语言 课程设计1 的代码!
跪求,有种被它折磨的遍体鳞伤的感觉……
求大神解救我啊!!!
搜索更多相关主题的帖子: 课程 设计 
2011-05-14 21:57
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
本想写上来的,无奈是个综合题,用好了多之前的代码
真是……

故事还得从这说起

这是一个记录公司信息的程序,分别将年份,总收入,人数,人均收入存入 table 段中
assume cs:codesg
data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '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

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
data ends

table segment
    db 21 dup ('year summ ne ?? ')            ; ?? 是存放要算出的人均收入
table ends

codesg segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov ss,ax
    mov si,0   
    mov bx,0
    mov cx,21
      s:
    mov ax,[bx]
    mov [bp],ax
    mov ax,[bx+2]
    mov [bp+2],ax
    ;存年份
    mov ax,[bx].54h
    mov [bp].5,ax
    mov ax,[bx].56h
    mov [bp].7,ax
    ;存总收入
     mov ax,0a8h[si]
    mov [bp].10,ax
    ;存人数
    mov dx,[bx].56h
    mov ax,[bx].54h
    div word ptr 0a8h[si]
    mov [bp].13,ax   
    ;存人均收入
    add bx,4h
    add bp,10h
    add si,2
    loop s   

    mov ax,4c00h
    int 21h

codesg ends
end start

然后这个两个代码合并后的程序,功能是输入一个十进制数,以及行数,列数,颜色(颜色有对应的二进制数),然后将输入的数据存入彩色显存中,最后把该十进制显示在屏幕上
assume cs:code,ds:data,ss:stack
data segment
    db 0
data ends

stack segment
        db 0
stack ends

code segment
start:    mov ax,35487           ;interface,number
    mov bx,data
    mov ds,bx
    mov bx,stack
    mov ss,bx
    mov sp,10h   
    mov si,0
    call dtoc
   
    mov dh,12                 ;interface,row
    mov dl,40          ;interface,column
    mov cl,10          ;interface,color            
    mov si,0     
    call showtr

    mov ax,4c00h
    int 21h

 dtoc:    mov dx,0
    mov bx,10           ;用除法得到每一位上的数
    div bx
    add dx,30h          ;十六进制数的ascll码 + 30h  得到十进制数的ascll码
    push dx
    mov cx,ax
    inc si
    jcxz go
    jmp short dtoc

 go:    mov cx,si
    mov si,0
    jmp short fi
 fi:    pop dx
    mov [si],dl
    inc si
    loop fi
    ret

showtr:    mov ch,0
    mov ss:[0],cl
    mov cl,dh    ;
    mov ax,0     ;
 s:    add ax,0a0h  ; 算出行偏移地址,放入bx
    loop s       ;
    mov bx,ax    ;

    mov ax,0b800h;
    mov es,ax    ; es存放显存段地址

    mov cl,dl    ;
    mov ax,0     ;
 s0:     add ax,2     ; 算出列偏移地址,放入di
    loop s0      ;
    mov di,ax    ;
   
 s1:    mov ch,0
    mov cl,[si]
    jcxz ok
    mov es:[bx+di],cl
    mov al,ss:[0]
    mov es:[bx+1+di],al
    add di,2
    inc si
    jmp short s1

 ok:    ret

code ends
end start


现在任务的要求是,用之前学过的东西(我理解为之前写过的代码,因为实在不想重写),把公司的信息按

1975                     16                    3                5
1976                     22                    7                3
……
1995                     5937000               17800            333

显示在屏幕上
很烦,不知道怎么把这些代码整合起来,主要有这些困难
年份的存入是  '1975'   ,存入内存后是十进制对应的 ascll 码,而之后的数据存入内存后值十六进制对应的 ascll 码
这就要在dtoc中用不同的方式处理(我没改年份定义为  db 1975 ,把这个也当成练习了)
还有总收入中有数据大于 2^16  ,所以在dtoc中会出现除法溢出
解决的代码如下
assume cs:codesg
stack segment
    dw 0
stack ends

codesg segment
start:    mov ax,stack
    mov ss,ax
    mov sp,10h

    mov ax,9768h        ;interface,low_number
    mov dx,5ah        ;interface,high_number
    mov cx,10        ;interface,div_number

    call divdw

    mov ax,4c00h
    int 21h

 divdw:    mov ss:[0],ax
    mov ax,dx
    mov dx,0
    div cx  
  
    push ax
   
    mov ax,ss:[0]
    div cx

    mov cx,dx
    pop dx
    ret            ;结果,dx放高16位,ax放低16位
                ;cx放余数
 
codesg ends
end start


这些子程序我都能写出来,但就是弄不到一块完成任务
应该是我写的代码太僵了,不能很好的移植利用,请大神看看,子程序要怎么写,才能最好的利用它
2011-05-14 23:05
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 4楼 zaixuexi
……版主,sorry了,还是没看懂,能请解释一下吗
s3:
    cmp  dx,0ah             这里为什么 dx 比 10 小就可以跳过了?如果数值是 dx = 9h , ax = 0000 ,那不会得出不对的结果吗?

s0:
    mov  ah,9
    int  21h                这段因为  int 没学 ,请解释一下功能
    add  dx,27

其他的都看懂了,不过我不明白为什么数据可以在 debug 中显示出来
我学到的就是把内容存到 b800:0000~b800:ffff 中,这样可以运行 cc.exe 看到显示
请再指点一下,谢谢
2011-05-16 12:59
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 7楼 zaixuexi
啊,懂了~我第一个问题问的真是笨
谢啦楼主,爱你~
 
2011-05-16 16:03
快速回复:求王爽汇编语言 课程设计1 的代码!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031559 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved