标题:做完王爽的《汇编语言》的课程设计1,出来秀一个
只看楼主
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
结帖率:100%
已结贴  问题点数:20 回复次数:8 
做完王爽的《汇编语言》的课程设计1,出来秀一个
data segment
    db 24 dup(0)
    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
stack segment
    dw 10 dup(0)
stack ends
code  segment
assume  cs:code,ds:data,ss:stack
start:   
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov sp,20
    call show_str4
    mov dh,0
    mov dl,21
    mov di,0
    mov cx,21
s2:    push cx
    call dtostr
    call show_str
    inc dh
    pop cx
    loop s2   
    mov dh,0
    mov dl,39
    mov di,0
    mov cx,21
s5:    push cx
    call wtostr
    call show_wstr
    inc dh
    pop cx
    loop s5   
    mov dh,0
    mov dl,57
    mov di,0
    mov word ptr ds:[10],108
    mov word ptr ds:[12],192
    mov cx,21
s8:    push cx
    call retostr
    call show_wstr
    inc dh
    pop cx
    loop s8   
    mov ax,4c00h
    int 21h
   
show_str4:
        mov si,24
        mov cx,21
        mov dh,0
        mov dl,3
        mov ax,0b800h
        mov es,ax
    s1:    push cx
        mov al,0a0h
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        add bx,ax
        mov cx,4
    s0:    push cx
        mov cl,7
        mov al,ds:[si]
        mov ah,cl
        mov es:[bx],ax
        add bx,2
        inc si
        pop cx
        loop s0   
        inc dh
        pop cx
        loop s1
        ret
dtostr: push dx
        add di,2
        mov ax,ds:[si]
        mov dx,ds:[si+2]
    s3:    mov ds:[20],ax
        mov ax,dx
        mov dx,0
        mov bx,10
        div bx
        mov ds:[22],ax
        mov ax,ds:[20]
        div bx
        mov ds:[20],ax
        add dx,30h
        mov ds:[di],dx
        mov dx,ds:[22]
        add di,2
        or word ptr ds:[22],0
        jnz s3
        or word ptr ds:[20],0
        jnz s3
        add si,4
        pop dx
        ret
        
show_str:
        sub di,2
        mov cl,7
        mov ax,0a0h
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        add bx,ax
    s4:    mov al,ds:[di]
        mov ah,cl
        mov es:[bx],ax
        add bx,2
        sub di,2
        jnz s4
        ret

wtostr:
        push dx
        inc di
        mov ax,ds:[si]
    s6:    mov dx,0
        mov bx,10
        div bx
        mov cx,ax
        add dx,30h
        mov ds:[di],dx
        jcxz ok0
        inc di
        jmp short s6
        ok0:
        add si,2
        pop dx
        ret

show_wstr:
        mov ax,0a0h
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        add bx,ax
    s7:    mov al,ds:[di]
        mov ah,7
        mov es:[bx],ax
        add bx,2
        dec di
        jnz s7
        ret
        
retostr:
        push dx
        inc di
        mov bx,ds:[10]
        mov ax,ds:[bx]
        mov dx,ds:[bx+2]
        mov bx,ds:[12]
        mov cx,ds:[bx]
        div cx
        mov cl,10
    s9:    div cl
        add ah,30h
        mov ds:[di],ah
        inc di
        cmp al,0
        mov ah,0
        jne s9
        dec di
        mov ax,ds:[10]
        add ax,4
        mov ds:[10],ax
        mov ax,ds:[12]
        add ax,2
        mov ds:[12],ax
        pop dx
        ret
code  ends
end   start
搜索更多相关主题的帖子: mov push inc call add 
2020-08-03 22:28
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:10 
嗯,因着版主和答题义务,这题在不同场合回答过不下十数遍,形形式式的错误或卡着都有....

没看楼主的代码,但可以提出一个这题中常遇到的困扰或者是程式师总会碰的问题:

是否相信资料(包括手动输入和文件输入)的正确性?

答案是:不相信。或者,一定得抱着怀疑。

举本题的例子,假如最后一个雇员人数17800,输入时不小心漏了一个0,1780,这种错误还是挺高的,结果是:程式崩溃了...

楼主若有兴趣,可以试着解决这个问题,就是:资料若是1780时怎么办?
2020-08-04 06:12
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
得分:10 
写的挺长,辛苦了

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2020-08-04 08:55
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 2楼 Valenciax
不懂,少输一个0的话结果是3335<65535怎么就溢出了?
2020-08-04 13:04
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
1780是我随便举的,瞄一下代码,却发见retostr这个子程序的逻辑问题比我想像的还多,它在2319或以下就会溢出,原因出在div cl,
所以当之前div cx的结果大于或等于2560,再除cl,al放不下256这个商

即便这个bug解决了,仍不是我上面提出的疑问,如何避免所有溢出,包括其商值大于65535.
2020-08-04 16:15
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
哦,我的想法是全部用大数除法。就是感觉有点占空间。
2020-08-04 18:06
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
这里有一个32bit除法的子程序,用于防止dx:ax/16bit值时,商值大于ax而引发溢出
方法是分别用两个16bit除法代替32除法

传入值:dx:ax = 被除数 , cx=除数
输出值:dx:ax = 32bit的商值(若<65535,则dx=0),cx=余数

程序代码:

 div32:
     push bx
     push ax    ;保存被除数16bit低位
     mov ax,dx  ;取被除数16bit高位
     mov dx,0   ;清0
     div cx     ;被除数16bit高位/cx
     mov bx,ax  ;保存高位商,dx=余数=下一次被除数的16bit高位
     pop ax     ;取回原被除数16bit低位
     div cx     ;除16bit低位,ax=低位商
     mov cx,dx  ;cx=余数
     mov dx,bx  ;取回高位商
     pop bx

 ret
2020-08-04 18:35
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
这个程序我知道的,我说的大数除法就是指这个,最后一段没用这个除法是因为我看到
书上的结果都比较小,没想到歪打正着,着实没考虑除10溢出的情况。
溢出的问题先放一边吧,我书上内容还没学完,继续学习去了。
谢谢版主关注!
2020-08-04 18:50
jm1094sd
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2018-7-12
得分:0 
这个什么程序?
2023-03-22 09:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502727-1-1.html




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

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