. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计1终于完成了,不过就是字符的背景与前景颜色不知为什么有变化  [待解决] 回复[ 1次 ]   点击[ 223次 ]  
yoyo_alex_lw
[帖 主]   [ 发表时间:2010-03-10 21:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-10 00:20
assume cs:codesg,ds:datasg,ss:stacksg

datasg segment

;以下表示1975-1995年的21年
db '1975','1976','1977','1978','1979'
db '1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989'
db '1990','1991','1992','1993','1994'
db '1995'

;下面是21年的收入
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;下面是21年的员工数目
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800

db 100h dup(' ')

datasg ends




stacksg segment
db 100h dup(0)
stacksg ends

codesg segment
start:
 
 ;ds
        mov ax,datasg
        mov ds,ax
        
;es
        ;mov ax,table
        ;mov es,ax
        
;ss
        mov ax,stacksg
        mov ss,ax
        mov sp,100h
        

    call show_table
                
                

exit:
        mov ax,4c00h
        int 21h



;/*********************************************************************************************************/
;名称:show_table
;功能:将ds中的数据显示在屏幕上
;参数:
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
show_table:

        push ax
        push bx
        push cx
        push dx
        push si
        push di
        

        mov cx,21
        mov bx,0
        
        
st_r:
    
    mov si,290
        mov di,210
        
        ;年份        
        call get_year
        mov [di],ax
        mov [di+2],dx
        mov ax,di
        add ax,0ah
        mov di,ax
        
        ;收入
        call get_sr
        call dtoc
        call str_copy
        call str_len
        mov ax,di
        add ax,0ah
        mov di,ax
        
        
        
        ;雇员数
        call get_gy
        mov dx,0
        call dtoc
        call str_copy
        call str_len
        mov ax,di
        add ax,0ah
        mov di,ax
        
        
        ;人均收入
        call get_rjsr
        call dtoc
        call str_copy
        call str_len
        mov ax,di
        add ax,0ah
        mov di,ax
        mov ax,0
        mov [di],ax
        
        ;显示   
        push cx
        mov ax,bx
        add ax,10
        mov dh,al
        mov dl,16h
        mov cl,71h 
        
        mov si,210
        call show_str
        pop cx
        inc bx        
        
        loop st_r
                


    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax

        ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/






;/*********************************************************************************************************/
;名称:get_year
;功能:根据bx将年份存到ax,dx
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_year:
        push bx
        mov al,4
        mul bl
        mov bx,ax
        mov ax,[bx]
        mov dx,[bx+2]
        pop bx
        ret

;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/



;/*********************************************************************************************************/
;名称:get_sr
;功能:根据bx将收入存到ax,dx
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_sr:
        push bx
        mov al,4
        mul bl
        mov bx,ax
        mov ax,[bx+84]
        mov dx,[bx+86]
        pop bx
        ret

;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/


;/*********************************************************************************************************/
;名称:get_gy
;功能:根据bx将雇员数存到ax
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_gy:
        push bx
        mov al,2
        mul bl
        mov bx,ax
        mov ax,[bx+168]
        pop bx
        ret

;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/


;/*********************************************************************************************************/
;名称:get_rjsr
;功能:根据bx计算雇员的人均收入到ax
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_rjsr:
        push bx
        push dx
        push cx
        call get_sr
        mov cx,ax
        call get_gy
        mov bx,ax
        mov ax,cx
        div bx 
        pop cx
        pop dx
        pop bx
        ret

;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/





;/*********************************************************************************************************/
;名称:str_copy
;功能:将si的字符串拷贝到di,读到0,就结束拷贝,不拷贝0,
;参数:
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
str_copy:
        push si
        push di
        push cx
        
        mov ch,0
copyc:
        mov cl,        [si]
        jcxz cnext
        mov [di],cl
        inc di
        inc si
        jmp short copyc
        
cnext:        
        pop cx
        pop di        
        pop si
        ret

;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/


;/*********************************************************************************************************/
;名称:str_len
;功能:通过ax返回ds:si的字符串的长度,不包含0字符
;参数:
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
str_len:
        push si
        push cx
        mov ch,0
        mov ax,0
len_r:
        mov cl,[si]
        jcxz len_out
        inc ax
        inc si
        jmp short len_r
len_out:
        pop cx
        pop si
        ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/






;/*********************************************************************************************************/
;名称:show_str
;功能:在指定位置、颜色、显示一个以0结束的字符串
;参数:(dh)=row,(dl)=col,(cl)=char_attr,(ds:si)=str_addr
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
show_str:

        
;设置显存段地址到es
        push es
        push ax
        mov ax,0b800h
        mov es,ax
        
        
;计算显示字符的偏移地址,存储到di
        push bp
;计算行偏移
        mov al,0a0h
        mul dh
        mov bp,ax
;计算列偏移
        mov ax,2
        mul dl    
        add ax,bp
        mov bp,ax
        
;al保存字符属性
        mov al,cl 
        mov ah,0
;显示字符
        push cx
        mov ch,0
        push si
show_str_r:
        mov cl,[si]
        jcxz fret
        mov es:[bp],cl
        mov es:[bp+1],al
        inc si
        mov ax,bp
        add ax,2
        mov bp,ax
        jmp short show_str_r
        
fret:
        pop si
        pop cx
        pop bp
        pop ax
        pop es        
fexit:        
        ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/


        
;/*********************************************************************************************************/        
;名称:div_dw
;功能:不产生溢出的(32)/(16)除法运算
;参数:ax=低16为被除数、dx=高16位被除数、cx=除数
;返回:ax=低位商、dx=高位商、cx=余数
;公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
;/*********************************************************************************************************/
;/*********************************************************************************************************/
div_dw:
        
;先算高16位商,缓存低16位(ax)
        push bx
        mov bx,ax
        
        mov ax,dx
        mov dx,0
        div cx
;缓存高16位结果        
        push ax
;计算低16位结果        
        mov ax,bx
        div cx

;返回结果        
        mov cx,dx
        pop dx
;现场恢复        
        pop bx
        
        ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/


;/*********************************************************************************************************/        
;名称:dtoc
;功能:将word数据转为10进制表示的字符串,字符串以0结束        
;参数:ax存储dword低16位数据,dx存储高16位数据
;返回:ds:si存储字符串的首地址
;/*********************************************************************************************************/
;/*********************************************************************************************************/
dtoc:
        push ax
        push bx
        push cx
        push dx
        push si
        
        mov bx,0
dtocr:
        mov cx,10
        call div_dw
        inc bx        
        push cx
        mov cx,dx
        jcxz fout
        jmp short dtocr
fout:
        mov cx,ax
        jcxz fout1
        jmp short dtocr        
fout1:
        mov cx,bx
dtocr0:
        pop ax
        add al,30h
        mov [si],al
        inc si
        loop dtocr0
        
        mov [si],cx
        
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        
        ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/        
        
        
codesg ends
end start
scuzg
[第1楼]   [ 回复时间:2010-03-12 09:48 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
字符显示模式的显示屏幕是一个 80 列、25 行的“网格”,每个网格对应两个字节单元,其中偶数字节单元用于存放要显示字符的ASC码,紧接其后的基数字节单元存放前一个字符要求的显示属性。
    字符显示属性字节的低 4 位为前景色,即字符的颜色,一共可以有 16 种颜色;属性字节高 4 位的低 3 位为背景色,即背景可以有 7 种选择;属性字节的最高位决定指定的字符是否闪烁: 0 为正常显示,1 则闪烁显示。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved