鱼C论坛

 找回密码
 立即注册
查看: 2983|回复: 10

汇编语言课程设计一

[复制链接]
发表于 2016-3-1 22:24:51 | 显示全部楼层 |阅读模式
10鱼币
啊啊啊,表示楼主受不了,课程设计一已经做了好几天了,但是仍然做不出来,我的问题是:
1.首先人均收入到底是哪个寄存器的值,人均收入如何计算,人均收入如何放置啊
2.为何别人的代码可以直接用div  (总收入/人数),却没有出现除法溢出,而我试下不行啊,他的代码如下:(是狂潮的,我复制下)
assume cs:codesg, ds:data, es:data2 

data segment 
    db 32 dup(20H) 
data ends 

data2 segment 
    ; 年份 
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982' 
    db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990' 
    db '1991', '1992', '1993', '1994', '1995' 
     
    ; 收入 
    dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479 
    dd 140417,197514, 345980, 590827, 803530, 1183000, 1843000 
    dd 2759000, 3753000, 4649000, 5937000 
     
    ; 雇员数 
    dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793 
    dw 4037, 5635, 8226, 11542, 14430, 15257, 17800 
data2 ends 

codesg segment 
start: 
    mov ax, data 
    mov ds, ax 
    mov ax, data2 
    mov es, ax 
     
    mov cx, 21 
    mov bp, 0       ; 年份的首地址 
    mov bx, 54H     ; 收入的首地址 
    mov di, 0a8H    ; 雇员数的首地址 
    mov dh, 4       ; 从第4行开始逐行显示表格 
    mov dl, 0       ; 从第0列显示每行信息 
s: 
    push cx 
    push dx 
    mov si, 0       ; 字符串的首地址 
    ; 复制年份 
    mov ax, es:[bp] 
    mov [si], ax 
    mov ax, es:2[bp] 
    mov 2[si], ax 
    add si, 9       ; 9列显示年份 
     
    ; 复制收入 
    mov ax, es:[bx]    ; 收入的低16位 
    mov dx, es:2[bx]   ; 收入的高16位 
    call dtoc 
    add si, 9          ; 9列显示收入 
     
    ; 复制雇员数 
    mov ax, es:[di] 
    mov dx, 0 
    call dtoc 
    add si, 9          ; 9列显示雇员数 
     
    ; 复制人均收入 
    mov ax, es:[bx]    ; 收入的低16位 
    mov dx, es:2[bx]   ; 收入的高16位 
    div word ptr es:[di] 
    mov dx, 0 
    call dtoc 
     
    mov byte ptr 3[si], 0 ; 字符串结束标志设为0 
    pop dx 
    mov cl, 2             ; 字符显示为绿色 
    call show_str 
    inc dh                ; 行数+1 
    add bp, 4             ; 下一个年份 
    add bx, 4             ; 下一个收入 
    add di, 2             ; 下一个雇员数 
    pop cx 
    loop s 
     
    mov ax, 4c00H 
    int 21H 
     
; 子程序dtoc 
dtoc: 
    push bx 
    push cx 
    push si 
     
    mov bx, 0 
s00: 
    mov cx, ax 
    jcxz ok 
    mov cx, 10 
    call divdw 
    add cx, 30H       ; 余数转换为ASCII 
    push cx           ; 余数入栈 
    inc bx            ; 数字位数+1 
    jmp short s00 
ok: 
    mov cx, bx 
c2m: 
    pop bx 
    mov [si], bl 
    inc si 
    loop c2m 
     
    pop si 
    pop cx 
    pop bx 
    ret 
     
; 子程序divdw 
divdw: 
    push bx 
     
    mov bx, ax        ; 低16位L暂时存在bx 
    mov ax, dx        ; 高16位H送到ax 
    mov dx, 0 
    div cx            ; H/N 
    push ax           ; int(H/N)入栈 
    mov ax, bx 
    div cx            ; [rem(H/N)*65536+L]/N 
    mov cx, dx        ; 余数送到cx 
    pop dx            ; int(H/N)出栈 
     
    pop bx 
    ret 

; 子程序show_str 
show_str: 
    push ax 
    push bx 
    push bp 
    push cx 
    push si 
    push di 
    push es 
     
    mov bl, cl            ; 字体颜色存在bl中 
    mov ax, 0b800H 
    mov es, ax            ; 显示缓冲区的段地址存在es 
    mov ax, 0a0H 
    mul dh 
    mov bp, ax            ; 将第n行的首地址存在bp 
    mov ax, 2 
    mul dl 
    mov di, ax            ; 将第n列存在di 
    mov si, 0 
ctom: 
    mov ch, 0 
    mov cl, [si] 
    jcxz exit 
    mov es:[bp][di], cl 
    inc di 
    mov es:[bp][di], bl 
    inc si 
    inc di 
    jmp short ctom 
exit: 
    pop es 
    pop di 
    pop si 
    pop cx 
    pop bp 
    pop bx 
    pop ax 
    ret 
codesg ends 

