鱼C论坛

 找回密码
 立即注册
查看: 2179|回复: 7

Divide overflow

[复制链接]
发表于 2012-11-11 00:27:17 | 显示全部楼层 |阅读模式
1鱼币
实验七,算是写出来了吧,但是有溢出,请指教!还是欠缺程序编译的经验,都说写程序前要先设计流程的,真不知道是咋整滴。那本书有讲这个的,鱼老师教我。谢谢!
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,130,220,476,778,1001,1442,2258,2739,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 es,ax
                mov bx,0
                mov si,0
                mov di,0
                
                s: ;将年份送入table
                mov al,[bx]
                mov es:[di],al
                mov al,[bx+1]
                mov es:[di+1],al
                mov al,[bx+2]
                mov es:[di+2],al
                mov al,[bx+3]
                mov es:[di+3],al
                
                ;加入一个空格
                mov byte ptr es:[di+4],20h
                
                ;将公司总收入分别入AX,DX
                mov ax,54h[bx]
                mov dx,56h[bx]
                mov es:6h[di],ax
                mov es:8h[di],dx
                
                ;加入一个空格进去
                mov byte ptr es:9h[di],20h
                
                ;将雇员人数送入到table表中
                mov ax,0a8h[si]
                mov es:0ah[di],ax
                
                ;再加入一个空格
                mov byte ptr es:0ch[di],20h
                
                ;将年均收入写入table
                mov ax,54h[di]
                div word ptr 0a8h[si]
                mov es:0dh[di],ax
                
                ;修改变量bx,si,di
                add bx,4
                add si,2
                add di,16
                
                loop s
                
                mov ax,4c00h
                int 21h
                codesg ends
        end start
                

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-11 00:27:18 | 显示全部楼层
DATAS  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' 
        ;以上是表示21年的21个字符串
        ;偏移地址是0-53h 十进制是84-1

        DD      16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514 
        DD      345980, 590827, 803530, 118300, 184300, 2759000, 3753000, 4649000, 5937000 
        ;以上是表示21年公司总收入的21个dword型数据
        ;偏移地址从54h-a7h 十进制是84*2=168-1
        DW      3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 
        DW      11542, 14430, 15257, 17800 
        ;以上是表示21年公司雇员人数的21个word型数据
        ;偏移地址从a8h-d1h 十进制是168+42=210-1
DATAS  ENDS 

TABLE  SEGMENT 
         DB     21 DUP ('year summ ne ?? ') 
        ;偏移地址从E0-220 十进制是21*16=336d=150h-10h+e0h=220h
        ;可以将地址给ES 用-D ES来查看
        ;0B4F:0000  79 65 61 72 20 73 75 6D-6D 20 6E 65 20 3F 3F 20   year summ ne ??
        ;根据上面的定位
TABLE  ENDS 

STACKS  SEGMENT 
        DB 16 DUP (0) 
STACKS  ENDS 

ASSUME  CS:CODES,DS:DATAS,SS:STACKS 

CODES   SEGMENT 

START: 
        ;相关寄存器初始化 
        MOV     AX,DATAS 
        MOV     DS,AX 
        MOV     AX,TABLE 
        MOV     ES,AX 
        MOV     AX,STACKS 
        MOV     SS,AX 
        MOV     SP,16 
        
        MOV     BX,0 
        MOV     BP,0 
        MOV     DI,0 
        MOV     SI,0 

        MOV     CX,21 

cycle:  ;使用栈复制年份 
        PUSH    0[DI]
        PUSH    [DI].2
        POP     ES:[BP].2
        POP     ES:[BP].0
         
        ;使用栈复制收入 
        PUSH    54H.[DI].0
        PUSH    54H.[DI].2
        POP     ES:[BP].7 
        POP     ES:[BP].5 

        ;使用栈复制雇员数 
        PUSH    0A8H.[SI] 
        POP     ES:[BP].0AH 

        ;计算人均收入 
        MOV     AX,ES:[BP].5 
        MOV     DX,ES:[BP].7 
        DIV     WORD PTR ES:[BP].0AH 
        MOV     ES:[BP].0DH,AX 

        ADD     SI,2H 
        ADD     DI,4H 
        ADD     BP,10H 

        LOOP    cycle 
              

        MOV     AH,4CH 
        INT     21H 
CODES   ENDS 
END     START
; 栈的使用、结构化程序设计的思想... 
; 话就不多说了,自己体会吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-11 08:31:35 | 显示全部楼层
俺也遇到过,DIV(word)过后,ax=结果 dx 余数。。。每次用后,我都会把DX清空。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-11 08:32:40 | 显示全部楼层
没有仔细研究,SI  &  DI  寻址没问题吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-11 14:58:19 | 显示全部楼层
看懂了,只是没有帮忙解释一下为啥会出现溢出呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-11 16:08:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-11-11 16:22:08 | 显示全部楼层

郁闷,丢脸丢大发了:$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-11 16:36:59 | 显示全部楼层
  呵  呵 :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 02:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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