- [huangbeidu] 哦 原来这样 07/05 22:27
- [游客] h回答正确。 07/02 08:18
- [游客] 每一个command窗口都是一个独立的模拟dos环境的,所以,关闭窗口后,这个环境就消失了,你在这个 07/02 08:12
- [huangbeidu] 有点不明白为什么关闭窗口后 再运行除法溢出的程序 还是老样子 怎么让它常驻内存? 07/02 00:15
- [huangbeidu] 是 SF应该是0的 06/05 02:20
- [tomato] Right! 05/31 18:19
- [tomato] 第一题的最后一条指令的答案写错了。建议上机验证一下。 05/31 18:18
- [huangbeidu] 这个是不算精简版的精简版了 代码是没有少多少 就是嫌以前的那个程序把数据段改成那样 在实际的操作中恐 05/14 17:29
- [游客] 可以参考前面的那个不会溢出的除法处理方式来想想这个程序怎么去支持dx为非0的数据显示,让显示的数据超 04/29 10:31
- [游客] 绝对有帮助。 04/28 11:47
[2009-05-14 05:02] 课程设计1
assume cs:code
data segment
db '1 9 7 5 ','1 9 7 6 ','1 9 7 7 ','1 9 7 8 ','1 9 7 9 ','1 9 8 0 '
db '1 9 8 1 ','1 9 8 2 ','1 9 8 3 ','1 9 8 4 ','1 9 8 5 ','1 9 8 6 '
db '1 9 8 7 ','1 9 8 8 ','1 9 8 9 ','1 9 9 0 ','1 9 9 1 ','1 9 9 2 '
db '1 9 9 3 ','1 9 9 4 ','1 9 9 5 '
dd 16,22,382,1356,2390,8000,16000,24486,50065
dd 97479,140417,197514,345980,590827,803530
dd 1183000,1843000,2759000,3753000,4649000
dd 5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258
dw 2793,4037,5635,8226,11542,14430,15257,17800
data ends
stack segment
dd 10 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,stack
mov ss,ax
mov sp,40
mov si,0
;***********向显存中写入年份*********
mov cx,84
s:
mov al,10b
mov 1[si],al
add si,2
loop s ;放置字符属性完毕
mov di,4*160+8 ;首字符放在第五行第四列
mov si,0
mov cx,21
cld
nmff:
push cx
mov cx,4
rep movsw ;开始写入显存
add di,152 ;换到屏幕下一行
pop cx
loop nmff
;************年份写入完毕************
;@@@@@@@@@@@@@@年收入转化十进制@@@@@@@@@@@@@@@@
mov cx,21
mov di,4*160+30 ;年收入放在第五行第十五列
sijnzi:
push cx
mov ax,[si] ;si指向年收入
mov dx,2[si]
add si,4 ;注意!!!!!!!
push si
mov si,0 ;si记录循环次数
s1:
call divdw ;除以10求余数
mov cx,ax
inc si
add bl,30h ;十进制数码字符对应的ASCII码=十进制数码值+30H
mov bh,2
push bx
jcxz ok ;判断商是否为零(注意该指令放置的位置)
jmp s1
ok:
mov cx,si
s2:
pop es:[di]
add di,2
loop s2
add di,160
add si,si ;注意!!!!
sub di,si ;转到下一行
pop si
pop cx
loop sijnzi
;@@@@@@@@@@@@@@年收入转化十进制@@@@@@@@@@@@@@@@
;^^^^^^^^^^^^^^平均收入^^^^^^^^^^^^^^
mov di,21*8
mov si,0
mov cx,21
mov bp,4*160+74
sbru:
push cx
mov ax,[di]
mov dx,2[di] ;年收入
mov bx,21*12[si] ;员工人数
add si,2
add di,4
push si
xqgl:
div bx
mov bx,10
mov si,0 ;si记录循环次数
x1:
mov dx,0
div bx ;除以10求余数
add dl,30h ;十进制数码字符对应的ASCII码=十进制数码值+30H
mov dh,2
push dx
inc si
mov cx,ax
jcxz done
jmp x1
done:
mov cx,si
x2:
pop es:[bp]
add bp,2
loop x2
add bp,160
add si,si
sub bp,si
pop si
pop cx
loop sbru
cmp bp,25*160+52
je jxsu
gl: ;修改指令
mov ax,bx
mov di,offset gl
mov si,offset xqgl
mov ax,cs:[di]
mov cs:[si],ax
mov di,21*8
mov si,0
mov cx,21
mov bp,4*160+52
jmp sbru
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;>>>>>>>>>>>>>>>除法溢出<<<<<<<<<<<<<<<<<<<<
;X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
divdw:
push si
mov cx,10
mov bx,ax ;用bx存储被除数低16位
mov ax,dx
mov dx,0 ;为被除数高16位H除以除数N做准备
div cx
mov si,ax ;用si存储int(H/N)
mov ax,bx ;恢复被除数低16位
div cx ;dx=rem(H/N),ax=L 执行后ax为X/N的低16位
mov bx,dx ;X/N的余数放在bx
mov dx,si ;X/N的高16位放在dx
pop si
ret
;>>>>>>>>>>>>>>>除法溢出<<<<<<<<<<<<<<<<<<<<
jxsu:
mov ax,4c00h
int 21h
code ends
end start
[ huangbeidu 发表于 2009-05-14 17:29 ]
这个是不算精简版的精简版了 代码是没有少多少 就是嫌以前的那个程序把数据段改成那样 在实际的操作中恐怕不太现实 万一数据很多呢 总不能一个一个地加空格吧 主要就是修改了放置年份的代码
原来想把用到除法的地方都用除法溢出的那个子程序解决的 但是现在想想 有些不会产生溢出的地方用那个子程序不是杀鸡用牛刀吗 虽然代码能减少四十几行 但是执行效率觉得反而是低了
代码长不一定执行效率就低 是吧?
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980'
db '1981','1982','1983','1984','1985','1986'
db '1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065
dd 97479,140417,197514,345980,590827,803530
dd 1183000,1843000,2759000,3753000,4649000
dd 5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258
dw 2793,4037,5635,8226,11542,14430,15257,17800
data ends
stack segment
dd 10 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,stack
mov ss,ax
mov sp,40
mov si,0
;***********向显存中写入年份*********
mov cx,21
mov di,4*160+8
s:
push cx
mov cx,4
go:
mov ah,2
mov al,[si]
inc si
push ax
pop es:[di]
add di,2
loop go
add di,152
pop cx
loop s
;************年份写入完毕************
;@@@@@@@@@@@@@@年收入转化十进制@@@@@@@@@@@@@@@@
mov cx,21
mov di,4*160+30 ;年收入放在第五行第十五列
sijnzi:
push cx
mov ax,[si] ;si指向年收入
mov dx,2[si]
add si,4 ;注意!!!!!!!
push si
mov si,0 ;si记录循环次数
s1:
call divdw ;除以10求余数
mov cx,ax
inc si
add bl,30h ;十进制数码字符对应的ASCII码=十进制数码值+30H
mov bh,2
push bx
jcxz ok ;判断商是否为零(注意该指令放置的位置)
jmp s1
ok:
mov cx,si
s2:
pop es:[di]
add di,2
loop s2
add di,160
add si,si ;注意!!!!
sub di,si ;转到下一行
pop si
pop cx
loop sijnzi
;@@@@@@@@@@@@@@年收入转化十进制@@@@@@@@@@@@@@@@
;^^^^^^^^^^^^^^平均收入^^^^^^^^^^^^^^
mov di,21*4
mov si,0
mov cx,21
mov bp,4*160+74
sbru:
push cx
mov ax,[di]
mov dx,2[di] ;年收入
mov bx,21*8[si] ;员工人数
add si,2
add di,4
push si
xqgl:
div bx
mov bx,10
mov si,0 ;si记录循环次数
x1:
mov dx,0
div bx ;除以10求余数
add dl,30h ;十进制数码字符对应的ASCII码=十进制数码值+30H
mov dh,2
push dx
inc si
mov cx,ax
jcxz done
jmp x1
done:
mov cx,si
x2:
pop es:[bp]
add bp,2
loop x2
add bp,160
add si,si
sub bp,si
pop si
pop cx
loop sbru
cmp bp,25*160+52
je jxsu
gl:
mov ax,bx
mov di,offset gl
mov si,offset xqgl
mov ax,cs:[di]
mov cs:[si],ax
mov di,21*4
mov si,0
mov cx,21
mov bp,4*160+52
jmp sbru
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;>>>>>>>>>>>>>>>除法溢出<<<<<<<<<<<<<<<<<<<<
;X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
divdw:
push si
mov cx,10
mov bx,ax ;用bx存储被除数低16位
mov ax,dx
mov dx,0 ;为被除数高16位H除以除数N做准备
div cx
mov si,ax ;用si存储int(H/N)
mov ax,bx ;恢复被除数低16位
div cx ;dx=rem(H/N),ax=L 执行后ax为X/N的低16位
mov bx,dx ;X/N的余数放在bx
mov dx,si ;X/N的高16位放在dx
pop si
ret
;>>>>>>>>>>>>>>>除法溢出<<<<<<<<<<<<<<<<<<<<
jxsu:
mov ax,4c00h
int 21h
code ends
end start