- [ltp1234] push cx add si,1 ;结果的数字个数 04/09 01:58
- [ltp1234] 写的很好!! 04/08 23:48
- [游客] 我也不知道说些什么 挺一下好啦 04/03 20:50
- [e56004474] 没事的话,别坐电车。 据说。。。 03/17 18:52
- [waasmedu] 拜读!受教!! 12/21 11:18
- [chinatree] 不错,顶。 12/05 03:32
- [ljl] 晕,最后一题也没有想到。。。 12/04 14:56
- [mouse] 楼上的看错了,填空位置填inc cx,就是为了找到第一个值为0的byte 07/29 15:37
- [wbkyh] 检测点9.2中,loop s指令有问题,该指令执行后,cx=cx-1,如果cx=0,则循环结束,也就 06/28 09:32
- [游客] 结果是1,*p取得的是a的地址中的内容,也就是a的值 06/08 00:22
- [lp1989] 请教一道题: 在数据段BUF下开始已定义了信息“I LIKE IBM-PC”, 编写在屏 幕上显 12/29 13:32
- [fangaiyisheng] 飘过,很好 ,很强大! 06/18 06:05
- [游客] [ lyh1984 发表于 2009-06-26 10:39 ] 请问一下,我用DEB 07/15 10:59
- [lyh1984] 请问一下,我用DEBUG为什么调不出字符串呢?我想知道你们是怎么调的,是用CMD DEBUG吗? 06/26 10:39
- [q470393267] 我看你头像半天了,那猫和老鼠能抗啊都没有死~ 05/05 21:31
- [fangyugirl] 经过上机DEBUG,我已经知道问题在哪里了,谢谢你呀。 04/09 10:31
- [fangyugirl] 我是想问你第10章的第三个子程序,这个子程序我现在主要的问题是12666/10会产生溢出,所以我调用 04/09 09:57
- [mouse] [ wangping198611 发表于 2009-03-23 11:43 ] 03/31 10:28
- [mouse] miaozaoyang 发表于 2009-03-29 22:31 ] [ 删除留 03/31 10:23
- [miaozaoyang] 又得问你个问题了,不知道为什么,实验15 不能够正常进行,程序应该是没有任何问题的,还是操作系统的问 03/29 22:31
[2008-01-01 17:15] 第十章课设一
assume cs:code
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,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32 ;栈存放计算后的数字
;=================年份=================
mov di,0 ;读取数据的起始位置
mov bx,0 ;行数
mov cx,21;循环次数
dd_data0:
push cx
mov cx,4
mov bp,0
s0:
mov ah,0
mov al,ds:[di]
mov [bp],ax
inc bp
inc di
loop s0
mov dh,2 ;起始行数
add dh,bl ;行数
mov dl,23 ;23列
mov cl,2 ;颜色
call show_str
pop cx
inc bx
loop dd_data0
;=================收入=================
mov di,84;读取数据的起始位置
mov bx,0 ;行数
mov cx,21;循环次数
dd_data:
push cx
mov ax,[di]
mov dx,[di+2] ;赋值
call dtoc
mov dh,2
add dh,bl
mov dl,33 ;33列
mov cl,2
call show_str
pop cx
add di,4 ;单位dd
inc bx
loop dd_data
;===============雇员=================
mov di,168;读取数据的起始位置
mov bx,0 ;行数
mov cx,21 ;循环次数
dd_data1:
push cx
mov dx,0 ;赋值,dx清零
mov ax,[di]
call dtoc
mov dh,2
add dh,bl
mov dl,43 ;43列
mov cl,2
call show_str
pop cx
add di,2 ;单位dw
inc bx
loop dd_data1
;===============平均数=================[84]/[168]
mov di,84 ;读取被除数数据的起始位置
mov si,168;读取除数数据的起始位置
mov bx,0 ;行数
mov cx,21 ;循环次数
dd_data2:
push cx
mov ax,[di]
mov dx,[di+2] ;赋值
div word ptr [si] ;被除数
mov dx,0 ;得到结果,转换输出
call dtoc
mov dh,2
add dh,bl
mov dl,53 ;53列
mov cl,2
call show_str
pop cx
add di,4 ;单位dd
add si,2 ;单位dw
inc bx
loop dd_data2
mov ax,4c00h
int 21h
;数值显示---------------
dtoc:
push ax
push bx
push cx
push dx
push si
push bp
mov si,0
s1:
mov cx,10
call divdw
add cx,30h
push cx
add si,1 ;结果的数字个数
mov cx,ax
jcxz ok
jmp s1
ok:
mov bp,0 ;指向ds
mov cx,si ;数字个数
s2:
pop ax
mov [bp],al ;存到ds段内,用于调用显示子程序显示
inc bp
loop s2
mov byte ptr [bp],0
pop bp
pop si
pop dx
pop cx
pop bx
pop ax
ret
;除法子程序---------------
;参数: ax被除数低16位,dx被除数高16位,cx除数
;返回: ax被除数低16位,dx被除数高16位,cx余数
divdw:
push si
push di
mov di,ax ;将低16位ax暂存于bx
mov ax,dx ;将高16位进行除法运算
mov dx,0
div cx
mov si,ax ;将int(H/N)暂存于si
mov ax,di ;把低16位除法转换,此时dx存放的是高十六位除法时的余数
div cx
mov cx,dx ;将最终余数给cx
mov dx,si ;将结果高16位传dx,第十六位的除法商默认在ax中
pop di
pop si
ret
;显示子函数--------------
show_str:
push ax ;用al暂存颜色(cl中传递过来)
push bx ;存放行列计算后得到的显存起始地址[0~0f9f可以存放在一个16位寄存器中]
push cx ;jcxz使用
push bp ;指向字符串变量
mov ax,0b800h
mov es,ax ;定义显存段起始段地址
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;算出显示地址
mov bp,0 ;指向字符第一个位置
mov al,cl ;将字符属性存于al中
s:
mov ch,0
mov cl,[bp]
jcxz return ;判断字符为0时结束
mov ch,al
mov es:[bx],cx
add bp,1
add bx,2
jmp s
return:
pop bp
pop cx
pop bx
pop ax
ret ;返回主程序
code ends
end start
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,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32 ;栈存放计算后的数字
;=================年份=================
mov di,0 ;读取数据的起始位置
mov bx,0 ;行数
mov cx,21;循环次数
dd_data0:
push cx
mov cx,4
mov bp,0
s0:
mov ah,0
mov al,ds:[di]
mov [bp],ax
inc bp
inc di
loop s0
mov dh,2 ;起始行数
add dh,bl ;行数
mov dl,23 ;23列
mov cl,2 ;颜色
call show_str
pop cx
inc bx
loop dd_data0
;=================收入=================
mov di,84;读取数据的起始位置
mov bx,0 ;行数
mov cx,21;循环次数
dd_data:
push cx
mov ax,[di]
mov dx,[di+2] ;赋值
call dtoc
mov dh,2
add dh,bl
mov dl,33 ;33列
mov cl,2
call show_str
pop cx
add di,4 ;单位dd
inc bx
loop dd_data
;===============雇员=================
mov di,168;读取数据的起始位置
mov bx,0 ;行数
mov cx,21 ;循环次数
dd_data1:
push cx
mov dx,0 ;赋值,dx清零
mov ax,[di]
call dtoc
mov dh,2
add dh,bl
mov dl,43 ;43列
mov cl,2
call show_str
pop cx
add di,2 ;单位dw
inc bx
loop dd_data1
;===============平均数=================[84]/[168]
mov di,84 ;读取被除数数据的起始位置
mov si,168;读取除数数据的起始位置
mov bx,0 ;行数
mov cx,21 ;循环次数
dd_data2:
push cx
mov ax,[di]
mov dx,[di+2] ;赋值
div word ptr [si] ;被除数
mov dx,0 ;得到结果,转换输出
call dtoc
mov dh,2
add dh,bl
mov dl,53 ;53列
mov cl,2
call show_str
pop cx
add di,4 ;单位dd
add si,2 ;单位dw
inc bx
loop dd_data2
mov ax,4c00h
int 21h
;数值显示---------------
dtoc:
push ax
push bx
push cx
push dx
push si
push bp
mov si,0
s1:
mov cx,10
call divdw
add cx,30h
push cx
add si,1 ;结果的数字个数
mov cx,ax
jcxz ok
jmp s1
ok:
mov bp,0 ;指向ds
mov cx,si ;数字个数
s2:
pop ax
mov [bp],al ;存到ds段内,用于调用显示子程序显示
inc bp
loop s2
mov byte ptr [bp],0
pop bp
pop si
pop dx
pop cx
pop bx
pop ax
ret
;除法子程序---------------
;参数: ax被除数低16位,dx被除数高16位,cx除数
;返回: ax被除数低16位,dx被除数高16位,cx余数
divdw:
push si
push di
mov di,ax ;将低16位ax暂存于bx
mov ax,dx ;将高16位进行除法运算
mov dx,0
div cx
mov si,ax ;将int(H/N)暂存于si
mov ax,di ;把低16位除法转换,此时dx存放的是高十六位除法时的余数
div cx
mov cx,dx ;将最终余数给cx
mov dx,si ;将结果高16位传dx,第十六位的除法商默认在ax中
pop di
pop si
ret
;显示子函数--------------
show_str:
push ax ;用al暂存颜色(cl中传递过来)
push bx ;存放行列计算后得到的显存起始地址[0~0f9f可以存放在一个16位寄存器中]
push cx ;jcxz使用
push bp ;指向字符串变量
mov ax,0b800h
mov es,ax ;定义显存段起始段地址
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;算出显示地址
mov bp,0 ;指向字符第一个位置
mov al,cl ;将字符属性存于al中
s:
mov ch,0
mov cl,[bp]
jcxz return ;判断字符为0时结束
mov ch,al
mov es:[bx],cx
add bp,1
add bx,2
jmp s
return:
pop bp
pop cx
pop bx
pop ax
ret ;返回主程序
code ends
end start
评论次数(4) |
浏览次数(1063) |
类型(汇编作业) |
收藏此文 |