|
主题 : : 实验9 作业,思路 [待解决] |
回复[ 3次 ]
点击[ 285次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-04-12 05:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-11 03:39 |
程序使用双循环,第一层循环3行,第二层循环16个字符
中间使用栈保存cx值
es保存显示缓存区第1页的段地址
第一层中: (循环3次)
bp保存当前行在显示缓存区的偏移 (12~14行,即11*80*2, +80*2, +80*2)
bx保存当前行的字体样式地址 ds:[bx] (三种样式为:00000010b,00100100b,01110001b)
第二层中: (循环16次)
ah读取字体样式(mov ah,[bx])
si保存当前字符地址 ds:[si]
di保存字符要输出的位置在行中的列偏移 (32~47列,即32*2, +2, +2, ...)
----------------------
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 8 dup(0)
stacksg ends
datasg segment
db 'welcome to masm!'
db 00000010b,00100100b,01110001b
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,0b800h
mov es,ax
mov cx,3
mov bx,16
mov bp,1760
row:
push cx
mov ah,[bx]
mov cx,16
mov si,0
mov di,64
column:
mov al,[si]
mov es:[bp+di],ax
inc si
add di,2
loop column
inc bx
add bp,160
pop cx
loop row
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-04-14 16:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
|
|
|
|
|
[第2楼]
[ 回复时间:2009-04-17 09:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-17 09:51 |
assume cs:code
data segment
db 'Welcome to masm!'
db 00000010b,00100100b,01110001b;表示绿色,绿底红色,白底蓝色
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov bp,780h;屏幕中间的一行,即第13行,160*13=1920d
mov si,0
mov di,0
mov cx,3
s:
push cx
mov ah,10h[si];ah存放显示字符的属性
mov cx,10h;要复制的字符有16个0
s0:
mov al,[bx];
mov es:[bp+20h+di],ax
inc bx
add di,2
loop s0
mov bx,0;下一轮还是从DS的第一个字符开始复制
mov di,0
inc si;下一个要显示字符的属性
add bp,20h
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
我在中间一行显示连续的三串字符串,也算对的吧? | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-04-17 09:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-17 09:51 |
mov cx,10h;要复制的字符有16个,后面多打了一个0字 | | |
|