|
2鱼币
本帖最后由 Push 于 2012-1-28 23:34 编辑
为什么发生这种情况嘞???????
图片链接:
http://b96.photo.store.qq.com/psb?/9c809da3-9034-4584-b91d-f735f02ecd08/JPw8dvZTN7sSoHOIjJSwdxoPppjaP2lL6bc6GEvSDkA!/b/YdD3OTkXNAAAYtejQTlkNAAA
- assume cs:code , ds:data , ss:stack
- ; 数据段
- data segment
- db '1975','1976','1977','1978','1979','1980','1981','1982','1983' ;第一个偏移值:0
- db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
- db '1993','1994','1995',0 ;最后一个偏移值:53H(83D)
- ;以上是表示21年的21个字符串
- data ends
- ; 栈段
- stack segment
- db 256 dup (?)
- stack ends
- ; 计算后的数据存放段
- table segment
- db 21 dup ('year sunm ne ?? ')
- dw 32 dup(?) ; 因为最后转换成字符串的空间不够,所以需要再多申请这么多空间
- table ends
- code segment
- start: mov ax,data
- mov ds,ax
- ;定义数据段
- mov ax,stack
- mov ss,ax
- mov sp,256
- ;定义栈段
- mov ax,table
- mov es,ax
- ;定义附加段
-
- mov si,0
- mov di,0
- mov bx,0
- ;初始化变址寄存器
-
- mov dh,8 ;8行
- mov dl,3 ;3列
- mov cl,2 ;绿色
- ;定义颜色和行列
- call show_ys
- ;调用子程序show_ys
-
- mov ax,4c00h
- int 21h
- ;子程序:show_ys
- ;功能:在指定的位置 , 用指定的颜色 , 显示一个用0结束的字符串
- ;参数:(dh) = 行号(取值范围0~24) , (dl) = 列号(取值范围0~79)
- ; (cl) = 颜色 , ds:si指向字符串首地址
- show_ys:
- push si
- ;保护数据
- dec dh
- ;因为计算机是从0开始读取的,所以这里要-1
- mov al,0A0h
- ;因为一行有160个字符,而换算16进制=0A0H
- mul dh
- ;乘完之后,ax中现在存放的是行的偏移地址
- mov si,ax
- ;把行复制给si
- mov al,2
- ;因为一个字符要存放2个字节,高字节存放颜色,低字节存放数据
- mul dl
- ;而这么乘完就知道了列数,而列数存放在ax中
- sub ax,2
- ;因为ax现在存放是列数,而一个字符要放2个字节,所以要把光标定位到0(偶字节)
- add si,ax
- ;此时si中存放的是行与列的偏移地址
- mov ax,0b800h
- mov es,ax
- ;把es段地址定义出来
- mov al,cl
- ;把颜色存放到al中
- mov ch,0
- s:
- mov cl,ds:[bx]
- ;把数据段的内容复制到cl中
- jcxz ok
- ;如果数据段中的那个0字符存放到
- mov es:[si],al
- ;把颜色存放到显存中存放字符串的高字节,也就是存放颜色的位置
- mov es:[si+1],cl
- ;把数据段的内容放到显存存放字符串的低字节,也就是存放数据的位置
- add si,2
- ;把显存的光标定位到第二个存放颜色的位置
- inc bx
- ;把DS中的光标定位到下一个字节处
- jmp short s
- ;循环中
- ok:
- pop si
- ret
- code ends
- end start
复制代码
|
|