lyoal 发表于 2012-11-11 00:27:17

Divide overflow

实验七,算是写出来了吧,但是有溢出,请指教!还是欠缺程序编译的经验,都说写程序前要先设计流程的,真不知道是咋整滴。那本书有讲这个的,鱼老师教我。谢谢!
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,
                mov es:,al
                mov al,
                mov es:,al
                mov al,
                mov es:,al
                mov al,
                mov es:,al
               
                ;加入一个空格
                mov byte ptr es:,20h
               
                ;将公司总收入分别入AX,DX
                mov ax,54h
                mov dx,56h
                mov es:6h,ax
                mov es:8h,dx
               
                ;加入一个空格进去
                mov byte ptr es:9h,20h
               
                ;将雇员人数送入到table表中
                mov ax,0a8h
                mov es:0ah,ax
               
                ;再加入一个空格
                mov byte ptr es:0ch,20h
               
                ;将年均收入写入table
                mov ax,54h
                div word ptr 0a8h
                mov es:0dh,ax
               
                ;修改变量bx,si,di
                add bx,4
                add si,2
                add di,16
               
                loop s
               
                mov ax,4c00h
                int 21h
                codesg ends
        end start
               

pediyzhi 发表于 2012-11-11 00:27:18

DATASSEGMENT
      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
DATASENDS

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

STACKSSEGMENT
      DB 16 DUP (0)
STACKSENDS

ASSUMECS: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
      PUSH    .2
      POP   ES:.2
      POP   ES:.0
         
      ;使用栈复制收入
      PUSH    54H..0
      PUSH    54H..2
      POP   ES:.7
      POP   ES:.5

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

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

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

      LOOP    cycle
            

      MOV   AH,4CH
      INT   21H
CODES   ENDS
END   START
; 栈的使用、结构化程序设计的思想...
; 话就不多说了,自己体会吧

s0512 发表于 2012-11-11 08:31:35

俺也遇到过,DIV(word)过后,ax=结果 dx 余数。。。每次用后,我都会把DX清空。

s0512 发表于 2012-11-11 08:32:40

没有仔细研究,SI&DI寻址没问题吧?

lyoal 发表于 2012-11-11 14:58:19

看懂了,只是没有帮忙解释一下为啥会出现溢出呢?

pediyzhi 发表于 2012-11-11 16:08:40

lyoal 发表于 2012-11-11 14:58 static/image/common/back.gif
看懂了,只是没有帮忙解释一下为啥会出现溢出呢?

你的CX呢?:lol

lyoal 发表于 2012-11-11 16:22:08

pediyzhi 发表于 2012-11-11 16:08 static/image/common/back.gif
你的CX呢?

郁闷,丢脸丢大发了:$

pediyzhi 发表于 2012-11-11 16:36:59

呵呵 :lol
页: [1]
查看完整版本: Divide overflow