- [cutebe] 相当牛,这个苦思冥想也值了。^_^ 11/30 00:00
- [parse] 如果忽略消息循环,那么操作系统加载的程序很快就执行完了,就像DOS程序一闪而过,所以CPU会空闲下来 06/30 09:04
- [游客] 楼主好厉害,挺一下! 01/19 08:43
- [游客] 很不错。 01/04 18:36
- [chinatree] 潜力贴留名,沙发。 11/08 12:58
- [youthangel] 恩,这次对了 10/30 18:56
- [fpamc] mov bx,18 在这条指令的上边是不是要加一条sub dx,dx? 10/30 10:03
- [fpamc] 对的 10/27 11:19
- [fpamc] 对的 10/27 09:00
- [fpamc] 哦,对不起,看错了。实验13也有一个7ch中断 10/27 08:52
- [游客] 现在急需一个汇编大作业。。。。。。可以么。。。。。如果今天之内看见留言 就加 1765496715 12/28 16:52
- [youthangel] 这算是对我学习的鼓励吗?谢谢!咱们这样交流就可以了 10/11 15:48
- [fpamc] 多日观察,你的学习积极性挺高的。可以来我们群了。群号:75916434 10/11 10:58
[2013-03-11 19:18] 课程设计一(修改)
;#mode=dos
assume cs:code,ds:data,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989', '1990','1991','1992','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
table segment
db 21 dup('year summ ne ?? ')
table ends
stack segment
dw 16 dup(0)
stack ends
temp segment
dw 16 dup(0)
temp ends
code segment
start:
mov ax,temp
mov ax,table
mov es,ax
mov di,0;destination
mov ax,data
mov ds,ax
mov bx,0
mov si,168;source
mov ax,stack
mov ss,ax
mov sp,32
call calc;calculate
call clear;clear screen
call show;show resourt
mov ah,0
int 16h
mov ax,4c00h
int 21h
;--------------------------------------
;
;--------------------------------------
show:
push ax
push bx
push cx
push dx
push ds
push si
push di
mov bx,0
mov dh,2;行
mov cx,21
again:
mov ax,table
mov ds,ax
push cx
mov dl,4;列
mov ax,[bx]
call show_memory_str;显示字符串
add dl,2
mov ax,2[bx]
call show_memory_str;显示字符串,年份显示完毕
push dx
mov ax,5[bx]
mov dx,7[bx]
call dtoc
pop dx
mov ax,temp
mov ds,ax
mov si,0
add dl,18
mov cl,2;属性
call show_str;收入显示完毕
push dx
mov ax,table
mov ds,ax
mov ax,10[bx]
mov dx,0
call dtoc
pop dx
mov ax,temp
mov ds,ax
mov si,0
add dl,20
mov cl,2;属性
call show_str
push dx
mov ax,table
mov ds,ax
mov ax,13[bx]
mov dx,0
call dtoc
pop dx
mov ax,temp
mov ds,ax
mov si,0
add dl,20
mov cl,2;属性
call show_str
add bx,16
inc dh
pop cx
loop again
pop di
pop si
pop ds
pop dx
pop cx
pop bx
pop ax
ret
;--------------------------------------
;
;--------------------------------------
show_memory_str:
push ax
push es
push di
push dx
push ax
mov ax,0b800h
mov es,ax
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov di,ax
pop ax
mov ch,2
mov cl,al
mov es:[di],cx
add di,2
mov cl,ah
mov es:[di],cx
add di,2
pop dx
pop di
pop es
pop ax
ret
;--------------------------------------------------
;功能:把内存中的数转换成对应数值的ASCII
;--------------------------------------------------
dtoc:
push ax
push bx
push cx
push dx
push ds
mov bx,'$'
push bx
divagain:
call div32
push cx
mov cx,dx
jcxz dxzero
jmp short divagain
dxzero:
mov cx,ax
jcxz movetotemp
jmp short divagain
movetotemp:
mov ax,temp
mov ds,ax
mov bx,0
popagain:
pop cx
sub cx,'$'
jcxz retdtoc
add cx,'$'+30h
mov [bx],cl
inc bx
jmp short popagain
retdtoc:
mov cl,0
mov [bx],cl;flag
pop ds
pop dx
pop cx
pop bx
pop ax
ret
;功能解决32位除法溢出
;参数:被除数dxax
;返回:商dxax,余数cx
div32:
push bx
mov bx,10
push ax
push bx
mov ax,dx
mov dx,0
div bx;商在ax中,余数在dx中
mov cx,ax
pop bx
pop ax
div bx;商在ax中,余数在dx中
xchg cx,dx
pop bx
ret
;------------------------------------
;function:clear screen
;values:no
;return:no
;------------------------------------
clear:
push ds
push bx
push cx
push ax
mov ax,0b800h
mov ds,ax
mov bx,0
mov cx,25*80*2
mov al,0
s2:
mov [bx],al
add bx,2
loop s2
call setSursor;set sursor
pop ax
pop cx
pop bx
pop ds
ret
setSursor:
push ax
push bx
push dx
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
pop dx
pop bx
pop ax
ret
;功能在指定位置以指定格式显示字符,字符串结尾为 db 0
;参数: ds:si ,行dh,列dl,属性cl
;返回:无
show_str:
push ax
push es
push di
push dx
mov ax,0b800h
mov es,ax
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov di,ax
mov dl,cl
s0:
mov cl,[si]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:[di+1],dl
add di,2
inc si
jmp short s0
ok:
pop dx
pop di
pop es
pop ax
ret
;--------------------------------------
;function:calculate in memory
;values:data address
;return:data in table segment
;--------------------------------------
calc:
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov cx,21
s:
mov ax,[bx]
mov dx,[bx+2]
mov es:[di],ax
mov es:2[di],dx;年份
mov ax,84[bx]
mov dx,86[bx]
mov es:5[di],ax
mov es:7[di],dx;收入
div word ptr [si];计算
mov es:13[di],ax;平均
mov ax,[si]
mov es:10[di],ax;人数
add bx,4
add si,2
add di,10h
loop s
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
assume cs:code,ds:data,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989', '1990','1991','1992','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
table segment
db 21 dup('year summ ne ?? ')
table ends
stack segment
dw 16 dup(0)
stack ends
temp segment
dw 16 dup(0)
temp ends
code segment
start:
mov ax,temp
mov ax,table
mov es,ax
mov di,0;destination
mov ax,data
mov ds,ax
mov bx,0
mov si,168;source
mov ax,stack
mov ss,ax
mov sp,32
call calc;calculate
call clear;clear screen
call show;show resourt
mov ah,0
int 16h
mov ax,4c00h
int 21h
;--------------------------------------
;
;--------------------------------------
show:
push ax
push bx
push cx
push dx
push ds
push si
push di
mov bx,0
mov dh,2;行
mov cx,21
again:
mov ax,table
mov ds,ax
push cx
mov dl,4;列
mov ax,[bx]
call show_memory_str;显示字符串
add dl,2
mov ax,2[bx]
call show_memory_str;显示字符串,年份显示完毕
push dx
mov ax,5[bx]
mov dx,7[bx]
call dtoc
pop dx
mov ax,temp
mov ds,ax
mov si,0
add dl,18
mov cl,2;属性
call show_str;收入显示完毕
push dx
mov ax,table
mov ds,ax
mov ax,10[bx]
mov dx,0
call dtoc
pop dx
mov ax,temp
mov ds,ax
mov si,0
add dl,20
mov cl,2;属性
call show_str
push dx
mov ax,table
mov ds,ax
mov ax,13[bx]
mov dx,0
call dtoc
pop dx
mov ax,temp
mov ds,ax
mov si,0
add dl,20
mov cl,2;属性
call show_str
add bx,16
inc dh
pop cx
loop again
pop di
pop si
pop ds
pop dx
pop cx
pop bx
pop ax
ret
;--------------------------------------
;
;--------------------------------------
show_memory_str:
push ax
push es
push di
push dx
push ax
mov ax,0b800h
mov es,ax
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov di,ax
pop ax
mov ch,2
mov cl,al
mov es:[di],cx
add di,2
mov cl,ah
mov es:[di],cx
add di,2
pop dx
pop di
pop es
pop ax
ret
;--------------------------------------------------
;功能:把内存中的数转换成对应数值的ASCII
;--------------------------------------------------
dtoc:
push ax
push bx
push cx
push dx
push ds
mov bx,'$'
push bx
divagain:
call div32
push cx
mov cx,dx
jcxz dxzero
jmp short divagain
dxzero:
mov cx,ax
jcxz movetotemp
jmp short divagain
movetotemp:
mov ax,temp
mov ds,ax
mov bx,0
popagain:
pop cx
sub cx,'$'
jcxz retdtoc
add cx,'$'+30h
mov [bx],cl
inc bx
jmp short popagain
retdtoc:
mov cl,0
mov [bx],cl;flag
pop ds
pop dx
pop cx
pop bx
pop ax
ret
;功能解决32位除法溢出
;参数:被除数dxax
;返回:商dxax,余数cx
div32:
push bx
mov bx,10
push ax
push bx
mov ax,dx
mov dx,0
div bx;商在ax中,余数在dx中
mov cx,ax
pop bx
pop ax
div bx;商在ax中,余数在dx中
xchg cx,dx
pop bx
ret
;------------------------------------
;function:clear screen
;values:no
;return:no
;------------------------------------
clear:
push ds
push bx
push cx
push ax
mov ax,0b800h
mov ds,ax
mov bx,0
mov cx,25*80*2
mov al,0
s2:
mov [bx],al
add bx,2
loop s2
call setSursor;set sursor
pop ax
pop cx
pop bx
pop ds
ret
setSursor:
push ax
push bx
push dx
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
pop dx
pop bx
pop ax
ret
;功能在指定位置以指定格式显示字符,字符串结尾为 db 0
;参数: ds:si ,行dh,列dl,属性cl
;返回:无
show_str:
push ax
push es
push di
push dx
mov ax,0b800h
mov es,ax
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov di,ax
mov dl,cl
s0:
mov cl,[si]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:[di+1],dl
add di,2
inc si
jmp short s0
ok:
pop dx
pop di
pop es
pop ax
ret
;--------------------------------------
;function:calculate in memory
;values:data address
;return:data in table segment
;--------------------------------------
calc:
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov cx,21
s:
mov ax,[bx]
mov dx,[bx+2]
mov es:[di],ax
mov es:2[di],dx;年份
mov ax,84[bx]
mov dx,86[bx]
mov es:5[di],ax
mov es:7[di],dx;收入
div word ptr [si];计算
mov es:13[di],ax;平均
mov ax,[si]
mov es:10[di],ax;人数
add bx,4
add si,2
add di,10h
loop s
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
评论次数(0) |
浏览次数(798) |
类型(汇编作业) |
收藏此文 |