汇编网首页登录博客注册
huangbeidu的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
友情链接

[2009-05-14 05:02] 课程设计1

快要考试了 把重点放在了离散数学上 课程设计1一直拖到现在才完成 有点长了 160行 稍后推出精简版

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
评论次数(1)  |  浏览次数(811)  |  类型(汇编作业) |  收藏此文  | 

[  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

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码