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
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
; 栈的使用、结构化程序设计的思想...
; 话就不多说了,自己体会吧
俺也遇到过,DIV(word)过后,ax=结果 dx 余数。。。每次用后,我都会把DX清空。 没有仔细研究,SI&DI寻址没问题吧? 看懂了,只是没有帮忙解释一下为啥会出现溢出呢? lyoal 发表于 2012-11-11 14:58 static/image/common/back.gif
看懂了,只是没有帮忙解释一下为啥会出现溢出呢?
你的CX呢?:lol pediyzhi 发表于 2012-11-11 16:08 static/image/common/back.gif
你的CX呢?
郁闷,丢脸丢大发了:$ 呵呵 :lol
页:
[1]