| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 936 人关注过本帖
标题:求王爽汇编语言 课程设计1 的代码!
只看楼主 加入收藏
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
结帖率:100%
收藏
已结贴  问题点数:0 回复次数:8 
求王爽汇编语言 课程设计1 的代码!
跪求,有种被它折磨的遍体鳞伤的感觉……
求大神解救我啊!!!
搜索更多相关主题的帖子: 课程 设计 
2011-05-14 21:57
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:20 
你先写点出来,我想你都被折磨的这么惨了,肯定写了至少几十遍错的了,发上来看看先

技术问题,请不要以短消息方式提问
2011-05-14 22:01
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
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
程序代码:
assume cs:code,ds:data,es:table
data segment
    db '1975','1976','1977','1978','1979','1980','1981'        ;year     offset scale [0,53h]
    db '1982','1983','1984','1985','1986','1987','1988'
    db '1989','1990','1991','1992','1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000                          ;income    offset scale [54h,0a7h]
    dd 24486,50065,97479,140417,197514,345980,590827
    dd 803530,1183000,1843000,2759000,3753000,4649000,5937000

    dd 3,7,9,13,28,38,130                                      ;person offset scale [0a8h,unconcerned]
    dd 220,476,778,1001,1442,2258,2793
    dd 4037,5635,8226,11542,14430,15257,17800
data ends

table segment                                                  ;statistics
    db 21 dup ('year summ ne ?? ')                             ;+0h    +5h    +0ah    +0dh
table ends                                                     ;year    income    person    avg    

table2 segment                                                 ;dumpinfo
    db 21 dup (27 dup (' '))                                   ;+0h    +5h    +0dh    +13h    +17h    1Ah
table2 ends                                                    ;year    income    person    avg    crlf    '$'
                                                               ;xxxx   xxxxxxx xxxxx   xxx     xx      x
code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax                                                  ;ds->data,es->table
   
    xor si,si
    xor di,di
    mov cx,21
    mov bx,10                                                  ;si,di used as struct index
next:
    push ds:[si+2]
    push ds:[si]
    pop  es:[di]
    pop  es:[di+2]                                             ;copy year
   
    push ds:[si+56h]
    push ds:[si+54h]
    pop  es:[di+5]
    pop  es:[di+7]                                             ;copy income
   
    push ds:[si+0a8h]
    pop  es:[di+10]                                            ;copy person

    mov  dx,[si+56h]
    mov  ax,[si+54h]
    div  word ptr[si+0a8h]                                     ;calc avg
    mov  es:[di+13],ax                                         ;save avg

    add  si,4
    add  di,16                                                 ;index -> next struct
    loop next                                                  ;stage1 complete
    call dumpinfo
    mov  ax,4c00h                                              ;---------------;
    int  21h                                                   ; struct offset ;
dumpinfo:                                                      ;---------------;     max_len(bytes)
    mov  ax,table                                              ;      year     ; +0h        4
    mov  ds,ax                                                 ;     income    ; +5h        7
    mov  ax,table2                                             ;     person    ; +0Ah       5
    mov  es,ax                                                 ;      avg      ; +0Dh       3
    xor  si,si                                                 ;---------------;     total = 4+7+5+3 (+5 space) (+2 crlf)(+1 '$')
    xor  di,di                                                 ;               ;           = 19+5++2+1 = 27
    mov  cx,21
s:
    push ds:[si+2]
    push ds:[si]
    pop  es:[di]
    pop  es:[di+2]                                             ;copy year

    add  di,5                                                  ;di->struct.income
    mov  dx,ds:[si+7]
    mov  ax,ds:[si+5]
    call dtoc
    add  di,8                                                  ;di->struct.person
    xor  dx,dx
    mov  ax,ds:[si+0ah]
    call dtoc
    add  di,6                                                  ;di->struct.avg
    xor  dx,dx
    mov  ax,ds:[si+0dh]
    call dtoc
    mov  word ptr es:[di+4],0d0ah                              ;di->struct.crlf
    mov  byte ptr es:[di+7],'$'                                ;di->struct.eof
    add  si,16
    add  di,8                                                  ;di->next struct
    loop s
dumpall:
    mov  cx,21
    push es
    pop  ds
    xor  dx,dx
s0:
    mov  ah,9
    int  21h
    add  dx,27
    loop s0
    ret                                                        ;dump all info
dtoc:
    push cx
    push di
    xor  cx,cx
s3:
    cmp  dx,0ah
    jna  s1
    call divdw
    or   bx,30h
    push bx
    inc  cl
    mov  bx,10
    jmp  short s3                                              ;use divdw to fix overflow
s1:
    inc  cl
    div  bx
    or   dx,30h
    push dx
    xor  dx,dx
    test ax,ax
    jnz  s1                                                    ;normal atoi
s2:
    pop  dx
    mov  es:[di],dl
    inc  di   
    loop s2
    pop  di
    pop  cx
    ret                                                        ;save to table2
divdw:                                                         ;quotient=dx:ax,remainder:bx
   push ax
   mov  ax,dx
   xor  dx,dx
   div  bx
   mov  bp,ax
   pop  ax
   div  bx
   mov  bx,dx
   mov  dx,bp
   ret                                                         ;overflow solution
code ends
end start
stage1:
图片附件: 游客没有浏览图片的权限,请 登录注册

stage2:
图片附件: 游客没有浏览图片的权限,请 登录注册


技术问题,请不要以短消息方式提问
2011-05-15 14:41
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
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
1. 16bit register MAX = FFFF(16) = 65535
   655360(10)->A0000(16),655360/10 = 65536 > 65535(FFFF) => overflow
   9FFFF(16)->655359(10),655359/10 = 65535 = 65535
   90000(16)->589824(10),589824/10 = 58982 < 65535
2. lea dx,string
   mov ah,9
   int 21h      ;show string

技术问题,请不要以短消息方式提问
2011-05-16 14:05
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
额,难道我的代码直接cc.exe看不到?
放DEBUG里只是告诉你怎么调试

技术问题,请不要以短消息方式提问
2011-05-16 14:10
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 7楼 zaixuexi
啊,懂了~我第一个问题问的真是笨
谢啦楼主,爱你~
 
2011-05-16 16:03
李明明
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-7-4
收藏
得分:0 
各位大侠,谁有电脑控制加油机的汇编程序?谢谢。。。
2011-07-11 10:53
快速回复:求王爽汇编语言 课程设计1 的代码!
数据加载中...
 
   



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

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