- [835984286] 就是结果没问题,不知道有没有潜在的错误 09/18 23:03
- [835984286] 下载个dosbox效果不错 谁给个dos系统的iso给我呀,我也想装个dos虚拟机 邮箱:835 09/18 22:57
- [tily] dos环境是怎样配置的, 我的博文里有详细说明 09/18 13:55
- [stqcw] 你的这个 dos环境是怎样配置的 我在xp里面装的是masm615 但老是有问题 按下A键不松开 09/18 13:34
- [stqcw] 你的这个 dos环境是怎样配置的 我在xp里面装的是masm615 但老是有问题 按下A键不松开 09/18 13:32
- [chinatree] 貌似没有什么问题呀? 09/15 11:54
- [835984286] 最好能把缓冲区(键盘)的a字符给删掉就好了】 09/15 03:27
- [835984286] 那你也在虚拟模式试试呀,看看能不能解决 09/14 01:39
- [chinatree] 你改过之后应该能看到,退出后可能会被系统改回来,我在虚拟机下可以,保护模式下没试过 09/13 19:47
- [chinatree] 你改过之后应该能看到,退出后可能会被系统改回来 09/13 19:47
[2011-09-03 19:17] 程序设计一程序有没有错误的地方呀大家检查检查
assume cs:code
date 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,2391,81111,161111,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
date ends
temp segment
db 16 dup (0)
temp ends
stack segment
db 160 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,160
mov ax,date
mov es,ax
mov bp,0
mov ax,temp
mov ds,ax
mov si,0
mov cx,21
mov dh,3
;***************************************************显示年份
year:
inc dh
push dx
mov ax,es:[bp]
mov dx,es:[bp+2]
mov ds:[si],ax
mov ds:[si+2],dx
mov byte ptr ds:[si+4],0
pop dx
push cx
mov dl,08h
mov cl,2
call show_str
add bp,4
pop cx
loop year
;************************************************************显示总收入
mov si,0
mov cx,21
mov dl,20
mov dh,4
gent:
push cx
push dx
mov ax,es:[bp]
mov dx,es:[bp+2]
call dwtoc
add bp,4
pop dx
mov cl,2
call show_str
inc dh
pop cx
loop gent
;**************************************************************显示人数
mov si,0
mov cx,21
mov dl,35
mov dh,4
num:
push cx
push dx
mov ax,es:[bp]
call wtoc
add bp,2
pop dx
mov cl,2
call show_str
inc dh
pop cx
loop num
;*******************************************************************显示平均收入
mov bp,0
mov cx,21
mov si,0
mov dl,45
mov dh,4
aver:
push cx
push dx
mov ax,es:[bp+84]
mov dx,es:[bp+86]
mov cx,es:[bx+168]
call divdw
call dwtoc
add bp,4
add bx,2
pop dx
mov cl,2
call show_str
inc dh
pop cx
loop aver
mov ax,4c00h
int 21h
;*******************************************************************************子函数
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示以0结尾的字符串
;参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:
push ax
push es
push bp
push dx
push cx
push si ;保存相关寄存器
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov dh,0
add ax,dx
add ax,dx
mov bp,ax ;设置字符串在显存的初始偏移地址es:bp
mov ah,cl
show_str_copy:
mov al,ds:[si]
mov cl,al
mov ch,0
jcxz show_str_retur
mov es:[bp],ax
add bp,2
inc si
jmp short show_str_copy ;将ds:si中的字符串复制到es:bp对应的显存中,复制以0为结束标志
show_str_retur:
pop si
pop cx
pop dx
pop bp
pop es
pop ax
ret
;***************************************************************************子函数
;名称:dwtoc
;功能:将dword型数据转换成ascii码十进制的字符串,字符串末尾以0结束
;参数:dx=dword高16位,ax=dword低16位,ds:si指向字符串首地址
;返回:无
dwtoc:
push dx
push ax
push cx
push si
push di
push bx
push bp
mov bp,0 ;保存相关寄存器,设置bp为计数寄存器
dwtoc_s1:
mov cx,10
mov di,dx
mov bx,ax
mov ax,dx
mov dx,0
div cx ;ax=商,dx=余数
mov di,ax ;int(H/N)=di
mov ax,bx
div cx ;ax=商,dx=余数
mov cx,dx ;将余数复制到cx中
mov dx,di ;防止溢出的除法,dx为商高16,ax为商的低16位
push cx ;将余数压入栈中
mov cx,ax
inc bp ;计数器
jcxz dwtoc_s2 ;判断商的低16是否为0
jmp short dwtoc_s1
dwtoc_s2:
mov cx,dx
jcxz dwtoc_s3 ;判断商的高16是否为0
jmp short dwtoc_s1
dwtoc_s3:
mov cx,bp ;设置dwtoc_s的循环次数
dwtoc_s: ;将每步余数复制到ds:si中
pop ax
add al,30h
mov ds:[si],al
inc si
loop dwtoc_s
dwtoc_s4:
mov ds:[si],cl ;将0复制到字符串末尾
pop bp
pop bx
pop di
pop si
pop cx
pop ax
pop dx
ret
;*********************************************************子函数
;名称:wtoc
;功能:将word数据转换为十ascii码以0结尾字符串
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
wtoc:
push dx
push cx
push si
push bp
mov bp,0 ;设置计数器
wtoc_s2:
mov dx,0 ;高16位清零
mov cx,10
div cx
push dx ;将余数压栈
inc bp ;计数器
mov cx,ax
jcxz wtoc_s1 ;判断商是否0
jmp short wtoc_s2
wtoc_s1:
mov cx,bp
wtoc_s3:
pop ax
add al,30h
mov ds:[si],al
inc si
loop wtoc_s3
wtoc_s4:
mov ds:[si],ch
pop bp
pop si
pop cx
pop dx
ret
;*******************************************************
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,
;除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16为
; (cx)=余数
divdw:
push di
push si ;保存相关寄存器与栈中
mov di,ax ;低16位L暂存di中
mov si,dx ;高16为H暂存si中
mov ax,dx
mov dx,0 ;计算高位
div cx ;计算int(H/N)结果在ax中,rem(H/N)结果在dx中
mov si,ax ;释放寄存器ax,(si)=int(H/N),商存于si中
mov ax,di ;计算[rem(H/N)*65536+L]
div cx ;计算[rem(H/N)*65536+L]/N,结果int在ax中rem在dx中
mov cx,dx ;余数存于cx中
mov dx,si ;高位除的商复制到dx中
pop si
pop di ;相关寄存器出栈
ret
code ends
end start
date 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,2391,81111,161111,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
date ends
temp segment
db 16 dup (0)
temp ends
stack segment
db 160 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,160
mov ax,date
mov es,ax
mov bp,0
mov ax,temp
mov ds,ax
mov si,0
mov cx,21
mov dh,3
;***************************************************显示年份
year:
inc dh
push dx
mov ax,es:[bp]
mov dx,es:[bp+2]
mov ds:[si],ax
mov ds:[si+2],dx
mov byte ptr ds:[si+4],0
pop dx
push cx
mov dl,08h
mov cl,2
call show_str
add bp,4
pop cx
loop year
;************************************************************显示总收入
mov si,0
mov cx,21
mov dl,20
mov dh,4
gent:
push cx
push dx
mov ax,es:[bp]
mov dx,es:[bp+2]
call dwtoc
add bp,4
pop dx
mov cl,2
call show_str
inc dh
pop cx
loop gent
;**************************************************************显示人数
mov si,0
mov cx,21
mov dl,35
mov dh,4
num:
push cx
push dx
mov ax,es:[bp]
call wtoc
add bp,2
pop dx
mov cl,2
call show_str
inc dh
pop cx
loop num
;*******************************************************************显示平均收入
mov bp,0
mov cx,21
mov si,0
mov dl,45
mov dh,4
aver:
push cx
push dx
mov ax,es:[bp+84]
mov dx,es:[bp+86]
mov cx,es:[bx+168]
call divdw
call dwtoc
add bp,4
add bx,2
pop dx
mov cl,2
call show_str
inc dh
pop cx
loop aver
mov ax,4c00h
int 21h
;*******************************************************************************子函数
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示以0结尾的字符串
;参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:
push ax
push es
push bp
push dx
push cx
push si ;保存相关寄存器
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov dh,0
add ax,dx
add ax,dx
mov bp,ax ;设置字符串在显存的初始偏移地址es:bp
mov ah,cl
show_str_copy:
mov al,ds:[si]
mov cl,al
mov ch,0
jcxz show_str_retur
mov es:[bp],ax
add bp,2
inc si
jmp short show_str_copy ;将ds:si中的字符串复制到es:bp对应的显存中,复制以0为结束标志
show_str_retur:
pop si
pop cx
pop dx
pop bp
pop es
pop ax
ret
;***************************************************************************子函数
;名称:dwtoc
;功能:将dword型数据转换成ascii码十进制的字符串,字符串末尾以0结束
;参数:dx=dword高16位,ax=dword低16位,ds:si指向字符串首地址
;返回:无
dwtoc:
push dx
push ax
push cx
push si
push di
push bx
push bp
mov bp,0 ;保存相关寄存器,设置bp为计数寄存器
dwtoc_s1:
mov cx,10
mov di,dx
mov bx,ax
mov ax,dx
mov dx,0
div cx ;ax=商,dx=余数
mov di,ax ;int(H/N)=di
mov ax,bx
div cx ;ax=商,dx=余数
mov cx,dx ;将余数复制到cx中
mov dx,di ;防止溢出的除法,dx为商高16,ax为商的低16位
push cx ;将余数压入栈中
mov cx,ax
inc bp ;计数器
jcxz dwtoc_s2 ;判断商的低16是否为0
jmp short dwtoc_s1
dwtoc_s2:
mov cx,dx
jcxz dwtoc_s3 ;判断商的高16是否为0
jmp short dwtoc_s1
dwtoc_s3:
mov cx,bp ;设置dwtoc_s的循环次数
dwtoc_s: ;将每步余数复制到ds:si中
pop ax
add al,30h
mov ds:[si],al
inc si
loop dwtoc_s
dwtoc_s4:
mov ds:[si],cl ;将0复制到字符串末尾
pop bp
pop bx
pop di
pop si
pop cx
pop ax
pop dx
ret
;*********************************************************子函数
;名称:wtoc
;功能:将word数据转换为十ascii码以0结尾字符串
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
wtoc:
push dx
push cx
push si
push bp
mov bp,0 ;设置计数器
wtoc_s2:
mov dx,0 ;高16位清零
mov cx,10
div cx
push dx ;将余数压栈
inc bp ;计数器
mov cx,ax
jcxz wtoc_s1 ;判断商是否0
jmp short wtoc_s2
wtoc_s1:
mov cx,bp
wtoc_s3:
pop ax
add al,30h
mov ds:[si],al
inc si
loop wtoc_s3
wtoc_s4:
mov ds:[si],ch
pop bp
pop si
pop cx
pop dx
ret
;*******************************************************
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,
;除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16为
; (cx)=余数
divdw:
push di
push si ;保存相关寄存器与栈中
mov di,ax ;低16位L暂存di中
mov si,dx ;高16为H暂存si中
mov ax,dx
mov dx,0 ;计算高位
div cx ;计算int(H/N)结果在ax中,rem(H/N)结果在dx中
mov si,ax ;释放寄存器ax,(si)=int(H/N),商存于si中
mov ax,di ;计算[rem(H/N)*65536+L]
div cx ;计算[rem(H/N)*65536+L]/N,结果int在ax中rem在dx中
mov cx,dx ;余数存于cx中
mov dx,si ;高位除的商复制到dx中
pop si
pop di ;相关寄存器出栈
ret
code ends
end start
评论次数(0) |
浏览次数(380) |
类型(汇编作业) |
收藏此文 |