|
主题 : : 试验九终于独立完成,请大家评审! [待解决] |
回复[ 10次 ]
点击[ 366次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-07-21 23:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
代码:
;b800:780H----------b800:81FH
assume cs:codesg
data segment
db 'welcome to masm!'
data ends
codesg segment
;0000
send:
mov ah, 4cH
int 21H
;0004
sgreen: ;green
nop
nop
mov bp, offset sgreen
mov si, bp
mov di, offset ssgreen
mov ax, cs:[di]
mov cs:[si], ax
mov ah, 02H
jmp s0
;nop
;0019
ssgreen:
jmp send
;001b
sgr: ;green background red
nop
nop
mov bp, offset sgr
mov si, bp
mov di, offset ssgr
mov ax, cs:[di]
mov cs:[si], ax
mov ah, 24H
jmp s0
;nop===
;0030
ssgr:
jmp sgr
;0032
swb: ;white background black
nop
nop
nop
nop
;0036
mov bp, offset swb
mov si, bp
mov di, offset sswb
mov ax, cs:[di]
mov cs:[si], ax
mov ah, 70H
jmp s0
;nop===
;0049
sswb:
jmp swb ;25 bytes
;004b
s0:
mov bx, data
mov es, bx
mov bx, 0b800H
mov ds, bx
mov bx, 780H
mov cx, 16
mov si, 0
;005e
s:
mov al, es:[si]
mov [bx], ax
inc si
add bx, 2
loop s
;0069
jmp bp
codesg ends
end swb | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-07-22 12:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-07-22 22:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
谢谢鼓励,今天发现我忽然发现我的实现好龟毛噢,经过改动变成下面模样了:
;b800:780H----------b800:81FH
assume cs:codesg
data segment
db 'welcome to masm!'
data ends
codesg segment
;0000
send:
mov ah, 4cH
int 21H
;0004
sgreen: ;green
mov bp, offset send
mov ah, 02H
jmp s0
;nop
;000C
sgr: ;green background red
mov bp, offset sgreen
mov ah, 24H
jmp s0
;nop===
;0014
swb: ;white background black
mov bp, offset sgr
mov ah, 70H
jmp s0
;nop===
;001C
s0:
mov bx, data
mov es, bx
mov bx, 0b800H
mov ds, bx
mov bx, 780H
mov cx, 16
mov si, 0
;002F
s:
mov al, es:[si]
mov [bx], ax
inc si
add bx, 2
loop s
;003A
jmp bp
codesg ends
end swb | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-07-22 22:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
|
|
|
|
|
[第4楼]
[ 回复时间:2010-07-22 23:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
晕 看坛子里的帖子 怎么好像重点在计算屏幕的中间位置了 和我想的不同呀 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-07-23 10:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
晕 看坛子里的帖子 怎么好像重点在计算屏幕的中间位置了 和我想的不同呀
------------------
回复:知道了0B800区域结构原理 ,写起屏来,游刃有馀。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-07-23 14:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
由于字符串数据长16字节,每个字符其对应的ascii码和字符属性在显示缓冲区中各占一个字节,故共占32个字节,远小于一页总共能显示的4000个字节,故在此只需选择第0页来显示所需显示的字符串。在第0页中,共25行,每行80个字符,由于每个字符对应的在显示缓冲区各占一个字节,故每行共160个字节。要显示的字符串在显示缓冲区分别以3种不同的颜色属性显示,那就需3行来显示,即分别位于第11,12,13行,且题目中要求显示的字符串位于屏幕中央,即位于上述三行中每行的64~95字节处。在本程序中,上述三行的段地址用es表示,由题可知(es)=0B800h,第十一行开始处的偏移地址为第0行开始处的偏移地址加上中间11行的长度,即0000h+11*160=06E0h,用bx表示。另外字符串位于每行的64~95字节处,则第64字节离每行起始处的距离为40h,由于每个字符串从第64字节处占2个字节,因此用变量di每次循环加2,共循环16次,遍历这段存储空间。另外这三行中每行字符串对应位置相差160个字节,因此把(bx)+160就会切换到下一行。可知外循环为3次循环,在每行之间切换,内循环为16次循环,在每行中,将要显示的字符串中的每个字符的ascii码和对应的颜色属性分别传送到显示缓冲区中的第11,12,13行中的64~95字节处。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-07-23 20:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
晕 看坛子里的帖子 怎么好像重点在计算屏幕的中间位置了 和我想的不同呀
------------------
回复:知道了0B800区域结构原理 ,写起屏来,游刃有馀。
------------------
回复:
哈哈 masmaster说话总是短小精炼 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-07-23 20:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
|
|
|
|
|
[第9楼]
[ 回复时间:2010-07-23 21:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
谢谢6楼老大的这么耐心,受益了
------------------
回复:呵呵, 不大会说话。 | | |
|
|
|
|
[第10楼]
[ 回复时间:2010-08-15 11:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-13 23:10 |
|