end start
为何他的代码直接除,就可以,我试下就不行.,唉,真受不了了,求解啊.
我的代码为何除法溢出了
assume cs:code,ds:data,es:table

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,2795000,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

    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239

    dw 260,304,333

data ends

table segment

    db 21 dup ('year summ ne ?? ')

table ends
code segment
start:        
                mov si,0
                mov di,0
                mov bx,0
                mov ax,data
                mov ds,ax
                mov ax,table
                mov es,ax
                mov cx,21
                push cx
s5:
                mov ax,ds:[si]
                mov es:[di],ax
                mov ax,ds:[si+2]
                mov es:[di+2],ax
                mov ax,ds:[si+84]
                mov es:[di+5],ax
                mov dx,ds:[si+86]
                mov es:[di+7],dx
                mov cx,ds:[bx+168]
                mov es:[di+10],cx
                call chufa
                mov es:[di+13],ax
                add di,16
                add si,4
                add bx,2
                pop cx
                loop s5
;kaishi

                mov ax,table
                mov ds,ax
                mov ax,0b800h
                mov es,ax
                mov di,0
                mov si,0
                mov cx,21
s4:        
                push cx
                mov ax,ds:[di]
                mov es:[si],al
                mov es:[si+2],ah
                mov ax,ds:[di+2]
                mov es:[si+4],al
                mov es:[si+6],ah
                mov ax,2
                mov es:[si+1],al
                mov es:[si+3],al
                mov es:[si+5],al
                mov es:[si+7],al              ;year
                add si,32
                call dtoc2
                
                mov ax,ds:[di+5]
                mov dx,ds:[di+7]              ;sum   income
                add si,32
                call dtoc2
                
                mov ax,ds:[di+10]
                add si,64                     ;people
                call dtoc2
                
                mov ax,ds:[di+13]                ;average
                call dtoc2
                
                add di,16
                add si,32
                pop cx
                loop s4
                
                mov ax,4c00h
                int 21h

;除法        
chufa:        
                push bx
                push ax
                mov ax,dx
                mov dx,0
                div cx
                mov bx,ax
                pop ax
                div cx
                mov cx,dx
                mov dx,bx
                pop bx
                ret

;转换2进制数据,并且变为ascii值
dtoc2:
                push cx
                push di
                push bx
                push si
                push dx
                mov si,0
                mov di,0
                mov bx,10
        s:        mov dx,0
                div bx
                mov cx,ax
                jcxz keyi
                add dx,30h
                push dx
                inc di
                jmp s
        keyi:
                add dx,30h
                push dx
                inc di
                mov cx,di
        s3:
                pop dx
                mov es:[si],dl
                mov ax,2
                mov es:[si+1],al
                add si,2
                loop s3
                
                pop dx
                pop si
                pop bx
                pop di
                pop cx
                ret
code ends
end start
求解      

最佳答案

查看完整内容

还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改为了0。所以。。。。。不用我说了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-1 22:24:52 From FishC Mobile | 显示全部楼层
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改为了0。所以。。。。。不用我说了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-1 22:48:10 | 显示全部楼层
那个狂潮这里代码,直接div word ptr es:[di]为何不会除法溢出,十分不解,我试了,为何不行啊   
; 复制人均收入
    mov ax, es:[bx]    ; 收入的低16位
    mov dx, es:2[bx]   ; 收入的高16位
    div word ptr es:[di]
    mov dx, 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-2 11:55:27 From FishC Mobile | 显示全部楼层
没大神吗?,自顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-3 22:14:20 | 显示全部楼层
本帖最后由 缌唸 于 2016-3-3 22:26 编辑

哈哈,楼主解决了,太高兴了,会了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-3 22:47:30 From FishC Mobile | 显示全部楼层
一大堆问题。push cx要放到循环里面。年份显示完后,为什么要调用dtoc2?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-3 22:53:23 From FishC Mobile | 显示全部楼层
看得出你程序思路是先将数据写入表格,再从表格显示到显存。你把数据写入表格就已经出错了,所以后面你从表格读取数据都出错。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
缌唸 + 1 + 1 谢谢你花费时间观看我这错误代码

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-3-4 13:08:34 | 显示全部楼层
聆云 发表于 2016-3-3 22:56
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改 ...

谢谢,你看我的代码把,我的问题我已经明白了,不过感谢你看我的程序,毕竟放了两天都没人回,逼得我自己搞懂了, 最佳答案就给你吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-4 13:35:50 From FishC Mobile | 显示全部楼层
不客气,能自己解决,收获更大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-4 13:40:02 From FishC Mobile | 显示全部楼层
狂潮的程序有bug....在dtoc那里。用divdw计算后,cx放余数,dx 放商的高16位,ax放商的低16位,然后判断商是否为0时,只判断了商的低16位是否为0,那高16位呢?为什么不判断?难道低16位为0就认为高16位也为0??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-5 14:54:50 | 显示全部楼层
聆云 发表于 2016-3-4 13:40
狂潮的程序有bug....在dtoc那里。用divdw计算后,cx放余数,dx 放商的高16位,ax放商的低16位,然后判断商 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 08:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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